图3-6 代码:
//扩展函数将32位变为48位 首先按R[32]一条龙对E[8][6]赋值,然后再处理多出来的16位
void Extension (int r[32],int E[8][6]) {
int i,h,l; i=0;
while(i<32)
for(h=0;h<8;h++) for(l=1;l<5;l++) E[h][l]=r[i++];
E[0][0]=r[31]; E[0][5]=r[4]; i=9;
for(h=1;h<7;h++) {
E[h][0]=r[4*h-1]; E[h][5]=r[i-1]; i=i+4; }
E[7][0]=r[27]; E[7][5]=r[0]; }
b 异或函数
相同为假,相同为真,将E盒的输出与子密钥进行异或得到的48比特作为S盒的输入。
代码:
//异或函数 r[48]为结果
void XorFun (int E[8][6],int k [48],int r [48]) {
int h,l,a; a=0;
for(h=0;h<8;h++) for(l=0;l<6;l++) {
}
if(E[h][l]!=k[a]) r[a++]=1; else r[a++]=0; }
c .S函数
进入S盒变换,48比特压缩为32比特如图3-7。S盒的安全性能是保证DES算法安全性的源泉,DES算法共有8个不同的S盒,每个S盒接受6位输入,输出4位。8个S盒如图3-8:
图3-7
图3-8
任取一S盒,现在分析S盒的变换过程见图3-9:
图3-9
在其输入
b1,b2,b3,b4,b5,b6
中,计算出
x=b1*2+b6,
y=b5+b4*2+b3*4+b2*8,再从S[i]表中查出x 行,y 列的值Sxy。将Sxy化为二进制,即得Si盒的输出。函数实现中将48位K [48]转换
为SI[8][6]二维数组,一次处理6比特。将8个S盒存成S[8][64]二维数组,则第i个S盒中的X行Y列转化为S[i-1][X*16+Y-1]; 代码:
// F函数中的S函数
void FeiSFun(int k[48],int p [32]) {
int i,ni,pi,h,l,sh,sl,out; int num [4]; int si[8][6]; int
s[8][64]={ {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,
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说教育文库des课程设计(4)在线全文阅读。
相关推荐: