S-DES加密解密算法C++版

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

S-DES算法详解其实跟上一篇一样,这还是网络安全的作业…S-DES是DES算法的简化版,并没有什么实际使用的价值,只用于教学来理解DES算法的加密方法,这篇文章就是按照S-DES的算法来实际加密和解密的一段2进制数,演示了加密的运算过程.下面从准备知识开始先讲一下置换,举例说明,对”ABCDEFGH”做一下”82641753″置换的结果就是”HBFDAGEC”,这样就能看懂是怎么置换的了吧.然后是循环移位,继续举例,”ABCDEFGH”循环左移2位结果就是”CDEFGHAB”.还有个S盒的替代选择,具体到S-DES来说就是输入的四位数”ABCD”在S盒中找第AD行BC列的数字作为输出,比如0101输入S0(见下)的话就是第1(01)行第2(10)列(0-3行,0-3列),输出为1即01,再比如1001输入S0的话就是第3(11)行第0(00)列,输出为3即11.最后是按位异或,举例的话1^1=0,1^0=1,0^1=1,0^0=0,1100^1010=0110,其实这个大家都懂吧.好了,准备知识就这么多,下面开始正题:S-DES算法的输入是一个8位的明文或者密文组和一个10位的密钥,输出是一个8位的密文或者明文组。以下是S-DES所需的几个置换表P10{3,5,2,7,4,10,1,9,8,6}P8{6,3,7,4,8,5,10,9}注意这个置换选择输入10位输出8位P4{2,4,3,1}IP{2,6,3,1,4,8,5,7}IPI{4,1,3,5,7,2,8,6}EP{4,1,2,3,2,3,4,1}注意这个是扩展置换,输入4位输出8位以下是两个S盒S0:{1,0,3,2},{3,2,1,0},{0,2,1,3},{3,1,3,2},S1:{0,1,2,3},{2,0,1,3},{3,0,1,0},{2,1,0,3},接下来就是加密和解密算法首先讲子密钥的生成,子密钥在加密和解密算法中都有使用.10位密钥key=0111111101对key做P10置换得到1111110011记左半(高位)的为Lk=11111,右半(低位)为Rk=10011Lk和Rk均循环左移1位,得到Lk=11111,Rk=00111对Lk和Rk组合得到的1111100111做P8置换选择,得到子密钥K1=01011111Lk和Rk均再次循环左移2位,得到Lk=11111,Rk=11100对Lk和Rk组合得到的1111111100做P8置换选择,的到子密钥K2=11111100以上,通过密钥得到了算法所需的子密钥.下面是加密过程首先是初始置换对明文m=00010110做IP置换,得m’=01001001接下来是标准的Feistel密码结构,共有两次循环第一次循环记左半(高位)为Lm=0100,右半(低位)为Rm=1001对Rm做EP扩展置换,得Rm’=11000011Rm’与子密钥K1按位异或,得Rm’=10011100Rm’左半1001进入S0盒替代选择得11,右半1100进入S1盒替代选择的01,组合后得Rm’=1101对Rm’做P4置换,得Rm’=1101Rm’与Lm按位异或,得Lm’=1001Lm’与Rm(最开始的那个Rm)组合得到输出1001(Lm’)1001(Rm)至此完成第一次循环然后交换高低位,作为第二次循环的输入,即1001(Rm)1001(Lm’)作为输入开始第二次循环记左半为Ln=1001,右半为Rn=1001对Rn做EP扩展置换,得Rn’=11000011Rn’与子密钥K2按位异或,得Rn’=00111111Rn’左半0011进入S0盒替代选择得10,右半1111进入S1盒替代选择的11,组合后得Rn’=1011对Rn’做P4置换,得Rn’=0111Rn’与Ln按位异或,得Ln’=1110Ln’与Rn(最开始的那个Rn)组合得到输出1111(Ln’)1001(Rn)至此完成第二次循环最后进行逆初始置换对上面的输出m’=11111001做IPI置换得到密文m’=01110110OK,到这里就完成了将明文加密为密文,S-DES加密结束.下面开始解密,解密过程与加密基本一致,就是密钥使用顺序是相反的,第一次循环使用K2第二次循环使用K1首先还是初始置换对密文m=01110110做IP置换,得m’=11101001Feistel密码结构第一次循环记左半(高位)为Lm=1110,右半(低位)为Rm=1001对Rm做EP扩展置换,得Rm’=11000011Rm’与子密钥K2按位异或,得Rm’=00111111Rm’左半0011进入S0盒替代选择得10,右半1111进入S1盒替代选择的11,组合后得Rm’=1011对Rm’做P4置换,得Rm’=0111Rm’与Lm按位异或,得Lm’=1001Lm’与Rm(最开始的那个Rm)组合得到输出1001(Lm’)1001(Rm)至此完成第一次循环然后交换高低位,作为第二次循环的输入,即1001(Rm)1001(Lm’)作为输入开始第二次循环记左半为Ln=1001,右半为Rn=1001对Rn做EP扩展置换,得Rn’=11000011Rn’与子密钥K1按位异或,得Rn’=10011100Rn’左半1001进入S0盒替代选择得11,右半1100进入S1盒替代选择的01,组合后得Rn’=1101对Rn’做P4置换,得Rn’=1101Rn’与Ln按位异或,得Ln’=0100Ln’与Rn(最开始的那个Rn)组合得到输出0100(Ln’)1001(Rn)至此完成第二次循环最后进行逆初始置换对上面的输出m’=01001001做IPI置换得到明文m’=00010110这样就完成的S-DES的解密代码清单#includeiostream#includestringusingnamespacestd;//someconstsstaticintP10MAX=10;staticintP8MAX=10;staticintP4MAX=4;staticintIPMAX=8;staticintIPIMAX=8;staticintEPMAX=4;//twokeysK1andK2intK1=0;intK2=0;/*permutationfor10-bitkey*/staticintP10[]={3,5,2,7,4,10,1,9,8,6,'\0'};/*permutation....*/staticintP8[]={6,3,7,4,8,5,10,9,'\0'};staticintP4[]={2,4,3,1,'\0'};staticintIP[]={2,6,3,1,4,8,5,7,'\0'};staticintIPI[]={4,1,3,5,7,2,8,6,'\0'};staticintEP[]={4,1,2,3,2,3,4,1,'\0'};staticintS0[4][4]={{1,0,3,2},{3,2,1,0},{0,2,1,3},{3,1,3,2},};staticintS1[4][4]={{0,1,2,3},{2,0,1,3},{3,0,1,0},{2,1,0,3},};intGetlength(intp[]){inti=0;for(;p[i]!='\0';++i);returni;}intBinaryToDecimal(stringbinary){intresult=0;for(inti=0;ibinary.length();i++){result=2*result+(binary[i]-'0');}returnresult;}//printinbinarysothatwecanseetheresultvoidprintBin(intx,intn){intmask=1(n-1);while(mask0){((x&mask)==0)?printf(0):printf(1);mask=1;}coutendl;}//PermutefunctionintPermute(intinum,intp[],intpmax){intresult=0;intlength=Getlength(p);for(inti=0;ilength;++i){result=1;result|=(inum(pmax-p[i]))&1;}returnresult;}//FfunctionintF(intR,intK){intt=Permute(R,EP,EPMAX)^K;intt0=(t4)&0xf;intt1=t&0xf;t0=S0[((t0&0x8)2)|(t0&1)][(t01)&0x3];t1=S1[((t1&0x8)2)|(t1&1)][(t11)&0x3];t=Permute((t02)|t1,P4,P4MAX);returnt;}//fkfunctionintfk(intm,intk){intl=(m4)&0xf;intr=m&0xf;return((l^F(r,k))4)|r;}//switchfunctionintSW(intx){return((x&0xf)4)|((x4)&0xf);}//encryptionfor8-bitplaintextintencrypt(intm){m=Permute(m,IP,IPMAX);m=fk(m,K1);m=SW(m);m=fk(m,K2);m=Permute(m,IPI,IPIMAX);returnm;}//decryptionfor8-bitciphertextintdecrypt(intm){m=Permute(m,IP,IPMAX);m=fk(m,K2);m=SW(m);m=fk(m,K1);m=Permute(m,IPI,IPIMAX);returnm;}//useKeyasaparametertogetK1andK2voidSDES(intK){intt1=0,t2=0;K=Permute(K,P10,P10MAX);//get5-bitt1=(K5)&0x1f;t2=K&0x1f;//LS-1t1=((t1&0xf)1)|((t1&0x10)4);t2=((t2&0xf)1)|((t2&0x10)4);K1=Permute((t15)|t2,P8,P8MAX);//LS-2t1=((t1&0x07)2)|((t1&0x18)3);t2=((t2&0x07)2)|((t2&0x18)3);K2=Permute((t15)|t2,P8,P8MAX);}//thetestmainfunctionisfollowingintmain(){stringplaintext,key,ciphertext;intst;for(;;){printf(************************\n);printf(***1加密***\n);printf(***2解密***\n);printf(***3退出***\n);printf(************************\n);printf(请输入你的操作:);scanf(%d,&st);if(st==1){cout请输入明文:;cinplaintext;cout请输入密钥:;cinkey;SDES(BinaryToDecimal(key));cout对于明文plaintext经SDES加密后,得到的密文为:;printBin(encrypt(BinaryToDecimal(plaintext)),8);cout\n\nendl;}elseif(st==2){cout请输入密文:;cinciphertext;cout请输入密钥:;cinkey;SDES(BinaryToDecimal(key));cout对于ciphertext经SDES解密后,得到的明文为:;printBin(decrypt(BinaryToDecimal(ciphertext)),8);cou

1 / 8
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功