现代密码学实验(题目+代码)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

其中的 LFSR 为:
三、实验步骤
#include<iostream> #include<vector> #include<cmath> #include<fstream> using namespace std; void main() {
///下面是密钥的产生///////////// int a[31]={1,1,0,0,1}; for(int k=5;k<31;++k)
int z; cin>>z; if(z==0||z==1) { ////////////////////////////////////////// cout<<"请输入密钥 a 和 b:"<<endl; int a,b; cin>>a>>b;
0 — 表 示 加 密 "<<endl<<"
1—表示解密
其中 a, b 为密钥, 0 a, b 25 ,且 gcd(a, 26)=1
实验要求:加/解密程序对任意满足条件的 a、b 都能够处理。
三、实验步骤 (1)统计 26 个英文字母出现的频率的程序
#include<iostream> #include<fstream> #include<vector> using namespace std; void main(){
for(int i = 0; i < byte_length; i++) {
unsigned char temp = (unsigned char)0; for(int j=0; j< 8; j++) {
temp = temp | ( (next_state & (unsigned char)128) >> j );
next_state = fn_feedback(n, c, next_state); } output_bytes[i] = temp; } }
//output a char type of data in binary way void output_binary(unsigned char c) {
}
(2)仿射变换加/解密程序对一段较长的英文文章进行加密
#include<iostream> #include<fstream> #include<vector> using namespace std; //////////判断两个数是不是互素(辗转相除)//////// bool gcd(int a){
} } //////////////////////////////////////// } else cout<<"所选操作无效!"<<endl; }
}四、实验结果及分析
该程序是对文件进行操作,结果如下:
(1) 统计 26 个英文字母出现的频率的程序
(2) 仿射变换加/解密程序对一段较长的英文文章进行加密
个英文字母出现的频率的程序;3)利用仿射变换加/解密程序对一段较长的英文文章进行 加密,再利用统计软件对明文和密文中字母出现的频率进行统计并作对比,观察有什么规 律。
放射变换:
加密: c Ea,b m am b mod 26 解密: m Da,b c a1c bmod 26
实验结果如下:
得到密文“out.txt”如下:
实验项目 名称
成绩
实验三、流密码(生成非线性序 列)
一、实验目的 以 LFSR 序列为基础,生成非线性序列,并利用该序列对文件进行加密、解密。
二、实验内容 1)利用 C\C++实现 Geffe 序列生成器及 J-K 触发器;2)利用生成的非线性序列 对文件进行加密、解密(按对应位作模 2 加运算)。
int f=26,g,r; g=a; do{
r=f%g; f=g; g=r; }while(r); if(f==1) return 1; else return 0; } //////////////////求逆////// int inv(int a){ int x,i; for(i=1;i<=30;++i) if((26*i+1)%a==0) {
for(int i=0; i< 8; i++) {
if( (c<< i) & (unsigned char)128 ) cout << "1";
else cout << "0";
} }
void Geffe(unsigned char buf[], unsigned char buf1[], unsigned char buf2[], unsigned char b[])
cout<<"解密成功,明文见 in.txt"<<endl; ifstream in("out.txt"); ofstream out("in.txt");
char c; while(in>>c)
{ int sum=0; for(int j=0;j<8;++j) sum+=pow(2,7-j)*a[(i+j)%31]; if(i+j>32) i=(i+j-1)%31+1; else
void 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;
a[k]=(a[k-2]+a[k-5])%2; cout<<"密钥如下:"<<endl; for(int jj=0;jj<31;++jj)
cout<<a[jj]<<' '; cout<<endl;
////////////////////// int i=0,key; cout<<"请选择操作方式: 1-加密 cin>>key; vector<int> s,ss; if(key==1||key==2) {
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(int kk=0;kk<s.size();++kk) { out<<char(s[kk]); }
} if(key==2) {
i=i+8; s.push_back((int(c))^sum); } for(int kk=0;kk<s.size();++kk) { out<<char(s[kk]); } } //////////// } else cout<<"操作无效!"<<endl; } 四、实验结果及分析
在“in.txt”中输入如下内容:
2-解密"<<endl;
if(key==1) { cout<<"加密成功,密文见 out.txt"<<endl;
ifstream in("in.txt"); ofstream out("out.txt"); char c;
while(in>>c) {
int sum=0; for(int j=0;j<8;++j)
{ for(int i=0; i< 10; i++) { b[i]=buf[i]*buf1[i]+buf2[i]*buf1[i]+buf2[i]; output_binary( (unsigned char)b[i]); }
ifstream in("a.txt"); vector<int> s; vector<int> n(26,0); for(int i=0;i<26;++i)
s.push_back(97+i); for(char x;in>>x; )
for(int i=0;i<26;++i) if(int(x)==s[i]){ n[i]++;}
实验报告
实验课程名称
现代密码学

院 理学院 年级 大三 专业班 信科 0802
学 生 姓 名 王尔林 学 号
200810010210
开 课 时 间 2010 至 2011 学年第 二 学期
总成绩 教师签名
实验项目 名称
成绩
实验一、古典密码(认识密码学)
一、实验目的 通过实现简单的古典密码算法,理解密码学的相关概念如明文(plaintext)、密文
三、实验步骤
#include <iostream> using namespace std;
//return next state unsigned 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 bit for(int i =1; i< n; i++) { s = s ^ ( (t << i) & (unsigned char)128 ); } return (unsigned char)((curr_state << 1) | (s >> (n-1))); //return next state }
x=(26*i+1)/a;break;} return x; }////////////////////////////////////////////////////////// void main(){
cout<<" 请 你 选 择 操 作 密 码 的 方 式 :"<<endl<<" "<<endl;
下面是文本内容:
实验项目 名称
成绩
实验二、流密码(认识 LFSR 及流 密码)
一、实验目的 通过实现简单的线性反馈移位寄存器(LFSR),理解 LFSR 的工作原理、本
原多项式重要意义。
二、实验内容 1)利用 C\C++语言实现 LFSR(其中 LFSR 已给定);2)通过不同初始状
态生成相应的序列,并观察他们的周期有什么特点;3)利用生成的百度文库列对文本 进行加/解密(按对应位作模 2 加运算)。
if((a<1||a>25)||(b<0||b>25)) cout<<"a,b 的输入范围有错!"<<endl;
else if(gcd(a)==0) cout<<"密钥 a 有误,与 26 不互素"<<endl; else { if(z==0)////加密算法 { ifstream in("a.txt"); ofstream out("b.txt"); vector<int> s; for(char x;in>>x; ) s.push_back(int(x)); for(int i=0;i<s.size();++i) { s[i]=(a*(s[i]-97)+b)%26; out<<char(s[i]+97)<<' '; }out<<endl;cout<<"加密成功!明文请见“b.txt”"<<endl; } else////解密算法 { ifstream in("b.txt"); ofstream out("a.txt"); vector<int> s; for(char x;in>>x; ) s.push_back(int(x)); for(int i=0;i<s.size();++i) { s[i]=inv(a)*(s[i]-97-b+26)%26; out<<char(s[i]+97)<<' '; }out<<endl;cout<<"解密成功!密文请见“a.txt”"<<endl;
(ciphertext)、加密密钥(encryption key)、解密密钥(decryption key)、加密算法(encryption algorithm)、解密算法(decryption algorithm)等。
二、实验内容 1)用 C\C++语言实现仿射变换(Affine)加/解密算法;2)用 C\C++语言实现统计 26
float sum=0.0; for(int j=0;j<26;++j) sum+=n[j]; cout<<"统计结果如下:"<<endl; for(int k=0;k<26;++k){
// n[k]=n[k]/sum; cout<<' '<<char(k+97)<<"出现的概率为:"<<n[k]/sum<<endl; //cout<<n[k]<<endl;
相关文档
最新文档