现代密码学实验题目代码doc.docx

上传人:b****1 文档编号:354494 上传时间:2022-10-09 格式:DOCX 页数:46 大小:99.22KB
下载 相关 举报
现代密码学实验题目代码doc.docx_第1页
第1页 / 共46页
现代密码学实验题目代码doc.docx_第2页
第2页 / 共46页
现代密码学实验题目代码doc.docx_第3页
第3页 / 共46页
现代密码学实验题目代码doc.docx_第4页
第4页 / 共46页
现代密码学实验题目代码doc.docx_第5页
第5页 / 共46页
点击查看更多>>
下载资源
资源描述

现代密码学实验题目代码doc.docx

《现代密码学实验题目代码doc.docx》由会员分享,可在线阅读,更多相关《现代密码学实验题目代码doc.docx(46页珍藏版)》请在冰豆网上搜索。

现代密码学实验题目代码doc.docx

现代密码学实验题目代码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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 军事

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1