DES加密算法课程设计报告(7)

2019-01-05 12:29

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


DES加密算法课程设计报告(7).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:Lesson9 A cold welcome练习题

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: