DES实验.docx
- 文档编号:28657273
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:23
- 大小:29.17KB
DES实验.docx
《DES实验.docx》由会员分享,可在线阅读,更多相关《DES实验.docx(23页珍藏版)》请在冰豆网上搜索。
DES实验
实验目的
学习DES算法原理,在VC6.0上利用C++语言实现这一算法,并证明算法的正确性。
实验原理
DES的安全性,主要来源于以下几个方面:
加密之初提供一个64位的密钥(去除8位奇偶校验位后,用于加密解密的是56位),而真正加密时,用到了16个48位的子密钥,子密钥的形成过程用到反反复复的移位和数组的置换,因此仅获得了最初的密钥仍然不能破解密文;同样在利用16个子密钥对64位的0、1序列加密时,也不是简单的异或,而是进行多次复杂的数组扩充,以及元素位置置换,因此即使获得了16个子密钥还是不能破解原文。
DES子密钥的获得:
56位的密钥(K0)→左边为C0,右边为D0→将C0、D0移位I(i)次(i取值0-15)→C[16]、D[16]→将C[i]D[i]作为一个整体按PC-2变换,得到48位的K[i]。
利用K[i]加密的过程:
通过键盘输入8个字符,将字符对应的ASCII码值转换成0、1序列,作为待加密序列Y→通过IP将Y变成Y0→将变换后的数据Y0分为两部分,开始的32位称为L,最后的32位称为R→(*)将R通过E扩展成48位的序列NR→将NR与K[i](i的初始值为0,直到i=15结束)相异或结果仍然保存在NR→将NR分为8个6位长的部分,第1位到第6位称为B[0],第7位到第12位称为B[1],依此类推,第43位到第48位称为B[7→将B[J]的第1位和第6位组合为一个2位长度的变量M,M作为在S[J]中的行号。
将B[J]的第2位到第5位组合,作为一个4位长度的变量N,N作为在S[J]中的列号。
其中S[J]是一个有64个元素的序列,即S是一个二维数组,通过计算得来的M,N,以及当前B的序号J(J取值0-7),可以查询到S中对应的元素,并将S中的该元素,转换成二进制的四位0、1序列,存放在NDS中相应的四位中→将NDS与L相异或,结果仍然保留在NDS中→将R值赋给L,将NDS赋给R,回到(*)处开始循环→将最后一次得到的L、R作为一个整体利用序列IP_1扩展成64位的加密数据M。
解密的过程:
M利用逆IP_1变换得到L、R→(*)R赋值给tL,L值赋值给tR→tR按E扩展为NR→NR与K[i](i初始值为15,以后递减直到0结束)异或,结果保存在NR→利用S查询的方法得到NDS→将tL与NDS相异或,结果保留在tL中→将tL赋值给L,将tR赋值给R,回到(*)处开始循环→将最终的L、R按照逆变换IP得到原数据A。
类与函数的说明。
全局函数:
voidgetrol(int*p,inti)
实现p指向的数组的循环左移i位。
voidgetyh(int*p1,int*p2,intnum)
实现p1p2的异或,将结果保留在p1,num为数组的位数。
voidgetbi(intdcm,int*p)
实现将十进制的数dcm转换成4位二进制的数,并存放在p开始的4个连续的地址内。
voidgetdt1(intE[],intS[][64],int*k,int*L,int*R)
利用后一次的L、R得到上一次的L、R。
其中E,S,K的含义同加密时的矩阵的含义。
类
des:
构造函数获得16个子密钥。
des2:
构造函数实现原始数据的输入,与加密后密文M的获得。
voiddes2:
:
giveM(int*p)将密文M输出到指针p指向的数组
ides:
构造函数实现解密获得A。
voidides:
:
giveA(int*p)将解密厚的A输出到p指向的数组
实验结果
程序
#include
#include
voidgetrol(int*p,inti)//循环左移的函数P指向待移位的数组i是移位的数目如果i非1则按移两位处理
{
if(i==1)
{
inttemp=*p;
intn;
for(n=0;n<=26;n++)
{
*(p+n)=*(p+n+1);
}
*(p+27)=temp;
}
else
{
inttemp0=*p;
inttemp1=*(p+1);
intn;
for(n=0;n<=25;n++)
{
*(p+n)=*(p+n+2);
}
*(p+26)=temp0;
*(p+27)=temp1;
}
}
voidgetyh(int*p1,int*p2,intnum)//实现异或。
{
inttemp=0;
for(inti=0;i<=(num-1);i++)
{
temp=*(p1+i)+*(p2+i);
temp=temp-(temp/2)*2;
*(p1+i)=temp;
}
}
voidgetbi(intdcm,int*p)//实现十进制转成二进制。
dcm是十进制数,二进制放在p开始的四个地址
{
inttemp1=dcm;
inttemp2;
for(inti=3;i>=0;i--)
{
temp2=temp1/2;
*(p+i)=temp1-temp2*2;
temp1=temp2;
}
}
voidgetdt1(intE[],intS[][64],int*k,int*L,int*R)//利用后一次LR必要的密码信息,得到上一次的LR
{
inti,j;
intNR[48];
intNDS[32];
inttR[32];
inttL[32];
inth,l,temp;
for(i=0;i<=31;i++)
{
tR[i]=*(L+i);
}
for(i=0;i<=31;i++)
{
tL[i]=*(R+i);
}
for(i=0;i<=47;i++)
{
NR[i]=tR[E[i]];
}
getyh(NR,k,48);
for(j=0;j<=7;j++)
{
h=NR[0+6*j]*2+NR[5+6*j];
l=NR[1+6*j]*8+NR[2+6*j]*4+NR[3+6*j]*2+NR[4+6*j];
temp=S[j][h*16+l];
getbi(temp,(NDS+j*4));
}
getyh(tL,NDS,32);
for(i=0;i<=31;i++)
{
*(L+i)=tL[i];
}
for(i=0;i<=31;i++)
{
*(R+i)=tR[i];
}
}
voidshowt(inta[])//输出a,0、1数组代表的八个字符
{
charc;
inttemp;
inti,j,n;
for(i=0;i<=7;i++)
{
temp=0;
for(j=0;j<=7;j++)
{
temp=temp+a[i*8+j]*(pow(2,(7-j)));
}
c=temp;
cout< } } classides;//用来解密 classdes2;//用来利用des的密钥产生加密文 classdes//用来产生16个密钥 { private: intK0[56];//最原始的密码,没有奇偶校验位。 intC0[28],D0[28];//第一次将密码分组 intC[16][28],D[16][28];//以后将密码分组 intK[16][48];//最终的密码 intpc2[48]; intI[16];//移位的位数 public: des(); frienddes2; friendides; }; des: : des() { inttempI[16]={1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1}; for(intn=0;n<=15;n++) { I[n]=tempI[n]; } //setpc2() inttemppc2[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,55,34,53,46,42,50,36,29,32}; for(n=0;n<=47;n++) { pc2[n]=temppc2[n]; } //setK0() inttempK0[56]={1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1, 0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0}; for(n=0;n<=55;n++) { K0[n]=tempK0[n]; } //getC0() for(n=0;n<=27;n++) { C0[n]=K0[n];//C0等于K0的前半数据 } //getD0() for(n=0;n<=27;n++) { D0[n]=K0[n+28];//D0等于K0的后半数据 } //getC() inttempC[28]; for(n=0;n<=27;n++) { tempC[n]=C0[n]; } getrol(tempC,I[0]); for(n=0;n<=27;n++) { C[0][n]=tempC[n]; } for(inti=1;i<=15;i++) { getrol(tempC,I[i]); for(n=0;n<=27;n++) { C[i][n]=tempC[n]; } } //getD() inttempD[28]; for(n=0;n<=27;n++) { tempD[n]=D0[n]; } getrol(tempD,I[0]); for(n=0;n<=27;n++) { D[0][n]=tempD[n]; } for(i=1;i<=15;i++) { getrol(tempD,I[i]); for(n=0;n<=27;n++) { D[i][n]=tempD[n]; } } //getK() intCD[56]; for(n=0;n<=15;n++) { for(i=0;i<=27;i++) { CD[i]=C[n][i]; } for(i=28;i<=55;i++) { CD[i]=D[n][i-28]; } for(i=0;i<=47;i++) { K[n][i]=CD[pc2[i]]; } } } classdes2 { public: des2(); voidgiveM(int*p); private: charc[8]; intY0[64]; intIP[64]; intS[8][64]; intE[48]; intIP_1[64]; intL[32]; intR[32]; intNR[48]; intNDS[32]; intY[64]; intM[64]; intK[16][48]; }; des2: : des2() {inti,j; inttemp1,temp2; cout<<"输入内容(8个符号)"< for(i=0;i<=7;i++){cin>>c[i];} for(i=0;i<=7;i++) { temp1=c[i]; for(j=0;j<=7;j++) { temp2=temp1/2; Y0[i*8+7-j]=temp1%2; temp1=temp2; } } //setS() InttempS[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,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}, {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}, }; for(i=0;i<=7;i++) { for(j=0;j<=63;j++) { S[i][j]=tempS[i][j]; } } //setE() inttempE[48]={0,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,0,1}; for(i=0;i<=47;i++) { E[i]=tempE[i]; } //setIP_1() inttempIP_1[64]={40,8,48,16,56,24,0,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<=63;i++) { IP_1[i]=tempIP_1[i]; } //setIP() inttempIP[64]={19,50,42,34,11,18,10,2,60,51,44,36,28,20,12,7,62,54,46,38,30,17,14,6,0, 56,48,40,32,24,16,8,57,49,41,33,25,22,9,1,59,52,43,35,27,58,26,3,61,53,45,37,29,21,13,5,63,55,47,39,31,23,15,4}; for(i=0;i<=63;i++) { IP[i]=tempIP[i]; } //getKLR() intn; inth,l; inttemp; desjm; for(i=0;i<=15;i++) { for(j=0;j<=47;j++) { K[i][j]=jm.K[i][j]; } } //getM() for(i=0;i<=63;i++) { Y[i]=Y0[IP[i]];//将原始数据经过IP进行第一次置乱 } for(i=0;i<=31;i++) { L[i]=Y[i]; } for(i=0;i<=31;i++) { R[i]=Y[i+32]; } for(n=0;n<=15;n++) { for(i=0;i<=47;i++) { NR[i]=R[E[i]]; } getyh(NR,jm.K[n],48); for(j=0;j<=7;j++) { h=NR[0+6*j]*2+NR[5+6*j]; l=NR[1+6*j]*8+NR[2+6*j]*4+NR[3+6*j]*2+NR[4+6*j]; temp=S[j][h*16+l]; getbi(temp,(NDS+j*4)); } getyh(NDS,L,32); for(i=0;i<=31;i++) { L[i]=R[i];} for(i=0;i<=31;i++) { R[i]=NDS[i]; } } inttempM[64]; for(i=0;i<=31;i++) { tempM[i]=L[i]; } for(i=32;i<=63;i++) { tempM[i]=R[i-32]; } for(i=0;i<=63;i++) { M[i]=tempM[IP_1[i]]; } } voiddes2: : giveM(int*p) { inti; for(i=0;i<=63;i++) { *(p+i)=M[i]; } } classides { public: intE[48]; intS[8][64]; intIP_1[64]; intIP[64]; intK[16][48]; intA[64]; ides(); voidgetA(intM[]); voidgiveA(int*p); }; ides: : ides() { inti,j; //setE() inttempE[48]={0,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,0,1}; for(i=0;i<=47;i++) { E[i]=tempE[i]; } //setS() inttempS[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,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}, {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}, }; for(i=0;i<=7;i++) { fo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DES 实验