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}; 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,
21
32,27,3,9, 19,13,30,6, 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[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];
22
} k=0;
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_Miwen=\
23
for(i=0;i<64;i++) //将64位二进制密文输出到界面上 {
m_Miwen=m_Miwen+(char)(48+output[i]); if((i+1)%8==0)
m_Miwen=m_Miwen+\ }
/*将output[64]二进制密文转换成ASCII字符*/ int charB[8][8]; k=0;
for(i=0;i<8;i++) for(j=0;j<8;j++) {
charB[i][j]=output[k]; k++; }
char miwen[8]; for(i=0;i<8;i++) {
str[i]=0;
if(charB[i][0]==1) str[i]=str[i]+128; if(charB[i][1]==1) str[i]=str[i]+64; if(charB[i][2]==1) str[i]=str[i]+32; if(charB[i][3]==1) str[i]=str[i]+16; if(charB[i][4]==1) str[i]=str[i]+8; if(charB[i][5]==1) str[i]=str[i]+4; if(charB[i][6]==1) str[i]=str[i]+2; if(charB[i][7]==1) str[i]=str[i]+1; }
m_outputMiwen=\ for(i=0;i<8;i++)
miwen[i]=str[i]; //至此,得到密文miwen[8] miwen[i]='\\0';
m_outputMiwen=miwen;
CString temp1,temp2,temp3; char *ch1,*ch2,*ch3; for(i=0;i<16;i++)
24
{
int m=m_output.InsertItem(0,\ char
chtempL[40]=\ int ctempL[32],ctempkey[48],ctempR[32]; for(j=0;j<32;j++) {
ctempL[j]=L[i][j]; ctempR[j]=R[i][j]; }
for(j=0;j<48;j++)
ctempkey[j]=keys[i][j]; for(j=0;j<32;j++) {
temp1.Format(\
ch1=temp1.GetBuffer(temp1.GetLength()); strcat(chtempL,ch1); if((j+1)%8==0)
strcat(chtempL,\
temp2.Format(\
ch2=temp2.GetBuffer(temp2.GetLength()); strcat(chtempR,ch2); if((j+1)%8==0)
strcat(chtempR,\ }
for(j=0;j<48;j++) {
temp3.Format(\
ch3=temp3.GetBuffer(temp3.GetLength()); strcat(chtempkey,ch3); if((j+1)%8==0)
strcat(chtempkey,\ }
_itoa(i+1,number,10);
m_output.SetItemText(m,0,number); m_output.SetItemText(m,1,chtempkey); m_output.SetItemText(m,2,chtempL); m_output.SetItemText(m,3,chtempR); }
UpdateData(false); }
25
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库DES加密算法课程设计报告(5)在线全文阅读。
相关推荐: