用c语言写des加密算法(des加解密算法详解c语言)

2023-03-13 21:01:23 密语知识 思思

#include stdio.h #include string.h #include windows.h #include conio.h #include "Schedle.h" class CShift{ public: DWORDLONG mask[16]; int step[16]; CShift(){ for(int i=0;i16;i++){ step[i]=2; mask[i]=0xc000000; } step[0]=step[1]=step[8]=step[15]=1; mask[0]=mask[1]=mask[8]=mask[15]=0x8000000; } }; class CDES{ public: CDES(){ m_dwlKey=0; m_dwlData=0; ConvertTableToMask(dwlKey_PC_1,64); //PrintTable(dwlKey_PC_1,7,8); ConvertTableToMask(dwlKey_PC_2,56); ConvertTableToMask(dwlData_IP,64); ConvertTableToMask(dwlData_Expansion,32); ConvertTableToMask(dwlData_FP,64); ConvertTableToMask(dwlData_P,32); Generate_S(); } void PrintBit(DWORDLONG); void EncryptKey(char *); unsigned char* EncryptData(unsigned char *); unsigned char* DescryptData(unsigned char*); private: void ConvertTableToMask(DWORDLONG *,int); void Generate_S(void); void PrintTable(DWORDLONG*,int,int); DWORDLONG ProcessByte(unsigned char*,BOOL); DWORDLONG PermuteTable(DWORDLONG,DWORDLONG*,int); void Generate_K(void); void EncryptKernel(void); DWORDLONG Generate_B(DWORDLONG,DWORDLONG*); /*For verify schedule permutation only*/ DWORDLONG UnPermuteTable(DWORDLONG,DWORDLONG*,int); /**************************************/ DWORDLONG dwlData_S[9][4][16]; CShift m_shift; DWORDLONG m_dwlKey; DWORDLONG m_dwlData; DWORDLONG m_dwl_K[17]; }; void CDES::EncryptKey(char *key){ printf("\nOriginal Key: %s",key); m_dwlKey=ProcessByte((unsigned char*)key,TRUE); // PrintBit(m_dwlKey); m_dwlKey=PermuteTable(m_dwlKey,dwlKey_PC_1,56); // PrintBit(m_dwlKey); Generate_K(); // printf("\n******************************************\n"); } void CDES::Generate_K(void){ DWORDLONG C[17],D[17],tmp; C[0]=m_dwlKey28; D[0]=m_dwlKey0xfffffff; for(int i=1;i=16;i++){ tmp=(C[i-1]m_shift.mask[i-1])(28-m_shift.step[i-1]); C[i]=((C[i-1]m_shift.step[i-1])|tmp)0x0fffffff; tmp=(D[i-1]m_shift.mask[i-1])(28-m_shift.step[i-1]); D[i]=((D[i-1]m_shift.step[i-1])|tmp)0x0fffffff; m_dwl_K[i]=(C[i]28)|D[i]; m_dwl_K[i]=PermuteTable(m_dwl_K[i],dwlKey_PC_2,48); } } DWORDLONG CDES::ProcessByte(unsigned char *key,BOOL shift){ unsigned char tmp; DWORDLONG byte=0; int i=0; while(i8){ while(*key){ if(byte!=0) byte=8; tmp=*key; if(shift) tmp=1; byte|=tmp; i++; key++; } if(i8) byte=8; i++; } return byte; } DWORDLONG CDES::PermuteTable(DWORDLONG dwlPara,DWOR 基于des算法的rfid安全系统

DLONG* dwlTable,int nDestLen){ int i=0; DWORDLONG tmp=0,moveBit; while(inDestLen){ moveBit=1; if(dwlTable[i]dwlPara){ moveBit=nDestLen-i-1; tmp|=moveBit; } i++; } return tmp; } DWORDLONG CDES::UnPermuteTable(DWORDLONG dwlPara,DWORDLONG* dwlTable,int nDestLen){ DWORDLONG tmp=0; int i=nDestLen-1; while(dwlPara!=0){ if(dwlPara0x01) tmp|=dwlTable[i]; dwlPara=1; i--; } return tmp; } void CDES::PrintTable(DWORDLONG *dwlPara,int col,int row){ int i,j; for(i=0;irow;i++){ printf("\n"); getch(); for(j=0;jcol;j++) PrintBit(dwlPara[i*col+j]); } } void CDES::PrintBit(DWORDLONG bitstream){ char out[76]; int i=0,j=0,space=0; while(bitstream!=0){ if(bitstream0x01) out[i++]='1'; else out[i++]='0'; j++; if(j%8==0){ out[i++]=' '; space++; } bitstream=bitstream1; } out[i]='\0'; strcpy(out,strrev(out)); printf("%s **:%d\n",out,i-space); } void CDES::ConvertTableToMask(DWORDLONG *mask,int max){ int i=0; DWORDLONG nBit=1; while(mask[i]!=0){ nBit=1; nBit=max-mask[i]; mask[i++]=nBit; } } void CDES::Generate_S(void){ int i; int j,m,n; m=n=0; j=1; for(i=0;i512;i++){ dwlData_S[j][m][n]=OS[i]; n=(n+1)%16; if(!n){ m=(m+1)%4; if(!m) j++; } } } unsigned char * CDES::EncryptData(unsigned char *block){ unsigned char *EncrytedData=new unsigned char(15); printf("\nOriginal Data: %s\n",block); m_dwlData=ProcessByte(block,0); // PrintBit(m_dwlData); m_dwlData=PermuteTable(m_dwlData,dwlData_IP,64); EncryptKernel(); // PrintBit(m_dwlData); DWORDLONG bit6=m_dwlData; for(int i=0;i11;i++){ EncrytedData[7-i]=(unsigned char)(bit60x3f)+46; bit6=6; } EncrytedData[11]='\0'; printf("\nAfter Encrypted: %s",EncrytedData); for(i=0;i8;i++){ EncrytedData[7-i]=(unsigned char)(m_dwlData0xff); m_dwlData=8; } EncrytedData[8]='\0'; return EncrytedData; } void CDES::EncryptKernel(void){ int i=1; DWORDLONG L[17],R[17],B[9],EK,PSB; L[0]=m_dwlData32; R[0]=m_dwlData0xffffffff; for(i=1;i=16;i++){ L[i]=R[i-1]; R[i-1]=PermuteTable(R[i-1],dwlData_Expansion,48); //Expansion R EK=R[i-1]^m_dwl_K[i]; //E Permutation PSB=Generate_B(EK,B); //P Permutation R[i]=L[i-1]^PSB; } R[16]=32; m_dwlData=R[16]|L[16]; m_dwlData=PermuteTable(m_dwlData,dwlData_FP,64); } unsigned char* CDES::DescryptData(unsigned char *desData){ int i=1; unsigned char *DescryptedData=new unsigned char(15); DWORDLONG L[17],R[17],B[9],EK,PSB; DWORDLONG dataPara; dataPara=ProcessByte(desData,0); dataPara=PermuteTable(dataPara,dwlData_IP,64); R[16]=dataPara32; L[16]=dataPara0xffffffff; for(i=16;i=1;i--){ R[i-1]=L[i]; L[i]=PermuteTable(L[i],dwlData_Expansion,48); //Expansion L EK=L[i]^m_dwl_K[i]; //E Permutation PSB=Generate_B(EK,B); //P Permutation L[i-1]=R[i]^PSB; } L[0]=32; dataPara=L[0]|R[0]; dataPara=PermuteTable(dataPara,dwlData_FP,64); // PrintBit(dataPara); for(i=0;i8;i++){ DescryptedData[7-i]=(unsigned char)(dataPara0xff); dataPara=8; } DescryptedData[8]='\0'; printf("\nAfter Decrypted: %s\n",DescryptedData); return DescryptedData; } DWORDLONG CDES::Generate_B(DWORDLONG EKPara,DWORDLONG *block){ int i,m,n; DWORDLONG tmp=0; for(i=8;i0;i--){ block[i]=EKPara0x3f; m=(int)(block[i]0x20)4; m|=block[i]0x01; n=(int)(block[i]1)2; block[i]=dwlData_S[i][m][n]; EKPara=6; } for(i=1;i=8;i++){ tmp|=block[i]; tmp=4; } tmp=4; tmp=PermuteTable(tmp,dwlData_P,32); return tmp; } void main(void){ CDES des; des.EncryptKey("12345678"); unsigned char *result=des.EncryptData((unsigned char*)"DemoData"); des.DescryptData(result); }[1]

DES 加密算法解析

第一步是用密钥初始化des

初始化的过程主要是用传入的密钥生成16对长度为48的Kn 子密钥

生成48位子密钥Kn的函数主要是 __create_sub_keys , 主要设计两个换位表pc1和pc2

key = self.__permutate(des.__pc1, self.__String_to_BitList(self.getKey())) 开始先用换位表生成56位的初始key值(同pc1表的位数)

之后划分成两部分self.L和self.R各28位,然后是一个循环16此的左移操作,最后用pc2换位表生成第一个子密钥Kn[0]

我们传入数据调用encrypt函数即可, DES.encrypt('flag{isisisikey}') 我们先来看encrypt函数

encrypt函数主要调用了crypt函数,继续跟进crypt函数,开始一部分是cbc模式获取iv的过程,这里先暂时不考虑cbc,直接看关键部分

这里就设计到分组加密的核心了,为什么DES又叫分组加密,有一操作是 block = self.__String_to_BitList(data[i:i+8]) 把加密数据每八个字节分成一个block,然后调用 __String_to_BitList 会将八字节字符转换为64bit的二进制,每个block再调用 __des_crypt 函数加密

开始几步和子密钥生成函数类似,用一个ip换位表初始化block,然后划分成self,L和self.R 各32位。

之后又是一个16轮的计算,我们分析一下每轮操作

self.R = self.__permutate(des.__expansion_table, self.R) 利用一个扩展表将32bit扩展成48位,扩展表:

B = [self.R[:6], self.R[6:12], self.R[12:18], self.R[18:24], self.R[24:30], self.R[30:36], self.R[36:42], self.R[42:]] 将48位的self.R 分成6*8为,之后一个循环就是经典的是s-box的置换操作

s-box盒一个八个,m是前后2bit,n是中间6bit, v是s-box的(n,m)处的值

self.R = self.__permutate(des.__p, Bn) 是P-box置换盒。 最后返回64bit的processed_block, 经过BitList_to_String函数处理就变成8字节的字符流了,最后把每个block分组join一块就是最后的密文。

我们再来总结一下这个过程

子密钥生成算法

des 加密算法

附上完整版des加解密算法脚本

des解密算法,利用C语言解密JAVA语言加密的密码。。密钥为12345678,加密后的密文为:26d086be3a3a62fc

// C 语言 DES用的是 ECB模式, 没有填充

// 因此Java端要对应, 你的明文是 liubiao 吗?

// 另外 DES已经不安全了, 如果可以改为 3DES或者 AES吧。

public class LearnDes {

public static void main(String[] args) {

try {

System.out.println(encrypt("liubiao", "12345678"));

System.out.println(decrypt("26d086be3a3a62fc", "12345678"));

} catch (Exception e) {

e.printStackTrace();

}

}

public static String encrypt(String message, String key) throws Exception {

//Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");

Cipher cipher = Cipher.getInstance("DES/ECB/NOPADDING");

DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));

SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");

SecretKey secretKey = keyFactory.generateSecret(desKeySpec);

IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));

//cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);

cipher.init(Cipher.ENCRYPT_MODE, secretKey );

return toHexString(cipher.doFinal(message.getBytes("UTF-8")));

}

public static String decrypt(String message, String key) throws Exception {

byte[] bytesrc = convertHexString(message);

//Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");

Cipher cipher = Cipher.getInstance("DES/ECB/NOPADDING");

DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));

SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");

SecretKey secretKey = keyFactory.generateSecret(desKeySpec);

IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));

//cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);

cipher.init(Cipher.DECRYPT_MODE, secretKey );

byte[] retByte = cipher.doFinal(bytesrc);

return new String(retByte);

}

public static byte[] convertHexString(String ss) {

byte digest[] = new byte[ss.length() / 2];

for (int i = 0; i digest.length; i++) {

String byteString = ss.substring(2 * i, 2 * i + 2);

int byteValue = Integer.parseInt(byteString, 16);

digest[i] = (byte) byteValue;

}

return digest;

}

public static String toHexString(byte b[]) {

StringBuffer hexString = new StringBuffer();

for (int i = 0; i b.length; i++) {

String plainText = Integer.toHexString(0xff b[i]);

if (plainText.length() 2)

plainText = "0" + plainText;

hexString.append(plainText);

}

return hexString.toString();

}

}

