您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 现代密码学实验(题目+代码)
实验报告实验课程名称现代密码学学院理学院年级大三专业班信科0802学生姓名王尔林学号200810010210开课时间2010至2011学年第二学期总成绩教师签名实验项目名称实验一、古典密码(认识密码学)成绩一、实验目的通过实现简单的古典密码算法,理解密码学的相关概念如明文(plaintext)、密文(ciphertext)、加密密钥(encryptionkey)、解密密钥(decryptionkey)、加密算法(encryptionalgorithm)、解密算法(decryptionalgorithm)等。二、实验内容1)用C\C++语言实现仿射变换(Affine)加/解密算法;2)用C\C++语言实现统计26个英文字母出现的频率的程序;3)利用仿射变换加/解密程序对一段较长的英文文章进行加密,再利用统计软件对明文和密文中字母出现的频率进行统计并作对比,观察有什么规律。放射变换:加密:26mod,bammEcba解密:26mod1,bcacDmba其中a,b为密钥,25,0ba,且gcd(a,26)=1实验要求:加/解密程序对任意满足条件的a、b都能够处理。三、实验步骤(1)统计26个英文字母出现的频率的程序#includeiostream#includefstream#includevectorusingnamespacestd;voidmain(){ifstreamin(a.txt);vectorints;vectorintn(26,0);for(inti=0;i26;++i)s.push_back(97+i);for(charx;inx;)for(inti=0;i26;++i)if(int(x)==s[i]){n[i]++;}floatsum=0.0;for(intj=0;j26;++j)sum+=n[j];cout统计结果如下:endl;for(intk=0;k26;++k){//n[k]=n[k]/sum;cout''char(k+97)出现的概率为:n[k]/sumendl;//coutn[k]endl;}(2)仿射变换加/解密程序对一段较长的英文文章进行加密#includeiostream#includefstream#includevectorusingnamespacestd;//////////判断两个数是不是互素(辗转相除)////////boolgcd(inta){intf=26,g,r;g=a;do{r=f%g;f=g;g=r;}while(r);if(f==1)return1;elsereturn0;}//////////////////求逆//////intinv(inta){intx,i;for(i=1;i=30;++i)if((26*i+1)%a==0){x=(26*i+1)/a;break;}returnx;}//////////////////////////////////////////////////////////voidmain(){cout请你选择操作密码的方式:endl0—表示加密endl1—表示解密endl;intz;cinz;if(z==0||z==1){//////////////////////////////////////////cout请输入密钥a和b:endl;inta,b;cinab;if((a1||a25)||(b0||b25))couta,b的输入范围有错!endl;elseif(gcd(a)==0)cout密钥a有误,与26不互素endl;else{if(z==0)////加密算法{ifstreamin(a.txt);ofstreamout(b.txt);vectorints;for(charx;inx;)s.push_back(int(x));for(inti=0;is.size();++i){s[i]=(a*(s[i]-97)+b)%26;outchar(s[i]+97)'';}outendl;cout加密成功!明文请见“b.txt”endl;}else////解密算法{ifstreamin(b.txt);ofstreamout(a.txt);vectorints;for(charx;inx;)s.push_back(int(x));for(inti=0;is.size();++i){s[i]=inv(a)*(s[i]-97-b+26)%26;outchar(s[i]+97)'';}outendl;cout解密成功!密文请见“a.txt”endl;}}////////////////////////////////////////}elsecout所选操作无效!endl;}}四、实验结果及分析该程序是对文件进行操作,结果如下:(1)统计26个英文字母出现的频率的程序(2)仿射变换加/解密程序对一段较长的英文文章进行加密下面是文本内容:实验项目名称实验二、流密码(认识LFSR及流密码)成绩一、实验目的通过实现简单的线性反馈移位寄存器(LFSR),理解LFSR的工作原理、本原多项式重要意义。二、实验内容1)利用C\C++语言实现LFSR(其中LFSR已给定);2)通过不同初始状态生成相应的序列,并观察他们的周期有什么特点;3)利用生成的序列对文本进行加/解密(按对应位作模2加运算)。其中的LFSR为:三、实验步骤#includeiostream#includevector#includecmath#includefstreamusingnamespacestd;voidmain(){///下面是密钥的产生/////////////inta[31]={1,1,0,0,1};for(intk=5;k31;++k)a[k]=(a[k-2]+a[k-5])%2;cout密钥如下:endl;for(intjj=0;jj31;++jj)couta[jj]'';coutendl;//////////////////////inti=0,key;cout请选择操作方式:1-加密2-解密endl;cinkey;vectorints,ss;if(key==1||key==2){if(key==1){cout加密成功,密文见out.txtendl;ifstreamin(in.txt);ofstreamout(out.txt);charc;while(inc){intsum=0;for(intj=0;j8;++j)sum+=pow(2,7-j)*a[(i+j)%31];if(i+j32)i=(i+j-1)%31+1;elsei=i+8;s.push_back((int(c))^sum);}for(intkk=0;kks.size();++kk){outchar(s[kk]);}}if(key==2){cout解密成功,明文见in.txtendl;ifstreamin(out.txt);ofstreamout(in.txt);charc;while(inc){intsum=0;for(intj=0;j8;++j)sum+=pow(2,7-j)*a[(i+j)%31];if(i+j32)i=(i+j-1)%31+1;elsei=i+8;s.push_back((int(c))^sum);}for(intkk=0;kks.size();++kk){outchar(s[kk]);}}////////////}elsecout操作无效!endl;}四、实验结果及分析在“in.txt”中输入如下内容:实验结果如下:得到密文“out.txt”如下:实验项目名称实验三、流密码(生成非线性序列)成绩一、实验目的以LFSR序列为基础,生成非线性序列,并利用该序列对文件进行加密、解密。二、实验内容1)利用C\C++实现Geffe序列生成器及J-K触发器;2)利用生成的非线性序列对文件进行加密、解密(按对应位作模2加运算)。三、实验步骤#includeiostreamusingnamespacestd;//returnnextstateunsignedcharfn_feedback(unsignedcharn,unsignedcharc,unsignedcharcurr_state){unsignedchart=c&curr_state;unsignedchars=t&(unsignedchar)128;//getfirstbitfor(inti=1;in;i++){s=s^((ti)&(unsignedchar)128);}return(unsignedchar)((curr_state1)|(s(n-1)));//returnnextstate}voidlfsr_output_byte(intn,unsignedcharc,unsignedcharinit_state,unsignedcharoutput_bytes[],intbyte_length){unsignedcharnext_state=init_state;for(inti=0;ibyte_length;i++){unsignedchartemp=(unsignedchar)0;for(intj=0;j8;j++){temp=temp|((next_state&(unsignedchar)128)j);next_state=fn_feedback(n,c,next_state);}output_bytes[i]=temp;}}//outputachartypeofdatainbinarywayvoidoutput_binary(unsignedcharc){for(inti=0;i8;i++){if((ci)&(unsignedchar)128)cout1;elsecout0;}}voidGeffe(unsignedcharbuf[],unsignedcharbuf1[],unsignedcharbuf2[],unsignedcharb[]){for(inti=0;i10;i++){b[i]=buf[i]*buf1[i]+buf2[i]*buf1[i]+buf2[i];output_binary((unsignedchar)b[i]);}}voidJK(unsignedcharbuf[],unsignedcharbuf1[],unsignedcharc[]){for(inti=1;i11;i++){c[i]=(buf[i]+buf1[i]+1)*c[i-1]+buf[i];output_binary((unsignedchar)c[i]);}}voidcypt(unsignedcharb[]){unsignedcharcypher[10],cyph[10];coutinputthecyphertext:;cincypher;for(intj=0;cypher[j]!='\0';j++){cyph[j]=cypher[j]^b[j];coutcyph[j];}coutendl;for(intk=0;kj;k++){cypher[k]=cyph[k]^b[k];coutcypher[k];}coutendl;}intmain(intargc,char*argv[]){unsignedcharbuf[10],buf1[10],buf2[10],b[100],c[100];//函数f初始状态152lfsr_output_byte(5,(unsignedchar)144,(unsignedchar)152,
本文标题:现代密码学实验(题目+代码)
链接地址:https://www.777doc.com/doc-5362679 .html