我有C语言实现的3DES加密算法,可我没用位寄存器,因为位寄存器较少,与其来回交换,不如用一个字节代表一位,这样更通用,速度更快一些,况且也不缺这几百字节。因此在函数的开始要将64位8字节的明文转换为64字节的明文,每个字节代表一位,存放在xdata中,以下是主要函数(新手,写的可能不够好,让大家见笑了):
typedef unsigned char uint8;
typedef unsigned long uint32;
uint8 xdata DES_IP[64]={
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};
uint8 xdata DES_IP_1[64]={
40, 8,48,16,56,24,64,32,
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};
uint8 xdata DES_PC_1[56]={
57,49,41,33,25,17, 9,
1,58,50,42,34,26,18,
10, 2,59,51,43,35,27,
19,11, 3,60,52,44,36,
63,55,47,39,31,23,15,
7,62,54,46,38,30,22,
14, 6,61,53,45,37,29,
21,13, 5,28,20,12, 4};
uint8 xdata DES_PC_2[48]={
14,17,11,24, 1, 5,
3,28,15, 6,21,10,
23,19,12, 4,26, 3,
16, 7,27,20,13, 2,
41,52,31,37,47,55,
30,40,51,45,33,48,
44,49,39,56,34,53,
46,42,50,36,29,32};
uint8 xdata shift[16]={1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
uint8 xdata DES_E[48]={
32, 1, 2, 3, 4, 5,
4, 5, 6, 7, 8, 9,
8, 9,10,11,12,13,
12,13,14,15,16,17,
16,17,18,19,20,21,
20,21,22,23,24,25,
24,25,26,27,28,29,
28,29,30,31,32, 1};
uint8 xdata DES_S[8][4][16]={
{{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}},
{{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}},
{{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}},
{{ 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}},
{{ 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}},
{{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}},
{{ 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}},
{{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}}};
uint8 xdata DES_P[32]={
16, 7,20,21,
29,12,28,17,
1,15,23,26,
5,18,31,10,
2, 8,24,14,
32,27, 2, 9,
19,13,30, 6,
22,11, 4,25};
uint8 xdata M[64]="";
uint8 xdata M2[64]="";
uint8 xdata RSK[48]="";
uint8 xdata RSK2[32]="";
uint8 xdata temp[32]="";
uint8 xdata key[192]="";
uint8 xdata key3[24]="";
uint8 xdata key2[168]="";
uint8 xdata subkey[48][48]="";
void TripleDES(uint8* DATA,uint8* KEY,uint32 readln,uint8 mode)
{
bit a;
uint8 i=0,j=0,k=0,l=0;
uint8 temp1,temp2,temp3,temp4;
uint8 x=0,y=0,z=0;
///校验密钥
///
for(i=0;i<24;i++) //密钥每位扩大为一个字节
{
key3[i]=KEY[i];
for(j=7;j>0;j--)
{
key[(i<<3)+j]=key3[i]%2;
key3[i]>>=1;
}
key[i<<3]=key3[i]%2;
}
for(i=0;i<56;i++) //生成168位密钥
{
key2[i]=key[DES_PC_1[i]-1];
key2[i+56]=key[DES_PC_1[i]+55];
key2[i+112]=key[DES_PC_1[i]+111];
}
for(i=0;i<16;i++) //生成48组48位的子密钥
{
if(shift[i]==1) //循环左移一位
{
for(k=0;k<3;k++)
{
temp1=key2[k*56];
temp2=key2[28+k*56];
for(j=k*56;j<27+k*56;j++)
{
key2[j]=key2[j+1];
key2[j+28]=key2[j+29];
}
key2[27+k*56]=temp1;
key2[55+k*56]=temp2;
}
}
else if(shift[i]==2) //循环左移两位
{
for(k=0;k<3;k++)
{
temp1=key2[k*56];
temp2=key2[1+k*56];
temp3=key2[28+k*56];
temp4=key2[29+k*56];
for(j=k*56;j<26+k*56;j++)
{
key2[j]=key2[j+2];
key2[j+28]=key2[j+30];
}
key2[26+k*56]=temp1;
key2[27+k*56]=temp2;
key2[54+k*56]=temp3;
key2[55+k*56]=temp4;
}
}
for(j=0;j<48;j++)
{
subkey[i][j]=key2[DES_PC_2[j]-1];
subkey[i+16][j]=key2[DES_PC_2[j]+55];
subkey[i+32][j]=key2[DES_PC_2[j]+111];
}
}
if(readln%8!=0) readln=(readln>>3)+1;
else readln>>=3;
for(k=0;k<readln;k++)
{
for(i=0;i<8;i++) //明文每位扩大为一个字节
{
for(j=7;j>0;j--)
{
M[(i<<3)+j]=DATA[(k<<3)+i]%2;
DATA[(k<<3)+i]>>=1;
}
M[(i<<3)]=DATA[(k<<3)+i]%2;
}
for(l=0;l<3;l++)
{
if(l>0) mode=(1==mode)?0:1;
for(i=0;i<64;i++) //生成初始转换表
M2[i]=M[DES_IP[i]-1];
for(i=0;i<16;i++) //16次迭代
{
for(j=0;j<48;j++)
{
if(0==mode) RSK[j]=((M2[DES_E[j]+31]==subkey[i+l*16][j])?0:1);//加密
else RSK[j]=((M2[DES_E[j]+31]==subkey[47-i-l*16][j])?0:1);//解密
}
for(j=0;j<8;j++)
{
x=(RSK[j*6]<<1)+RSK[j*6+5];
y=(RSK[j*6+1]<<3)+(RSK[j*6+2]<<2)+(RSK[j*6+3]<<1)+RSK[j*6+4];
z=DES_S[j][x][y];
RSK2[(j<<2)+3]=z%2;
z=z>>1;
RSK2[(j<<2)+2]=z%2;
z=z>>1;
RSK2[(j<<2)+1]=z%2;
z=z>>1;
RSK2[(j<<2)]=z%2;
}
for(j=0;j<32;j++) //P盒转换
temp[j]=((RSK2[DES_P[j]-1]==M2[j])?0:1);
if(i<15)
{
for(j=0;j<32;j++) //交换
{
M2[j]=M2[j+32];
M2[j+32]=temp[j];
}
}
else
{
for(j=0;j<32;j++) //不交换
{
M2[j]=temp[j];
}
}
}
for(i=0;i<64;i++) //逆置换
M[i]=M2[DES_IP_1[i]-1];
}
for(i=0;i<8;i++)
{
DATA[(k<<3)+i]=(M[i<<3]<<7)+(M[(i<<3)+1]<<6)+(M[(i<<3)+2]<<5)+(M[(i<<3)+3]<<4)
+(M[(i<<3)+4]<<3)+(M[(i<<3)+5]<<2)+(M[(i<<3)+6]<<1)+M[(i<<3)+7];
}
}
} |