beforekey[i][j]=C[i][j]; for(k=0;k<28;k++,j++)
beforekey[i][j]=D[i][k]; }
/*beforekey[16][56]经过pc_2置换,生成16轮子密钥key[16][48]*/ int keys[16][48]; for(i=0;i<16;i++) for(j=0;j<48;j++)
keys[i][j]=beforekey[i][pc_2table[j]-1]; /*初始置换IP*/
int IP_table[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}; int afterIP[64]; for(i=0;i<64;i++) {
afterIP[i]=miwenB[IP_table[i]-1]; }
/*明文的第零次分组,L0[32],R0[32]*/ int L0[32],R0[32]; for(i=0;i<32;i++) L0[i]=afterIP[i];
for(j=0,i=32;i<64;i++,j++) R0[j]=afterIP[i];
/*十六轮循环生成密文,首先是L[16][32]和R[16][32]的生成*/ int L[16][32],R[16][32]; int E_table[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,31}; int afterER0[48],beforeS[48]; for(i=0;i<32;i++) //Li=R(i-1) L[0][i]=R0[i];
31
for(i=0;i<48;i++) //E置换,生成48位数据,与第十五轮子密钥进行异或,为进入S盒做准备
afterER0[i]=R0[E_table[i]-1]; for(i=0;i<48;i++)
if(afterER0[i]==keys[15][i]) beforeS[i]=0; else
beforeS[i]=1;
/*将beforeS[48]分在8个数组中,为经过8个S盒准备*/ int beforeSBox[8][6]; k=0;
for(i=0;i<8;i++) for(j=0;j<6;j++) {
beforeSBox[i][j]=beforeS[k]; k++; }
/* S盒变换,48位数据生成32位数据*/ int afterSBox[8];
int SBox[8][4][16]={ //S盒变换表 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,
32
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}; int hang,lie; for(i=0;i<8;i++) {
hang=beforeSBox[i][0]*2+beforeSBox[i][5];
lie=beforeSBox[i][1]*8+beforeSBox[i][2]*4+beforeSBox[i][3]*2+beforeSBox[i][4];
afterSBox[i]=SBox[i][hang][lie]; }
/*将从S盒中出来的8个十进制数字转换成32位的二进制数*/ int beforep[32]; k=0;
int temp; int str1[4]; for(i=0;i<8;i++) {
temp=afterSBox[i]; for(j=0;j<4;j++) {
str1[j]=temp%2; temp=temp/2; }
for(j=3;j>=0;j--) {
beforep[k]=str1[j]; k++; } }
/*从S盒输入的32位的二进制数进行P置换,生成的即是f函数的结果*/ int p_table[32]={
16,7,20,21, 29,12,28,17, 1,15,23,26, 5,18,31,10, 2,8,24,14, 32,27,3,9, 19,13,30,6,
33
22,11,4,25}; int p[32];
for(i=0;i<32;i++)
p[i]=beforep[p_table[i]-1];
/*p[32]与L0[32]进行异或,得到R[0][32]*/ for(i=0;i<32;i++) {
R[0][i]=p[i]+L0[i]; if(R[0][i]==2) R[0][i]=0; }
/*已经生成L[0][32]和R[0][32],下面进行十五轮循环,生成其余L[i][32]和R[i][32]*/
int afterER[16][48]; int n;
for(i=1;i<16;i++) {
for(j=0;j<32;j++)
L[i][j]=R[i-1][j]; for(j=0;j<48;j++) //E置换
afterER[i][j]=R[i-1][E_table[j]-1]; for(j=0;j<48;j++) //与子密钥进行异或 {
if(afterER[i][j]==keys[15-i][j]) beforeS[j]=0; else
beforeS[j]=1; } k=0;
for(j=0;j<8;j++) //生成进入S盒钱的8个数组,分别进入8个S盒 for(n=0;n<6;n++) {
beforeSBox[j][n]=beforeS[k]; k++; }
for(j=0;j<8;j++) //进入S盒,从8个S盒中生成8个数 {
hang=beforeSBox[j][0]*2+beforeSBox[j][5];
lie=beforeSBox[j][1]*8+beforeSBox[j][2]*4+beforeSBox[j][3]*2+beforeSBox[j][4];
afterSBox[j]=SBox[j][hang][lie]; } k=0;
34
for(j=0;j<8;j++) //S盒出来的8个十进制数转换成32位的二进制数 {
temp=afterSBox[j]; for(n=0;n<4;n++) {
str1[n]=temp%2; temp=temp/2; }
for(n=3;n>=0;n--) {
beforep[k]=str1[n]; k++; } }
for(j=0;j<32;j++)
p[j]=beforep[p_table[j]-1]; for(j=0;j<32;j++)
if(p[j]==L[i-1][j]) R[i][j]=0; else
R[i][j]=1; }
/*通过十五轮循环,最后得到L[15][32]和R[15][32],合并之后进行IP逆置换生成明文*/
int beforeoutput[64]; int output[64]; int IPR_tabel[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}; for(i=0;i<32;i++) //数据合并,R[15][32]在前,L[15][32]在后面 beforeoutput[i]=R[15][i]; for(i=32,j=0;i<64;i++,j++) beforeoutput[i]=L[15][j]; for(i=0;i<64;i++)
output[i]=beforeoutput[IPR_tabel[i]-1];//得到64位明文 m_Mingwen=\ for(i=0;i<64;i++) {
35
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库DES加密算法课程设计报告(7)在线全文阅读。
相关推荐: