当前位置:
文档之家› 现代密码学实验(题目+代码)
现代密码学实验(题目+代码)
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 );
(ciphertext)、加密密钥(encryption key)、解密密钥(decryption key)、加密算法(encryption algorithm)、解密算法(decryption algorithm)等。
二、实验内容 1)用 C\C++语言实现仿射变换(Affine)加/解密算法;2)用 C\C++语言实现统计 26
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;
三、实验步骤
#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 }
实验报告
实验课程名称
现代密码学
学
院 理学院 年级 大三 专业班 信科 0802
学 生 姓 名 王尔林 学 号
200810010210
开 课 时 间 2010 至 2011 学年第 二 学期
总成绩 教师签名
实验项目 名称
成绩
实验一、古典密码(认识密码学)
一、实验目的 通过实现简单的古典密码算法,理解密码学的相关概念如明文(plaintext)、密文
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) {
} } //////////////////////////////////////// } else cout<<"所选操作无效!"<<endl; }
}四、实验结果及分析
该程序是对文件进行操作,结果如下:
(1) 统计 26 个英文字母出现的频率的程序
(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) {
下面是文本内容:
实验项目 名称
成绩
实验二、流密码(认识 LFSR 及流 密码)
一、实验目的 通过实现简单的线性反馈移位寄存器(LFSR),理解 LFSR 的工作原理、本
原多项式重要意义。
二、实验内容 1)利用 C\C++语言实现 LFSR(其中 LFSR 已给定);2)通过不同初始状
态生成相应的序列,并观察他们的周期有什么特点;3)利用生成的序列对文本 进行加/解密(按对应位作模 2 加运算)。
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) {
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
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;
int z; cin>>z; if(z==0||z==1) { ////////////////////////////////////////// cout<<"请输入密钥 a 和 b:"<<endl; int a,b; cin>>a>>b;
0 — 表 示 加 密 "<<endl<<"
1—表示解密
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”中输入如下内容:
x=(26*i+1)/a;break;} return x; }////////////////////////////////////////////////////////// void main(){
cout<<" 请 你 选 择 操 作 密 码 的 方 式 :"<<endl<<" "<<endl;
2-解密"<<endl;
if(key==1) { cout<<"加密成功,密文见 out.txt"<<endl;
ifstream in("in.txt"); ofstream out("out.txt"); char c;