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}} ; pi=0; i=0;
for(h=0;h<8;h++) //将将48位K [48]转换为SI[8][6]二维数组 for(l=0;l<6;l++) si[h][l]=k[i++];
for(h=0;h<8;h++) //8个S盒变换 {
sh=2*si[h][0]+si[h][5];
sl=8*si[h][1]+4*si[h][2]+2*si[h][3]+si[h][4]; out=s[h][sh*16+sl]; change(out,num); for(ni=0;ni<4;ni++) p[pi++]=num[ni]; }}
d.P盒置换
S盒输出的32比特经过P盒置换,重新编排32比特的位置。下
图3-10为P盒置换过程。
图3-10
e.将扩张变换E和异或运算S函数P置换整合为F函数 F 函数输入为R[32]、 K[48] 输出为PO[32] //F 函数
void Feistel (int r [32],int k [48],int po [32]) {
int Ex[8][6]; int pi[32]; int re [48]; Extension (r,Ex); XorFun(Ex,k,re); FeiSFun(re,pi); FSPFun(pi,po);
}
f. 循环加密
前15轮加密过程相同为 L(i)==R(i-1);
R(i)=L(i-1)⊕F(R(i-1),K(i));(i=0.、1、2、3……15) 第16轮为
L(16)=L(15)⊕F(R(15),K(16)) R(16)=R(15); 代码:
for(d=1;d<16;d++) {
KeyProd( ms,d,key); //密钥产生函数 Feistel(R,key,rr); //F函数
LPXorFun(rr,L,R1); //异或函数 ArrayCopy (L,R); //数组复制函数 ArrayCopy (R,R1);
}
KeyProd( ms,16,key); /
Feistel(R,key,rr);
LPXorFun(rr,L,R1);
ArrayCopy (L,R1);
g.逆初始置换
DES算法进行完16轮运算之后,需要进行逆初始置换,逆初始置换正好为初始置换的逆,如一个矩阵进行初始置换之后输出,在进行依次逆初始置换的输出结果为初始矩阵。变换规则如下图3-11
代码:
//逆初始置换函数
Void IPRevFun (int L [32],int R [32],int re[64]) { int i,j; int tem [64];
int ip11 [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 };
j=0;
for(i=0;i<32;i++) tem[j++]=L[i]; for(i=0;i<32;i++) tem[j++]=R[i]; for(i=0;i<64;i++) re[i]=tem[ip11[i]-1]; }
四、结果测试 加密测试结果如图:
解密测试结果如图: