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