DES加密算法C语言实现

/*********************************************************************/

/*-文件名:des.h */

/*- */

/*-功能: 实现DES加密算法的加密解密功能 */

/*********************************************************************/

typedef int INT32;

typedef char INT8;

typedef unsigned char ULONG8;

typedef unsigned short ULONG16;

typedef unsigned long ULONG32;

/*如果采用c++编译器的话采用如下宏定义

#define DllExport extern "C" __declspec(dllexport)

*/

#define DllExport __declspec(dllexport)

/*加密接口函数*/

DllExport INT32 DdesN(ULONG8 *data, ULONG8 **key, ULONG32 n_key,ULONG32 readlen);

DllExport INT32 desN(ULONG8 *data, ULONG8 **key, ULONG32 n_key,ULONG32 readlen);

DllExport INT32 des3(ULONG8 *data, ULONG8 *key,ULONG32 n ,ULONG32 readlen);

DllExport INT32 Ddes3(ULONG8 *data,ULONG8 *key,ULONG32 n ,ULONG32 readlen);

DllExport INT32 des(ULONG8 *data, ULONG8 *key,INT32 readlen);

DllExport INT32 Ddes(ULONG8 *data,ULONG8 *key,INT32 readlen);

*********************************************************************/

/*-文件名:des.c */

/*- */

/*-功能: 实现DES加密算法的加密解密功能 */

//*********************************************************************/

#include stdlib.h

#include stdio.h

#include string.h

#include memory.h

#include malloc.h

#include "des.h"

#define SUCCESS 0

#define FAIL -1

#define READFILESIZE 512

#define WZ_COMMEND_NUM 4

#define WZUSEHELPNUM 19

#define DESONE 1

#define DESTHREE 2

#define DESMULTI 3

INT8 *WZ_Commend_Help[] =

{

"基于DES的加密解密工具v1.0 ",/*0*/

"追求卓越,勇于创新 ",

"----著者 : 吴真--- ",

" "

};

INT8 *WZ_USE_HELP[]={

"输入5+n个参数:",

"\t1.可执行文件名 *.exe",

"\t2.操作类型 1:一层加密;2:一层解密;",

"\t\t13:N层单密钥加密;23:N层单密钥解密;",

"\t\t39:N层多密钥加密;49:N层多密钥解密",

"\t3.读出数据的文件名*.txt",

"\t4.写入数据的文件名*.txt",

"\t5.密钥(8字节例如:wuzhen12)",

"\t[6].N层单密钥的层数或者...二层加密|解密密钥",

"\t[7].三层加密|解密密钥",

"\t[8]. ...",

"\t[N].N层加密|解密密钥",

"\t 例1: des 1 1.txt 2.txt 12345678",

"\t : des 2 2.txt 3.txt 12345678",

"\t 例2: des 13 1.txt 2.txt tiantian 5",

"\t : des 23 2.txt 3.txt tiantian 5",

"\t 例3: des 39 1.txt 2.txt 12345678 tiantian gaoxinma",

"\t : des 49 2.txt 3.txt 12345678 tiantian gaoxinma",

"******************************"

};

INT32 hextofile( ULONG8 *buf ,FILE *writefile, ULONG32 length);/*以16进制写入文件*/

INT32 encodehex(ULONG8 *tobuf,ULONG8 *frombuf,ULONG32 len);/*16进制解码*/

INT32 file_enc(FILE *readfile,FILE *writefile,

ULONG8 *key,ULONG32 keynum,

ULONG8 **superkey,ULONG32 n_superkey,

ULONG8 flag);

INT32 file_dec(FILE *readfile,FILE *writefile,

ULONG8 *key,ULONG32 keynum,

ULONG8 **superkey,ULONG32 n_superkey,

ULONG8 flag);

void wz_print_help();

INT32 main(INT32 argc,INT8 *argv[])

{

INT8 *FILENAME1,*FILENAME2;

FILE *fp, *fp2;

ULONG8 *key ;

ULONG8 **superkey ;/*n层加密解密密钥*/

ULONG8 n_superkey ;

ULONG32 num;

if ( argc = 5 (atoi(argv[1]) == 39 || atoi(argv[1]) == 49 ) )

{

n_superkey = argc - 4 ;

superkey = ( INT8 **)calloc(1, n_superkey*sizeof( void *) ) ;

for ( num = 0 ; num n_superkey ; num++)

{

superkey[num] = argv[4+num] ;

}

}

else if ( argc == 6 (atoi(argv[1]) == 13 || atoi(argv[1]) == 23 ) (atoi(argv[5])) 0)

{

}

else if ( argc == 5 ( atoi(argv[1]) == 1 || atoi(argv[1]) == 2 ))

{

}

else

{

wz_print_help();

return FAIL;

}

FILENAME1 = argv[2];

FILENAME2 = argv[3];

if ((fp= fopen(FILENAME1,"rb")) == NULL || (fp2 = fopen(FILENAME2,"wb"))==NULL)

{

printf("Can't open file\n");

return FAIL;

}

key = argv[4] ;

switch( atoi(argv[1] ))

{

case 1: /*加密*/

file_enc(fp,fp2,key,0, NULL,0, DESONE);

printf("\n \tDES 一层加密完毕,密文存于%s文件\n",FILENAME2);

break;

case 2:

file_dec(fp,fp2,key,0, NULL, 0,DESONE);

printf("\n \tDES 一层解密完毕,密文存于%s文件\n",FILENAME2);

break;

case 13:

file_enc(fp,fp2,key,atoi(argv[5]),NULL,0,DESTHREE);

printf("\n \tDES %u层单密钥加密完毕,密文存于%s文件\n",atoi(argv[5]),FILENAME2);

break;

case 23:

file_dec(fp,fp2,key,atoi(argv[5]),NULL,0,DESTHREE);

printf("\n \tDES %u层单密钥解密完毕,密文存于%s文件\n",atoi(argv[5]),FILENAME2);

break;

case 39:

file_enc(fp,fp2,NULL,0,superkey,n_superkey,DESMULTI);

printf("\n \tDES 多密钥加密完毕,密文存于%s文件\n",FILENAME2);

free(superkey);

superkey = NULL;

break;

case 49:

file_dec(fp,fp2,NULL,0,superkey,n_superkey,DESMULTI);

printf("\n \tDES 多密钥加密完毕,密文存于%s文件\n",FILENAME2);

free(superkey);

superkey = NULL;

break;

default:

printf("请选择是加密|解密 plese choose encrypt|deencrypt\n");

break;

}

fclose(fp);

fclose(fp2);

return SUCCESS;

}

