现代密码学实验(题目+代码).doc_第1页
现代密码学实验(题目+代码).doc_第2页
现代密码学实验(题目+代码).doc_第3页
现代密码学实验(题目+代码).doc_第4页
现代密码学实验(题目+代码).doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实 验 报 告实验课程名称 现代密码学 学 院 理学院 年级 大三 专业班 信科0802 学 生 姓 名 王尔林 学 号 200810010210 开 课 时 间 2010 至 2011 学年第 二 学期 总 成 绩教师签名实验项目名 称实验一、古典密码(认识密码学)成绩一、实验目的 通过实现简单的古典密码算法,理解密码学的相关概念如明文(plaintext)、密文(ciphertext)、加密密钥(encryption key)、解密密钥(decryption key)、加密算法(encryption algorithm)、解密算法(decryption algorithm)等。二、实验内容 1)用CC+语言实现仿射变换(Affine)加/解密算法;2)用CC+语言实现统计26个英文字母出现的频率的程序;3)利用仿射变换加/解密程序对一段较长的英文文章进行加密,再利用统计软件对明文和密文中字母出现的频率进行统计并作对比,观察有什么规律。 放射变换:加密:解密:其中a, b为密钥,且gcd(a, 26)=1实验要求:加/解密程序对任意满足条件的a、b都能够处理。三、实验步骤(1)统计26个英文字母出现的频率的程序#include#include#includeusing namespace std;void main() ifstream in(a.txt); vector s; vector n(26,0); for(int i=0;ix; ) for(int i=0;i26;+i) if(int(x)=si) ni+; float sum=0.0; for(int j=0;j26;+j) sum+=nj; cout统计结果如下:endl; for(int k=0;k26;+k)/ nk=nk/sum; cout char(k+97)出现的概率为:nk/sumendl; /coutnkendl; (2)仿射变换加/解密程序对一段较长的英文文章进行加密#include#include#includeusing namespace std;/判断两个数是不是互素(辗转相除)/bool gcd(int a)int f=26,g,r;g=a;dor=f%g;f=g;g=r;while(r);if(f=1)return 1;elsereturn 0;/求逆/int inv(int a)int x,i;for(i=1;i=30;+i)if(26*i+1)%a=0)x=(26*i+1)/a;break;return x;/void main()cout请你选择操作密码的方式:endl 0表示加密 endl 1表示解密 z;if(z=0|z=1) /cout请输入密钥a和b:ab;if(a25)|(b25)couta,b的输入范围有错!endl;elseif(gcd(a)=0)cout密钥a有误,与26不互素endl;elseif(z=0)/加密算法 ifstream in(a.txt); ofstream out(b.txt); vector s; for(char x;inx; ) s.push_back(int(x); for(int i=0;is.size();+i) si=(a*(si-97)+b)%26; outchar(si+97) ; outendl;cout加密成功!明文请见“b.txt”endl; else/解密算法ifstream in(b.txt); ofstream out(a.txt); vector s; for(char x;inx; ) s.push_back(int(x); for(int i=0;is.size();+i) si=inv(a)*(si-97-b+26)%26; outchar(si+97) ;outendl;cout解密成功!密文请见“a.txt”endl;/elsecout所选操作无效!endl;四、实验结果及分析该程序是对文件进行操作,结果如下:(1) 统计26个英文字母出现的频率的程序(2) 仿射变换加/解密程序对一段较长的英文文章进行加密下面是文本内容:实验项目名 称实验二、流密码(认识LFSR及流密码)成绩一、实验目的通过实现简单的线性反馈移位寄存器(LFSR),理解LFSR的工作原理、本原多项式重要意义。二、实验内容1)利用CC+语言实现LFSR(其中LFSR已给定);2)通过不同初始状态生成相应的序列,并观察他们的周期有什么特点;3)利用生成的序列对文本进行加/解密(按对应位作模2加运算)。其中的LFSR为:三、实验步骤#include#include#include#includeusing namespace std;void main()/下面是密钥的产生/int a31=1,1,0,0,1;for(int k=5;k31;+k)ak=(ak-2+ak-5)%2;cout密钥如下:endl;for(int jj=0;jj31;+jj)coutajj ;coutendl;/int i=0,key;cout请选择操作方式: 1-加密 2-解密key;vector s,ss;if(key=1|key=2) if(key=1) cout加密成功,密文见out.txtc) int sum=0; for(int j=0;j32) i=(i+j-1)%31+1; else i=i+8; s.push_back(int(c)sum); for(int kk=0;kks.size();+kk) outchar(skk); if(key=2) cout解密成功,明文见in.txtc) int sum=0; for(int j=0;j32)i=(i+j-1)%31+1; else i=i+8; s.push_back(int(c)sum); for(int kk=0;kks.size();+kk) outchar(skk); /elsecout操作无效!endl;四、实验结果及分析在“in.txt”中输入如下内容:实验结果如下:得到密文“out.txt”如下:实验项目名 称实验三、流密码(生成非线性序列)成绩一、实验目的以LFSR序列为基础,生成非线性序列,并利用该序列对文件进行加密、解密。二、实验内容1)利用CC+实现Geffe序列生成器及J-K触发器;2)利用生成的非线性序列对文件进行加密、解密(按对应位作模2加运算)。三、实验步骤#include using namespace std;/return next stateunsigned char fn_feedback(unsigned char n, unsigned char c, unsigned char curr_state)unsigned char t = c & curr_state;unsigned char s = t & (unsigned char)128;/get first bitfor(int i =1; i n; i+)s = s ( (t i) & (unsigned char)128 );return (unsigned char)(curr_state (n-1); /return next statevoid lfsr_output_byte(int n, unsigned char c, unsigned char init_state, unsigned char output_bytes, int byte_length)unsigned char next_state = init_state;for(int i = 0; i byte_length; i+)unsigned char temp = (unsigned char)0;for(int j=0; j j );next_state = fn_feedback(n, c, next_state);output_bytesi = temp;/output a char type of data in binary wayvoid output_binary(unsigned char c)for(int i=0; i 8; i+)if( (c i) & (unsigned char)128 ) cout 1;elsecout 0;void Geffe(unsigned char buf, unsigned char buf1, unsigned char buf2, unsigned char b)for(int i=0; i 10; i+) bi=bufi*buf1i+buf2i*buf1i+buf2i;output_binary( (unsigned char)bi);void JK(unsigned char buf,unsigned char buf1,unsigned char c)for(int i=1; i 11; i+) ci=(bufi+buf1i+1)*ci-1+bufi;output_binary( (unsigned char)ci);void cypt(unsigned char b)unsigned char cypher10,cyph10;coutcypher;for(int j=0;cypherj!=0;j+)cyphj=cypherjbj;coutcyphj;coutendl;for(int k=0;kj;k+)cypherk=cyphkbk;coutcypherk;coutendl;int main(int argc, char* argv)unsigned char buf10,buf110,buf210,b100,c100;/ 函数f 初始状态152lfsr_output_byte(5,(unsigned char)144,(unsigned char)152, buf, 10);lfsr_output_byte(5,(unsigned char)44,(unsigned char)152, buf1, 10);lfsr_output_byte(5,(unsigned char)24,(unsigned char)152, buf2, 10);Geffe(buf,buf1,buf2,b);c0=0;JK(buf,buf1,c);coutendl;coutGeffe operate:endl;cypt(b);coutendl;coutJ-K operate:endl;cypt(c);return 0;四、实验结果及分析实验项目名 称实验五、RSA算法的实现成绩一、实验目的掌握并实现RSA算法。二、实验内容利用CC+实现RSA算法的加、解密运算。具体包括:1) 利用扩展的EUCLID计算 a mod n 的乘法逆元;2) Miller-Rabin素性测试算法对一个给定的大数进行测试;3) 实现的运算,并计算;4) 利用Fermat定理手工计算,并与3)计算的结果对比;5) 实现RSA算法。并对I LOVE THE PEOPLES REPUBLIC OF CHINA加解密。说明:为了方便实现,分组可以小一点,比如两个字母一组。字母及其数字编码字母及其数字编码空格 00N 14A 01O 15B 02P 16C 03Q 17D 04R 18E 05S 19F 06T 20G 07U 21H 08V 22I 09W 23J 10X 24K 11Y 25L 12Z 26M 13三、实验步骤#include #include #include using namespace std;int Euclid(int a,int n)/n大于aint x,y,r;x=n;y=a;for(int i=0;)if(y=0)return x;if(y=1)return y; r=x%y;x=y;y=r;double extenEuclid(double a,double n)/利用扩展的EUCLID计算 a mod n 的乘法逆元double x1=1,x2=0,x3=n,y1=0,y2=1,y3=a,Q;double t1,t2,t3;for(int i=0;) if(y3=0) return x3; coutno reverseendl; if(y3=1) return y2; Q=int(x3/y3); t1=x1-Q*y1; t2=x2-Q*y2; t3=x3-Q*y3; x1=y1;x2=y2;x3=y3; y1=t1;y2=t2;y3=t3;bool Rabin(int a,int n)/Miller-Rabin素性测试算法对一个给定的大数进行测试vector b;unsigned int N=n-1;for(int i=0,j=1; i+)if(jN)break;if( (N i) & (unsigned int)1 ) b.push_back(1);elseb.push_back(0);j*=2;/将n-1表示成二进制形式for(int k=0;kb.size();k+)coutbk;cout=0;ii-)x=d;d=(d*d)%n;if(d=1&x!=1&x!=n-1)return false;if(bii=1)d=(d*a)%n;if(d!=1)return false;return true;double quickindex1(double a,double m,double n)/实现am mod n 的运算vector b;unsigned double N=m;for(int ii=0,j=1;ii+)if(jN)break;if(Nii)& (unsigned double) 1)b.push_back(1);elseb.push_back(0);j*=2;double c=0,d=1;for(int i=b.size()-1;i=0;i-)c*=2;d=(d*d)-int(d*d)/n)*n;if(bi=1)c+=1;d=(d*a)-int(d*a)/n)*n;return d;void transfer(char cypher,double c)int m100=0;for(int i=0,j=0;cypherj!=0;i+=2)if(cypherj= )mi=0;mi+1=0;elsemi=cypherj-64;if(mi10)mi+1=mi;mi=0;elsemi+1=mi%10;mi=mi/10;j+;for(int k2=0;k22*strlen(cypher);k

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论