实验项目
   
实验一、古典密码(认识密码学)
一、实验目的
    通过实现简单的古典密码算法,理解密码学的相关概念如明文(plaintext)、密文(ciphertext)、加密密钥(encryption key)、解密密钥(decryption key)、加密算法(encryption algorithm)、解密算法(decryption algorithm)等。
二、实验内容
    1C\C++语言实现仿射变换Affine)加/解密算法;2C\C++语言实现统计26个英文字母出现频率的程序;3利用仿射变换/解密程序对一段较长的英文文章进行加密,再利用统计软件对明文和密文中字母出现的频率进行统计并作对比,观察有什么规律。
    放射变换:
加密
解密
其中a, b为密钥,,且gcd(a, 26)=1
实验要求:加/解密程序对任意满足条件的ab都能够处理。
三、实验步骤
(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<<"请输入密钥ab"<<endl;
    int a,b;
    cin>>a>>b;
    if((a<1||a>25)||(b<0||b>25))
        cout<<"ab的输入范围有错!"<<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
请输入密钥ab
5 6
加密成功!明文请见“b.txt
请选择操方式(大写):
E(encryption)—表示加密
D(decryption)—表示解密
D
请输入密钥ab
5 6现代
解密成功!密文请见“a.txt
Press any key to continue