void wz_print_help()

{

INT32 i ;

printf("\t");

for ( i = 0 ; i 22 ; i++)

{

printf("%c ",5);

}

printf("\n");

for( i = 0 ; i WZ_COMMEND_NUM ; i++)

{

printf("\t%c\t%s %c\n",5,WZ_Commend_Help[i],5);

}

printf("\t");

for ( i = 0 ; i 22 ; i++)

{

printf("%c ",5);

}

printf("\n");

for( i = 0 ; i WZUSEHELPNUM ; i++)

{

printf("\t%s\n",WZ_USE_HELP[i]);

}

return ;

}

INT32 file_enc(FILE *readfile,FILE *writefile,

ULONG8 *key,ULONG32 keynum,

ULONG8 **superkey,ULONG32 n_superkey,

ULONG8 flag)

{

INT32 filelen = 0,readlen = 0,writelen = 0;

ULONG32 totalfilelen = 0 ;/*统计实际的文件的长度*/

ULONG8 readbuf[READFILESIZE] = { 0 };

filelen = fread( readbuf, sizeof( INT8 ), READFILESIZE, readfile );

while( filelen == READFILESIZE )

{

totalfilelen += READFILESIZE;

switch(flag)

{

case DESONE:

des( readbuf,key,READFILESIZE);

break;

case DESTHREE:

des3( readbuf, key ,keynum,READFILESIZE);

break;

case DESMULTI:

desN( readbuf, superkey ,n_superkey,READFILESIZE);

break;

}

hextofile( readbuf, writefile, READFILESIZE );/*以16进制形式写入文件*/

memset(readbuf,0,READFILESIZE);

filelen = fread( readbuf, sizeof( INT8 ), READFILESIZE, readfile );

}

/*这是从文件中读出的最后一批数据,长度可能会等于0,所以要先判断*/

if ( filelen 0 )

{

/*如果从文件中读出的长度不等于0,那么肯定有8个字节以上的空间

文件长度存在最后8个字节中*/

totalfilelen += filelen;

memcpy( readbuf[READFILESIZE-8], (ULONG8*)totalfilelen,4);

switch(flag)

{

case DESONE:

des( readbuf,key,READFILESIZE);

break;

case DESTHREE:

des3( readbuf, key ,keynum,READFILESIZE);

break;

case DESMULTI:

desN( readbuf, superkey ,n_superkey,READFILESIZE);

break;

}

hextofile( readbuf, writefile,READFILESIZE );/*以16进制形式写入文件*/

memset(readbuf,0 ,READFILESIZE);

}

else /*filelen == 0*/

{

memcpy( readbuf[0], (ULONG8*)totalfilelen,4);

switch(flag)

{

case DESONE:

des( readbuf,key,8);

break;

case DESTHREE:

des3( readbuf, key ,keynum,8);

break;

case DESMULTI:

desN( readbuf, superkey ,n_superkey,8);

break;

}

hextofile( readbuf, writefile, 8);/*以16进制形式写入文件*/

}

return SUCCESS;

}

INT32 file_dec(FILE *readfile,FILE *writefile,

ULONG8 *key,ULONG32 keynum,

ULONG8 **superkey,ULONG32 n_superkey,

ULONG8 flag)

