实验二 DES加解密实现.docx
- 文档编号:30293025
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:8
- 大小:65.02KB
实验二 DES加解密实现.docx
《实验二 DES加解密实现.docx》由会员分享,可在线阅读,更多相关《实验二 DES加解密实现.docx(8页珍藏版)》请在冰豆网上搜索。
实验二DES加解密实现
实验二DES加解密实现
1.实验内容
编写程序实现:
DES加解密实现。
要求:
(1)实现功能;
(2)给出程序实现过程中的主要算法;
(3)对各个函数和参数作必要的说明
2.程序
注:
文本框关联变量m_miwen(密文文本框),m_mingwen(明文文本框),m_miyao(密钥文本框)
注:
变量及函数声明:
intm,n;//m-n记录明文字符串个数
charkey[16][48];//保存16个子密钥
voidbytestring(CStringstr,char*c,inti);//二进制转换
voidleftmove(intn,char*C,char*D);//循环左移
voidconvertselect1(char*C,char*D,char*miyao);//置换选择一
voidconvertselect2(charkey[16][48],char*C,char*D,intk);//置换选择二
voiddivide(int&m,int&n);//明文短块填充函数,m记录填充后明文长度,n记录填充个数
voidinitconvertip(char*mingwen,intIP[8][8]);//初始置换IP
voidseleteE(char*zikey,char*R);//选择置换E
voidS(char*R,char*zikey);//S盒
voidconvertP(char*R);//置换选择P
voidinitconvertip1(char*miwen,char*R,char*L,intIP[8][8]);//初始逆置换IP
voidCDesDlg:
:
OnOK()//加密按钮响应事件实现
{inti=0,j,k,x;intIP[8][8];charmingwen[64];charmiyao[64];charmiwen[64];
charL[32],OldL[32],R[32],OldR[32];charC[28],D[28];charzikey[48];UpdateData(TRUE);//获取文本框数据
if(m_miyao.GetLength()!
=8)
{CStringstr;str.Format("密钥8字符!
你输入了%d字符",m_miyao.GetLength());MessageBox(str);return;
}m_miwen="";//密文文本框相关变量
bytestring(m_miyao,miyao,0);//将密钥文本框数据转换为二进制并存储在字符变量miyao
convertselect1(C,D,miyao);divide(m,n);
for(j=0;j {bytestring(m_mingwen,mingwen,j);initconvertip(mingwen,IP); for(x=0;x<64;x++){if(x<32)L[x]=mingwen[x];elseR[x-32]=mingwen[x];} for(k=0;k<16;k++) {leftmove(k,C,D);convertselect2(key,C,D,k); for(i=0;i<48;i++){zikey[i]=key[k][i];} for(i=0;i<32;i++){OldL[i]=L[i];OldR[i]=convertP(R); for(i=0;i<32;i++) {if(k<15){L[i]=OldR[i];if(OldL[i]==R[i]){R[i]='0';}elseR[i]='1';} else{if(OldL[i]==R[i]){L[i]='0';}elseL[i]='1';R[i]=OldR[i];} } }initconvertip1(miwen,R,L,IP); for(x=0;x<64;x++){m_miwen=m_miwen+miwen[x];} }UpdateData(FALSE);//显示文本框新幻剑书盟 内容 } voidCDesDlg: : divide(int&m,int&n)//明文短块填充并记录填充字符个数在n,填充后字符个数在m {inti,x;n=0;m=m_mingwen.GetLength(); if(m%8! =0){for(i=m%8;i<8;i++){x=48+rand()%10;m_mingwen=m_mingwen+char(x);m=m+1;n=n+1;}} } voidCDesDlg: : initconvertip(char*mingwen,intIP[8][8])//初始置换IP实现保存至数组mingwen {inti,j,m=2,n=1,x=2,y=1;charb[64]; for(j=7;j>=0;j--){for(i=0;i<8;i++){if(i<4){IP[i][j]=m*n;n++;}else{IP[i][j]=x*y-1;y++;}}} for(i=0;i<64;i++){b[i]=mingwen[i];}for(i=0;i<8;i++){for(j=0;j<8;j++){mingwen[8*i+j]=b[IP[i][j]-1];}} } voidCDesDlg: : convertselect1(char*C,char*D,char*miyao)//置换选择一实现密钥分为两部分保存至C,D {inti;intc_box[28]={57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,27,19,11,3,60,52,44,36}; intd_box[28]={63,55,47,39,31,23,15,7,62,54,46,38,30,22,14,6,61,53,45,37,29,21,13,5,28,20,12,4}; for(i=0;i<28;i++){C[i]=miyao[c_box[i]-1];D[i]=miyao[d_box[i]-1];} } voidCDesDlg: : bytestring(CStringstr,char*c,inti)//二进制转换实现将str的8个8个的每个字符转为二进制存在数组c {inta;for(intj=0;j<8;j++){a=str[8*i+j];for(inti=0;i<8;i++){if(a%2==0)c[8*j+7-i]='0';elsec[8*j+7-i]='1';a=a/2;}}} voidCDesDlg: : leftmove(intn,char*C,char*D)//循环左移实现并保存在C,D两个字符数组 {inti,j,k,x,y;switch(n){ case0: case1: case8: case15: j=C[0];k=D[0];for(i=0;i<27;i++){C[i]=C[i+1];D[i]=D[i+1];}C[27]=j;D[27]=k;break; default: j=C[0];k=D[0];x=C[1];y=D[1];for(i=0;i<26;i++){C[i]=C[i+2];D[i]=D[i+2];}C[26]=j;D[26]=k;C[27]=x;D[27]=y;} } voidCDesDlg: : convertselect2(charkey[16][48],char*C,char*D,intk)//置换选择二实现产16个子密钥结果存二维数组key {inti;intselect2[48]={14,17,11,24,1,5,3,28,15,6,21,10,23,19,12,4,26,8,16,7,27,20,13,2, 41,52,31,37,47,55,30,40,51,45,33,48,44,49,39,56,34,53,46,42,50,36,29,32}; for(i=0;i<48;i++){if(select2[i]<29)key[k][i]=C[select2[i]-1];elsekey[k][i]=D[select2[i]-29];} } voidCDesDlg: : seleteE(char*zikey,char*R)//置换选择E实现并将结果保存在zikey {chara[48];inti;intE[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,1}; for(i=0;i<48;i++){a[i]=R[E[i]-1];}for(i=0;i<48;i++){if(a[i]==zikey[i]){zikey[i]='0';}else{\zikey[i]='1';}} }#include voidCDesDlg: : S(char*R,char*zikey)//S盒实现并将顶点小说 结果保存在R {intS1[4][16]={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}; intS2[4][16]={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}; intS3[4][16]={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}; intS4[4][16]={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}; intS5[4][16]={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}; intS6[4][16]={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}; intS7[4][16]={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}; intS8[4][16]={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}; inti,j,a[6]; for(i=0;i<8;i++) {intx,y=0,z;for(j=0;j<6;j++){a[j]=zikey[6*i+j]-48;}x=a[0]*2+a[5];for(j=1;j<5;j++){y=y+a[j]*pow(2,4-j);} switch(i){case0: z=S1[x][y];break;case1: z=S2[x][y];break;case2: z=S3[x][y];break; case3: z=S4[x][y];break;case4: z=S5[x][y];break;case5: z=S6[x][y];break; case6: z=S7[x][y];break;case7: z=S8[x][y];break;} for(j=0;j<4;j++){if(z%2==0)R[4*i+3-j]='0';elseR[4*i+3-j]='1';z=z/2;} } } voidCDesDlg: : convertP(char*R)//置换选择P,将结果存至R {inti;chara[32];intP[]={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,22,11,4,25}; for(i=0;i<32;i++){a[i]=R[i];}for(i=0;i<32;i++)R[i]=a[P[i]-1]; } voidCDesDlg: : initconvertip1(char*miwen,char*R,char*L,intIP[8][8])//初始逆置换IP,求得密文并存至miwen {inti,j;chara[64]; for(i=0;i<64;i++){if(i<32){miwen[i]=L[i];}else{miwen[i]=R[i-32];}a[i]=miwen[i];} for(i=0;i<8;i++){for(j=0;j<8;j++){miwen[IP[i][j]-1]=a[8*i+j];}} } voidCDesDlg: : OnJIEMI()//解密按钮响应实现 {inti=0,j,k,x;intIP[8][8];charmiyao[64];charmiwen[64];charhuanyuan[64];charL[32],OldL[32],R[32],OldR[32]; charC[28],D[28];charzikey[48]; UpdateData(TRUE);m_huanyuan="";bytestring(m_miyao,miyao,0);convertselect1(C,D,miyao); for(i=0;i {for(j=0;j<64;j++){miwen[j]=m_miwen[64*i+j];}initconvertip(miwen,IP); for(x=0;x<64;x++){if(x<32)L[x]=miwen[x];elseR[x-32]=miwen[x];} for(k=15;k>=0;k--) {for(i=0;i<32;i++){OldL[i]=L[i];OldR[i]=R[i];} for(i=0;i<48;i++){zikey[i]=key[k][i];}seleteE(zikey,R);S(R,zikey);convertP(R); for(i=0;i<32;i++) {if(k>0){L[i]=OldR[i];if(OldL[i]==R[i]){R[i]='0';}elseR[i]='1';} else{if(OldL[i]==R[i]){L[i]='0';}elseL[i]='1';R[i]=OldR[i];} } }initconvertip1(huanyuan,R,L,IP); for(x=0;x {inta=0;for(i=0;i<8;i++){a=a+int(huanyuan[8*x+i]-48)*pow(2,7-i);}m_huanyuan=m_huanyuan+char(a);} }UpdateData(FALSE); } 3测试数据与实验结果 测试数据: 实验结果: 4.总结 通过实验了解了des的相关流程,熟悉了des的基本框架。 对mfc有了进一步的理解。 评分:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验二 DES加解密实现 实验 DES 解密 实现