为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

DES加密算法程序C51

2013-05-02 22页 doc 140KB 53阅读

用户头像

is_081729

暂无简介

举报
DES加密算法程序C51C51编写的DES加密算法程序 摘自leon lee编写的POS程序 ◆这可是用于成熟产品上的代码。 ◆变换后的数据可能让人费解,程序更显得不规范。没办法!一切为了速度。 ◆对同一个密钥,以后的加密解密计算不必每次都调用deskey()函数。 ◆指针和数组操作的交替使用,仅在C51编译器下表现出最佳速度,其他环境未验证。 下面是算法的完整函数,要连接到你的程序可能还需要点工夫。 #define EN_DES 1 #define DE_DES 0 const unsigned char ip[65] = {0, 58, ...
DES加密算法程序C51
C51编写的DES加密算法程序 摘自leon lee编写的POS程序 ◆这可是用于成熟产品上的代码。 ◆变换后的数据可能让人费解,程序更显得不。没!一切为了速度。 ◆对同一个密钥,以后的加密解密计算不必每次都调用deskey()函数。 ◆指针和数组操作的交替使用,仅在C51编译器下表现出最佳速度,其他环境未验证。 下面是算法的完整函数,要连接到你的程序可能还需要点工夫。 #define EN_DES 1 #define DE_DES 0 const unsigned char ip[65] = {0, 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8, 57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3, 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7}; const unsigned char fp[64] = { 8, 40, 16, 48, 24, 56, 32, 64, 7, 39, 15, 47, 23, 55, 31, 63, 6, 38, 14, 46, 22, 54, 30, 62, 5, 37, 13, 45, 21, 53, 29, 61, 4, 36, 12, 44, 20, 52, 28, 60, 3, 35, 11, 43, 19, 51, 27, 59, 2, 34, 10, 42, 18, 50, 26, 58, 1, 33, 9, 41, 17, 49, 25, 57}; const unsigned char init_newpc[16][48] = { 10,51,34,60,49,17,33,57, 2, 9,19,42, 3,35,26,25,44,58,59, 1,36,27,18,41, 22,28,39,54,37, 4,47,30, 5,53,23,29,61,21,38,63,15,20,45,14,13,62,55,31, 2,43,26,52,41, 9,25,49,59, 1,11,34,60,27,18,17,36,50,51,58,57,19,10,33, 14,20,31,46,29,63,39,22,28,45,15,21,53,13,30,55, 7,12,37, 6, 5,54,47,23, 51,27,10,36,25,58, 9,33,43,50,60,18,44,11, 2, 1,49,34,35,42,41, 3,59,17, 61, 4,15,30,13,47,23, 6,12,29,62, 5,37,28,14,39,54,63,21,53,20,38,31, 7, 35,11,59,49, 9,42,58,17,27,34,44, 2,57,60,51,50,33,18,19,26,25,52,43, 1, 45,55,62,14,28,31, 7,53,63,13,46,20,21,12,61,23,38,47, 5,37, 4,22,15,54, 19,60,43,33,58,26,42, 1,11,18,57,51,41,44,35,34,17, 2, 3,10, 9,36,27,50, 29,39,46,61,12,15,54,37,47,28,30, 4, 5,63,45, 7,22,31,20,21,55, 6,62,38, 3,44,27,17,42,10,26,50,60, 2,41,35,25,57,19,18, 1,51,52,59,58,49,11,34, 13,23,30,45,63,62,38,21,31,12,14,55,20,47,29,54, 6,15, 4, 5,39,53,46,22, 52,57,11, 1,26,59,10,34,44,51,25,19, 9,41, 3, 2,50,35,36,43,42,33,60,18, 28, 7,14,29,47,46,22, 5,15,63,61,39, 4,31,13,38,53,62,55,20,23,37,30, 6, 36,41,60,50,10,43,59,18,57,35, 9, 3,58,25,52,51,34,19,49,27,26,17,44, 2, 12,54,61,13,31,30, 6,20,62,47,45,23,55,15,28,22,37,46,39, 4, 7,21,14,53, 57,33,52,42, 2,35,51,10,49,27, 1,60,50,17,44,43,26,11,41,19,18, 9,36,59, 4,46,53, 5,23,22,61,12,54,39,37,15,47, 7,20,14,29,38,31,63,62,13, 6,45, 41,17,36,26,51,19,35,59,33,11,50,44,34, 1,57,27,10,60,25, 3, 2,58,49,43, 55,30,37,20, 7, 6,45,63,38,23,21,62,31,54, 4,61,13,22,15,47,46,28,53,29, 25, 1,49,10,35, 3,19,43,17,60,34,57,18,50,41,11,59,44, 9,52,51,42,33,27, 39,14,21, 4,54,53,29,47,22, 7, 5,46,15,38,55,45,28, 6,62,31,30,12,37,13, 9,50,33,59,19,52, 3,27, 1,44,18,41, 2,34,25,60,43,57,58,36,35,26,17,11, 23,61, 5,55,38,37,13,31, 6,54,20,30,62,22,39,29,12,53,46,15,14,63,21,28, 58,34,17,43, 3,36,52,11,50,57, 2,25,51,18, 9,44,27,41,42,49,19,10, 1,60, 7,45,20,39,22,21,28,15,53,38, 4,14,46, 6,23,13,63,37,30,62,61,47, 5,12, 42,18, 1,27,52,49,36,60,34,41,51, 9,35, 2,58,57,11,25,26,33, 3,59,50,44, 54,29, 4,23, 6, 5,12,62,37,22,55,61,30,53, 7,28,47,21,14,46,45,31,20,63, 26, 2,50,11,36,33,49,44,18,25,35,58,19,51,42,41,60, 9,10,17,52,43,34,57, 38,13,55, 7,53,20,63,46,21, 6,39,45,14,37,54,12,31, 5,61,30,29,15, 4,47, 18,59,42, 3,57,25,41,36,10,17,27,50,11,43,34,33,52, 1, 2, 9,44,35,26,49, 30, 5,47,62,45,12,55,38,13,61,31,37, 6,29,46, 4,23,28,53,22,21, 7,63,39}; const unsigned char pk_si[256] = { 0xe0, 0x4f, 0xd7, 0x14, 0x2e, 0xf2, 0xbd, 0x81, 0x3a, 0xa6, 0x6c, 0xcb, 0x59, 0x95, 0x03, 0x78, 0x4f, 0x1c, 0xe8, 0x82, 0xd4, 0x69, 0x21, 0xb7, 0xf5, 0xcb, 0x93, 0x7e, 0x3a, 0xa0, 0x56, 0x0d, 0xf3, 0x1d, 0x84, 0xe7, 0x6f, 0xb2, 0x38, 0x4e, 0x9c, 0x70, 0x21, 0xda, 0xc6, 0x09, 0x5b, 0xa5, 0x0d, 0xe8, 0x7a, 0xb1, 0xa3, 0x4f, 0xd4, 0x12, 0x5b, 0x86, 0xc7, 0x6c, 0x90, 0x35, 0x2e, 0xf9, 0xad, 0x07, 0x90, 0xe9, 0x63, 0x34, 0xf6, 0x5a, 0x12, 0xd8, 0xc5, 0x7e, 0xbc, 0x4b, 0x2f, 0x81, 0xd1, 0x6a, 0x4d, 0x90, 0x86, 0xf9, 0x38, 0x07, 0xb4, 0x1f, 0x2e, 0xc3, 0x5b, 0xa5, 0xe2, 0x7c, 0x7d, 0xd8, 0xeb, 0x35, 0x06, 0x6f, 0x90, 0xa3, 0x14, 0x27, 0x82, 0x5c, 0xb1, 0xca, 0x4e, 0xf9, 0xa3, 0x6f, 0x90, 0x06, 0xca, 0xb1, 0x7d, 0xd8, 0xf9, 0x14, 0x35, 0xeb, 0x5c, 0x27, 0x82, 0x4e, 0x2e, 0xcb, 0x42, 0x1c, 0x74, 0xa7, 0xbd, 0x61, 0x85, 0x50, 0x3f, 0xfa, 0xd3, 0x09, 0xe8, 0x96, 0x4b, 0x28, 0x1c, 0xb7, 0xa1, 0xde, 0x72, 0x8d, 0xf6, 0x9f, 0xc0, 0x59, 0x6a, 0x34, 0x05, 0xe3, 0xca, 0x1f, 0xa4, 0xf2, 0x97, 0x2c, 0x69, 0x85, 0x06, 0xd1, 0x3d, 0x4e, 0xe0, 0x7b, 0x53, 0xb8, 0x94, 0xe3, 0xf2, 0x5c, 0x29, 0x85, 0xcf, 0x3a, 0x7b, 0x0e, 0x41, 0xa7, 0x16, 0xd0, 0xb8, 0x6d, 0x4d, 0xb0, 0x2b, 0xe7, 0xf4, 0x09, 0x81, 0xda, 0x3e, 0xc3, 0x95, 0x7c, 0x52, 0xaf, 0x68, 0x16, 0x16, 0x4b, 0xbd, 0xd8, 0xc1, 0x34, 0x7a, 0xe7, 0xa9, 0xf5, 0x60, 0x8f, 0x0e, 0x52, 0x93, 0x2c, 0xd1, 0x2f, 0x8d, 0x48, 0x6a, 0xf3, 0xb7, 0x14, 0xac, 0x95, 0x36, 0xeb, 0x50, 0x0e, 0xc9, 0x72, 0x72, 0xb1, 0x4e, 0x17, 0x94, 0xca, 0xe8, 0x2d, 0x0f, 0x6c, 0xa9, 0xd0, 0xf3, 0x35, 0x56, 0x8b}; const unsigned char shift[8] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; no_init unsigned char newpc[16][48]; no_init unsigned char newsi[8][64][4],nul; void des(unsigned char *plain,unsigned char key_6[16][8],unsigned char mode,unsigned char *ciphertext) { data unsigned char i,j,k,m,*s1,*s2,r0_6[8]; unsigned char textbit[65],tranx[65]; k = 0; for(i=0;i<8;++i){ m = plain[i]; for(j=0;j<8;++j) textbit[++k] = m & shift[j] && 1; } for(i=0;i<65;++i) tranx[i] = textbit[i]; for(i=1;i<65;++i) textbit[i] = tranx[ip[i]]; for(i=0;i<16;++i){ for(j=1;j<33;++j) tranx[j] = *(textbit+32+j); r0_6[0] = textbit[37]; r0_6[1] = textbit[41]; r0_6[2] = textbit[45]; r0_6[3] = textbit[49]; r0_6[4] = textbit[53]; r0_6[5] = textbit[57]; r0_6[6] = textbit[61]; r0_6[7] = textbit[33]; k = textbit[32]; textbit[32] = textbit[64]; for(j=0;j<5;++j){ m = *(shift+2+j); if(*(textbit+32+j)) r0_6[0] |= m; if(*(textbit+36+j)) r0_6[1] |= m; if(*(textbit+40+j)) r0_6[2] |= m; if(*(textbit+44+j)) r0_6[3] |= m; if(*(textbit+48+j)) r0_6[4] |= m; if(*(textbit+52+j)) r0_6[5] |= m; if(*(textbit+56+j)) r0_6[6] |= m; if(*(textbit+60+j)) r0_6[7] |= m; } textbit[32] = k; k = 32; mode ? (s1 = key_6[i]) : (s1 = key_6[15-i]); for(j=0;j<8;++j){ m = r0_6[j] ^ *(s1++); s2 = newsi[j][m]; textbit[++k] = *(++s2); textbit[++k] = *(++s2); textbit[++k] = *(++s2); textbit[++k] = *(++s2); } k=textbit[33]; /* transpose */ textbit[33]=textbit[48];textbit[48]=textbit[42];textbit[42]=textbit[47]; textbit[47]=textbit[63];textbit[63]=textbit[36];textbit[36]=textbit[53]; textbit[53]=textbit[64];textbit[64]=textbit[57];textbit[57]=textbit[51]; textbit[51]=textbit[56];textbit[56]=textbit[41];textbit[41]=k; k=textbit[34]; textbit[34]=textbit[39];textbit[39]=textbit[60];textbit[60]=textbit[38]; textbit[38]=textbit[44];textbit[44]=textbit[58];textbit[58]=textbit[45]; textbit[45]=textbit[37];textbit[37]=textbit[61];textbit[61]=textbit[54]; textbit[54]=textbit[59];textbit[59]=textbit[62];textbit[62]=textbit[43]; textbit[43]=textbit[55];textbit[55]=textbit[35];textbit[35]=textbit[52]; textbit[52]=textbit[46];textbit[46]=textbit[50];textbit[50]=textbit[40]; textbit[40]=textbit[49];textbit[49]=k; for(j=1;j<33;++j) { textbit[j+32] ^= textbit[j]; textbit[j] = tranx[j]; } } k = 0; s1 = &ciphertext[0]; for(i=0;i<8;++i){ *s1 = 0; for(j=0;j<8;++j) if(textbit[fp[k++]]) *s1 |= shift[j]; ++s1; } } void deskey(unsigned char *temp,unsigned char key[16][8]) { data unsigned char i,j,k,m,*s; unsigned char tempbit[65],tranx[65]; m = 0; for(i=0;i<8;++i){ k = temp[i]; for(j=0;j<8;++j) tempbit[++m] = k & shift[j] && 1; } s = &newpc[0][0]; for(i=0;i<16;++i){ for(j=0;j<8;++j){ key[i][j] = 0; for(k=2;k<8;++k) if(tempbit[*(s++)]) key[i][j] |= shift[k]; } } } DES加密算法(des.c文件) 作者:转载(21IC) /*********************************************************************/ /*-文件名:des.c              */ /*-                  */ /*-功能: 实现DES加密算法的加密解密功能            */ /*-                  */ /*-说明:des算法的实现代码            */ /*-  能够实现56位或56*n密钥的des算法,可以通过该程序提供的接口    */ /*-  进行数据的加密,保证数据在传送过程的安全性      */ /*-                  */ /*-                  */ /*-该程序的所有权利由作者保留                       */ /*-                     */ /*-                     */ /*-版本号:1.0.0(2002.4)            */ /*-                  */ /*-                  */ /*-AUTHOR:吴真(WUZHEN)             */ /*-                  */ /*********************************************************************/ #include #include #include #include #include #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个参数:",  " 1.可执行文件名 *.exe",  " 2.操作类型 1:一层加密;2:一层解密;",  " 13:N层单密钥加密;23:N层单密钥解密;",  " 39:N层多密钥加密;49:N层多密钥解密",  " 3.读出数据的文件名*.txt",  " 4.写入数据的文件名*.txt",   " 5.密钥(8字节例如:wuzhen12)",   " [6].N层单密钥的层数或者...二层加密|解密密钥",   " [7].三层加密|解密密钥",  " [8]. ...",  " [N].N层加密|解密密钥",  " 例1: des 1 1.txt 2.txt 12345678",  "     : des 2 2.txt 3.txt 12345678",  " 例2: des 13 1.txt 2.txt tiantian 5",  "     : des 23 2.txt 3.txt tiantian 5",  " 例3: des 39 1.txt 2.txt 12345678 tiantian gaoxinma",  "     : 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("Cant open file ");   return FAIL;  }      key = argv[4] ;    switch( atoi(argv[1] ))  {  case 1: /*加密*/   file_enc(fp,fp2,key,0, NULL,0, DESONE);       printf(" DES 一层加密完毕,密文存于%s文件 ",FILENAME2);   break;  case 2:   file_dec(fp,fp2,key,0, NULL, 0,DESONE);       printf(" DES 一层解密完毕,密文存于%s文件 ",FILENAME2);   break;  case 13:   file_enc(fp,fp2,key,atoi(argv[5]),NULL,0,DESTHREE);       printf(" DES %u层单密钥加密完毕,密文存于%s文件 ",atoi(argv[5]),FILENAME2);   break;  case 23:   file_dec(fp,fp2,key,atoi(argv[5]),NULL,0,DESTHREE);       printf(" DES %u层单密钥解密完毕,密文存于%s文件 ",atoi(argv[5]),FILENAME2);   break;  case 39:   file_enc(fp,fp2,NULL,0,superkey,n_superkey,DESMULTI);       printf(" DES 多密钥加密完毕,密文存于%s文件 ",FILENAME2);   free(superkey);   superkey = NULL;   break;  case 49:   file_dec(fp,fp2,NULL,0,superkey,n_superkey,DESMULTI);   printf(" DES 多密钥加密完毕,密文存于%s文件 ",FILENAME2);   free(superkey);   superkey = NULL;   break;  default:    printf("请选择是加密|解密 plese choose encrypt|deencrypt ");     break;  }  fclose(fp);  fclose(fp2);  return SUCCESS; } void wz_print_help() {  INT32 i ;  printf(" ");  for (  i = 0 ; i < 22 ; i++)  {   printf("%c ",5);  }  printf(" ");  for( i = 0 ; i < WZ_COMMEND_NUM ; i++)  {   printf(" %c %s %c ",5,WZ_Commend_Help[i],5);   }  printf(" ");  for (  i = 0 ; i < 22 ; i++)  {   printf("%c ",5);  }   printf(" ");  for( i = 0 ; i < WZUSEHELPNUM ; i++)  {   printf(" %s ",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; } aes加密算法C代码 完整的! #include "stdio.h" #include "memory.h" #include "time.h" #include "stdlib.h" #define PLAIN_FILE_OPEN_ERROR -1 #define KEY_FILE_OPEN_ERROR -2 #define CIPHER_FILE_OPEN_ERROR -3 #define OK 1 typedef char ElemType; /*初始置换表IP*/ int IP_Table[64] = { 57,49,41,33,25,17,9,1, 59,51,43,35,27,19,11,3, 61,53,45,37,29,21,13,5, 63,55,47,39,31,23,15,7, 56,48,40,32,24,16,8,0, 58,50,42,34,26,18,10,2, 60,52,44,36,28,20,12,4, 62,54,46,38,30,22,14,6}; /*逆初始置换表IP^-1*/ int IP_1_Table[64] = {39,7,47,15,55,23,63,31, 38,6,46,14,54,22,62,30, 37,5,45,13,53,21,61,29, 36,4,44,12,52,20,60,28, 35,3,43,11,51,19,59,27, 34,2,42,10,50,18,58,26, 33,1,41,9,49,17,57,25, 32,0,40,8,48,16,56,24}; /*扩充置换表E*/ int E_Table[48] = {31, 0, 1, 2, 3, 4, 3, 4, 5, 6, 7, 8, 7, 8,9,10,11,12, 11,12,13,14,15,16, 15,16,17,18,19,20, 19,20,21,22,23,24, 23,24,25,26,27,28, 27,28,29,30,31, 0}; /*置换函数P*/ int P_Table[32] = {15,6,19,20,28,11,27,16, 0,14,22,25,4,17,30,9, 1,7,23,13,31,26,2,8, 18,12,29,5,21,10,3,24}; /*S盒*/ int S[8][4][16] = /*S1*/ {{{14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7}, {0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8}, {4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0}, {15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13}}, /*S2*/ {{15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10}, {3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5}, {0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15}, {13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9}}, /*S3*/ {{10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8}, {13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1}, {13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7}, {1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12}}, /*S4*/ {{7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15}, {13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9}, {10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4}, {3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14}}, /*S5*/ {{2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9}, {14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6}, {4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14}, {11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3}}, /*S6*/ {{12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11}, {10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8}, {9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6}, {4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13}}, /*S7*/ {{4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1}, {13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6}, {1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2}, {6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12}}, /*S8*/ {{13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7}, {1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2}, {7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8}, {2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11}}}; /*置换选择1*/ int PC_1[56] = {56,48,40,32,24,16,8, 0,57,49,41,33,25,17, 9,1,58,50,42,34,26, 18,10,2,59,51,43,35, 62,54,46,38,30,22,14, 6,61,53,45,37,29,21, 13,5,60,52,44,36,28, 20,12,4,27,19,11,3}; /*置换选择2*/ int PC_2[48] = {13,16,10,23,0,4,2,27, 14,5,20,9,22,18,11,3, 25,7,15,6,26,19,12,1, 40,51,30,36,46,54,29,39, 50,44,32,46,43,48,38,55, 33,52,45,41,49,35,28,31}; /*对左移次数的规定*/ int MOVE_TIMES[16] = {1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1}; int ByteToBit(ElemType ch,ElemType bit[8]); int BitToByte(ElemType bit[8],ElemType *ch); int Char8ToBit64(ElemType ch[8],ElemType bit[64]); int Bit64ToChar8(ElemType bit[64],ElemType ch[8]); int DES_MakeSubKeys(ElemType key[64],ElemType subKeys[16][48]); int DES_PC1_Transform(ElemType key[64], ElemType tempbts[56]); int DES_PC2_Transform(El
/
本文档为【DES加密算法程序C51】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索