现代密码学实验题目代码doc.docx
《现代密码学实验题目代码doc.docx》由会员分享,可在线阅读,更多相关《现代密码学实验题目代码doc.docx(46页珍藏版)》请在冰豆网上搜索。
现代密码学实验题目代码doc
****大学
学生实验报告
实验课程名称现代密码学
学院**年级**专业班*********
学生姓名*******学号********
开课时间200-至200-学年第二学期
总成绩
教师签名
实验项目
名称
实验一、古典密码(认识密码学)
成绩
一、实验目的
通过实现简单的古典密码算法,理解密码学的相关概念如明文(plaintext)、密文(ciphertext)、加密密钥(encryptionkey)、解密密钥(decryptionkey)、加密算法(encryptionalgorithm)、解密算法(decryptionalgorithm)等。
二、实验内容
1)用C\C++语言实现仿射变换(Affine)加/解密算法;2)用C\C++语言实现统计26个英文字母出现的频率的程序;3)利用仿射变换加/解密程序对一段较长的英文文章进行加密,再利用统计软件对明文和密文中字母出现的频率进行统计并作对比,观察有什么规律。
放射变换:
加密:
解密:
其中a,b为密钥,
,且gcd(a,26)=1
实验要求:
加/解密程序对任意满足条件的a、b都能够处理。
三、实验步骤
(1)统计26个英文字母出现的频率的程序
#include
#include
#include
usingnamespacestd;
voidmain(){
ifstreamin("a.txt");
vectors;
vectorn(26,0);
for(inti=0;i<26;++i)
s.push_back(97+i);
for(charx;in>>x;)
for(inti=0;i<26;++i)
if(int(x)==s[i]){
n[i]++;}
floatsum=0.0;
for(intj=0;j<26;++j)
sum+=n[j];
cout<<"统计结果如下:
"<for(intk=0;k<26;++k){
//n[k]=n[k]/sum;
cout<<''<"<//cout<}
(2)仿射变换加/解密程序对一段较长的英文文章进行加密
#include
#include
#include
usingnamespacestd;
//////////判断两个数是不是互素(辗转相除)////////
boolgcd(inta){
intf=26,g,r;
g=a;
do{
r=f%g;
f=g;
g=r;
}while(r);
if(f==1)
return1;
else
return0;
}
//////////////////求逆//////
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<<"请你选择操作密码的方式:
"<intz;
cin>>z;
if(z==0||z==1)
{
//////////////////////////////////////////
cout<<"请输入密钥a和b:
"<inta,b;
cin>>a>>b;
if((a<1||a>25)||(b<0||b>25))
cout<<"a,b的输入范围有错!
"<else
if(gcd(a)==0)
cout<<"密钥a有误,与26不互素"<else
{
if(z==0)////加密算法
{
ifstreamin("a.txt");
ofstreamout("b.txt");
vectors;
for(charx;in>>x;)
s.push_back(int(x));
for(inti=0;i{
s[i]=(a*(s[i]-97)+b)%26;
out<}out<明文请见“b.txt”"<}
else////解密算法
{
ifstreamin("b.txt");
ofstreamout("a.txt");
vectors;
for(charx;in>>x;)
s.push_back(int(x));
for(inti=0;i{
s[i]=inv(a)*(s[i]-97-b+26)%26;
out<}out<密文请见“a.txt”"<}
}
////////////////////////////////////////
}
else
cout<<"所选操作无效!
"<}
}四、实验结果及分析
该程序是对文件进行操作,结果如下:
(1)统计26个英文字母出现的频率的程序
(2)仿射变换加/解密程序对一段较长的英文文章进行加密
下面是文本内容:
实验项目
名称
实验二、流密码(认识LFSR及流密码)
成绩
一、实验目的
通过实现简单的线性反馈移位寄存器(LFSR),理解LFSR的工作原理、本原多项式重要意义。
二、实验内容
1)利用C\C++语言实现LFSR(其中LFSR已给定);2)通过不同初始状态生成相应的序列,并观察他们的周期有什么特点;3)利用生成的序列对文本进行加/解密(按对应位作模2加运算)。
其中的LFSR为:
三、实验步骤
#include
#include
#include
#include
usingnamespacestd;
voidmain()
{
///下面是密钥的产生/////////////
inta[31]={1,1,0,0,1};
for(intk=5;k<31;++k)
a[k]=(a[k-2]+a[k-5])%2;
cout<<"密钥如下:
"<for(intjj=0;jj<31;++jj)
cout<cout<//////////////////////
inti=0,key;
cout<<"请选择操作方式:
1-加密2-解密"<cin>>key;
vectors,ss;
if(key==1||key==2)
{
if(key==1)
{cout<<"加密成功,密文见out.txt"<ifstreamin("in.txt");
ofstreamout("out.txt");
charc;
while(in>>c)
{
intsum=0;
for(intj=0;j<8;++j)
sum+=pow(2,7-j)*a[(i+j)%31];
if(i+j>32)
i=(i+j-1)%31+1;
else
i=i+8;
s.push_back((int(c))^sum);
}
for(intkk=0;kk{
out<}
}
if(key==2)
{
cout<<"解密成功,明文见in.txt"<ifstreamin("out.txt");
ofstreamout("in.txt");
charc;
while(in>>c)
{
intsum=0;
for(intj=0;j<8;++j)
sum+=pow(2,7-j)*a[(i+j)%31];
if(i+j>32)
i=(i+j-1)%31+1;
else
i=i+8;
s.push_back((int(c))^sum);
}
for(intkk=0;kk{
out<}
}
////////////
}
else
cout<<"操作无效!
"<}
四、实验结果及分析
在“in.txt”中输入如下内容:
实验结果如下:
得到密文“out.txt”如下:
实验项目
名称
实验三、流密码(生成非线性序列)
成绩
一、实验目的
以LFSR序列为基础,生成非线性序列,并利用该序列对文件进行加密、解密。
二、实验内容
1)利用C\C++实现Geffe序列生成器及J-K触发器;2)利用生成的非线性序列对文件进行加密、解密(按对应位作模2加运算)。
三、实验步骤
#include
usingnamespacestd;
//returnnextstate
unsignedcharfn_feedback(unsignedcharn,
unsignedcharc,
unsignedcharcurr_state)
{
unsignedchart=c&curr_state;
unsignedchars=t&(unsignedchar)128;//getfirstbit
for(inti=1;i{
s=s^((t<
}
return(unsignedchar)((curr_state<<1)|(s>>(n-1)));//returnnextstate
}
voidlfsr_output_byte(intn,
unsignedcharc,
unsignedcharinit_state,
unsignedcharoutput_bytes[],
intbyte_length)
{
unsignedcharnext_s