网络11-211034120239王鹏飞2014.3.8指导老师:李家兰11《网络安全》实验指导书对称加密算法一、实验目的1、熟悉和掌握对称加密算法的原理及其一般过程;2、掌握对称加密算法的基本方法:替代(substitute)与置换(transposition);3、掌握使用一定的编码开发工具(对具体的开发平台和工具不作要求)。二、实验内容1、替代加密法1)编程实现课本习题2.1的线形替代加密方法的破解(提示:可使用穷举法);(已知替代变换函数f(a)=akmod26,且9kmod26=15,试计算k)2)破解后,实现该方法的加密运算(输入明文,输出密文)和解密运算(输入密文,输出明文)(解密运算提示:设密钥为k,密文为c,明文为m,则有m*kmod26=c,因为m26且唯一,同样可使用穷举法搜索出m);3)加密字符串“substitute”,输出密文;4)(可选)推导解密密码本,即明文与密文字母的一一对应关系。2、置换加密法1)给定置换表“86427531”,编程实现基于该表的加密运算;2)加密字符串“transposition”,输出密文(提示:如字符串长度不是8的倍数,则需在字符串结尾后填充空格,使得其总长度为8的倍数);3)参照课本表2-1和表2-8的关系,推导逆置换表,并编程实现相应的解密运算。三、程序清单1、初始并定义程序所用的主要的参数boolfound=false;//标记k是否被求出boolff=false;//标记密码本是否被求出staticintCodeBook[26];//替代加密法的明文本staticcharCodeBookStr[26];//替代解密法的密码本inttrsp[8]={7,5,3,1,6,4,2,0};//置换加密所用的数组intrev_trsp[8]={7,3,6,2,5,1,4,0};//置换解密所用的数组staticcharc[26];//由明文转的密文stringcc;//输入的密文intk;stringaa;//输入的明文22、替代加/解密算法1)计算kvoid_mod_k()//求出K{inti=1;while(!found){if(9*i%26==15){found=true;k=i;}i++;}coutk=kendl;}2)计算解密密码本void_find_ma()//求出解密密码本{if(!found){coutendlnotfindkendl;coutendl小提示:;cout请先执行上层的步骤1求出kendl;return;}ff=true;inti=1;boolf=false;while(!f){if(15*i%26==9)f=true;i++;}intkd=i-1;//Des:x=y*kdmod26coutendlk=k;cout1/k=kdendlendl;intt;cout解密密码本为:;charc;for(i=0;i26;i++){t=i*kd%26;3CodeBook[i]=t;c=i+97;coutc;}coutendl;for(i=0;i26;i++){t=i*kd%26;CodeBook[i]=t;c=t+97;coutc;CodeBookStr[i]=c;}coutendl;}3)替代加密算法void_subst(stringaa,intlen)//替代加密{inti;for(i=0;ilen;i++){if(aa.at(i)='1'||aa.at(i)='9'){coutendl小提示:;cout此加密法只能对字母进行加密!endl;return;}}if(!found){coutendlnotfindkendl;coutendl小提示:;cout请先执行上层的步骤1求出kendl;return;}coutendl密码为:;for(i=0;ilen;i++){c[i]=aa.at(i);intm=c[i]-97;m=m*k%26;//Encryptm+=97;c[i]=m;coutc[i];4}coutendl;}4)替代穷举解密算法void_oneto_one(intlen)//穷举法解码{if(!found){coutendlnotfindkendl;coutendl小提示:;cout请先执行上层的步骤1求出kendl;return;}inti;for(i=0;ilen;i++){if(cc.at(i)='1'||cc.at(i)='9'){coutendl小提示:;cout此解密法只能对字母进行解密!endl;return;}}coutendl明文为:;for(i=0;ilen;i++){c[i]=cc.at(i);intm=c[i]-97;boolf=false;inta=0;while(!f){if(m==a*k%26)f=true;a++;}a+=96;//97-1c[i]=a;coutc[i];}coutendl;}5)替代密码本解密算法void_ben(intlen)//密码本解密5{inti;for(i=0;ilen;i++){if(cc.at(i)='1'||cc.at(i)='9'){coutendl小提示:;cout此解密法只能对字母进行解密!endl;return;}}if(!found){coutendlnotfindkendl;coutendl小提示:;cout请先执行上层的步骤1求出kendl;return;}if(!ff){coutendlnotfind密码本endl;coutendl小提示:;cout请先执行上层的步骤2求出密码本endl;return;}coutendl明文为:;for(i=0;ilen;i++){intidx=cc.at(i)-97;coutCodeBookStr[idx];}coutendl;}3、置换加/解密算法1)置换加密算法void_trans_a(stringaa,intlen)//置换加密{intl=8-len%8;strings=aa;while(l){s+=;l--;}l=s.length()/8;6coutendl密码为:;strings1,s2;intj,k,n;for(j=0;jl;j++){s1=s.substr(j*8,8);s2=;for(k=0;k8;k++){n=trsp[k];s2+=s1.substr(n,1);}couts2;}}2)置换解密算法void_trans_j(intlen)//置换解密{if(len%8){coutendl小提示:;cout请输入长度为8的倍数的字符串解密endl;return;}coutendl明文为:;strings=cc;strings1,s2;intj,k,n,l=len/8;for(j=0;jl;j++){s1=s.substr(j*8,8);s2=;for(k=0;k8;k++){n=rev_trsp[k];s2+=s1.substr(n,1);}couts2;}}4、程序处理流程7四、运行结果1、计算k2、计算替代解密密码本3、加密84、解密