实 验 教 学 过 程 记 录
一、实验目的 通过实现简单的古典密码算法,理解密码学的相关概念如明文(plaintext)、密文(ciphertext)、加密密钥(encryption key)、解密密钥(decryption key)、加密算法(encryption algorithm)、解密算法(decryption algorithm)等。 二、实验内容 1)用C\C++语言实现仿射变换(Affine)加/解密算法;2)用C\C++语言实现统计26个英文字母出现的频率的程序;3)利用仿射变换加/解密程序对一段较长的英文文章进行加密,再利用统计软件对明文和密文中字母出现的频率进行统计并作对比,观察有什么规律。 放射变换: 加密: 解密: 其中a, b为密钥,,且gcd(a, 26)=1 实验要求:加/解密程序对任意满足条件的a、b都能够处理。 三、实验步骤 (1)统计26个英文字母出现的频率的程序 #include<iostream> #include<fstream> #include<vector> using namespace std; void main(){ 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]++;} 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; } (2)仿射变换加/解密程序对一段较长的英文文章进行加密 #include<iostream> #include<fstream> #include<vector> using namespace std; //////////判断两个数是不是互素(辗转相除)//////// bool gcd(int a){ 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) { x=(26*i+1)/a;break;} return x; }////////////////////////////////////////////////////////// void main(){ cout<<"请你选择操作密码的方式:"<<endl<<" 0—表示加密 "<<endl<<" 1—表示解密 "<<endl; int z; cin>>z; if(z==0||z==1) { ////////////////////////////////////////// cout<<"请输入密钥a和b:"<<endl; int a,b; cin>>a>>b; 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; } } //////////////////////////////////////// } else cout<<"所选操作无效!"<<endl; } } 四、实验结果及分析 该程序是对文件进行操作,结果如下: (1) 统计26个英文字母出现的频率的程序 (2) 仿射变换加/解密程序对一段较长的英文文章进行加密 下面是文本内容: 请选择操方式(大写): E(encryption)—表示加密 D(decryption)—表示解密 E 请输入密钥a和b: 5 6 加密成功!明文请见“b.txt” 请选择操方式(大写): E(encryption)—表示加密 D(decryption)—表示解密 D 请输入密钥a和b: 5 6现代 解密成功!密文请见“a.txt” Press any key to continue |
发布评论