{

INT32 filelen = 0,readlen = 0,writelen = 0;

ULONG32 totalfilelen = 0 ;/*统计实际的文件的长度*/

INT32 num = 0;

ULONG8 readbuf[READFILESIZE] = { 0 };

ULONG8 sendbuf[READFILESIZE*2] = { 0 };

fseek(readfile,-16,SEEK_END);/*最后16个字节的表示文件长度的空间*/

filelen = fread( sendbuf, sizeof( INT8 ), 16, readfile );

encodehex( readbuf,sendbuf,8);

switch(flag)

{

case DESONE:

Ddes( readbuf,key,8);

break;

case DESTHREE:

Ddes3( readbuf, key ,keynum,8);

break;

case DESMULTI:

DdesN( readbuf, superkey ,n_superkey,8);

break;

}

/*解密*/

memcpy((ULONG8*)totalfilelen, readbuf[0],4);/*得到文件总长*/

memset(readbuf,0 ,8);

memset(sendbuf,0 ,16);

num = totalfilelen/READFILESIZE;/*有几个READFILESIZE组*/

totalfilelen %= READFILESIZE;

fseek(readfile,0,SEEK_SET);/*跳到文件头*/

while(num--)

{

filelen = fread( sendbuf, sizeof( INT8 ), READFILESIZE*2, readfile );

encodehex( readbuf,sendbuf,READFILESIZE);

switch(flag)

{

case DESONE:

Ddes( readbuf,key,READFILESIZE);

break;

case DESTHREE:

Ddes3( readbuf, key ,keynum,READFILESIZE);

break;

case DESMULTI:

DdesN( readbuf, superkey ,n_superkey,READFILESIZE);

break;

}

writelen = fwrite(readbuf, sizeof( INT8 ), READFILESIZE, writefile);

memset(readbuf,0 ,READFILESIZE);

memset(sendbuf,0 ,READFILESIZE*2);

}

if ( totalfilelen 0 )/*最后一块有多余的元素*/

{

filelen = fread( sendbuf, sizeof( INT8 ), READFILESIZE*2, readfile );

encodehex( readbuf,sendbuf,READFILESIZE);

switch(flag)

{

case DESONE:

Ddes( readbuf,key,READFILESIZE);

break;

case DESTHREE:

Ddes3( readbuf, key ,keynum,READFILESIZE);

break;

case DESMULTI:

DdesN( readbuf, superkey ,n_superkey,READFILESIZE);

break;

}

writelen = fwrite(readbuf, sizeof( INT8 ), totalfilelen, writefile);

memset(readbuf,0 ,READFILESIZE);

memset(sendbuf,0 ,READFILESIZE*2);

}

return SUCCESS;

}

INT32 hextofile( ULONG8 *buf ,FILE *writefile, ULONG32 length)

{

ULONG32 writelen = 0 ;

/*以16进制形式写入文件*/

while( writelen length)

{

if(buf[writelen] == 0)

{

fprintf( writefile, "%x", 0 );

fprintf( writefile, "%x", 0 );

}

else if (buf[writelen] 0x10)

{

fprintf( writefile, "%x", 0 );

fprintf( writefile, "%x", buf[writelen] );

}

else

{

fprintf( writefile, "%x", buf[writelen] );

}

writelen++;

}

return SUCCESS;

}

INT32 encodehex(ULONG8 *tobuf,ULONG8 *frombuf,ULONG32 len)

{

ULONG8 *readfirst = frombuf ;

ULONG8 *readend = frombuf[1] ;

INT8 *s;

ULONG8 y[2] ;

ULONG32 i;

for ( i = 0 ; i len ; i++)

{

y[0] = *readfirst ;

y[1] = *readend ;

readfirst += 2 ;

readend += 2 ;

tobuf[i] = (ULONG8)strtol((INT8*)y, s, 16);

}

return SUCCESS;

}

Des加密解密方法 用java C#和C++三种方式实现

Solaris下的系统,有一个用C做的加密工具,调用Sunwcry的des(1)对文件进行加密,然后在java中对文件进行解密。java中用的是标准的DES/CBC/NoPadding算法,可是解密后发现开头有8byte的数据出错了,请高人指点一下。

cbc_encrypt.c : 加密用的C程序

cbc_decrypt.c:解密用的C程序

TestDescbc.java:解密用的java程序

Test01.dat原始文件

Test03.dat cbc_encrypt加密后的文件

Test05.dat cbc_decrypt解密后的文件

Test06.dat TestDescbc解密后的文件