频率分析破解单表代换密码

频率分析破解原理:

在任何一种书面语言中,不同的字母或字母组合出现的频率各不相同。而且,对于以这种语言写的任意一段文本,都具有大致相同的特征字母分布。比如,在英语中,字母E出现的频率很高,而X出现的较少。类似地,ST、NG、TH以及QU等双字母组合出现的频率非常高,NZ、QJ组合则极少。英语中出现频率最高的12个字母可以简记为“ETAOIN SHRDLU”。

简单替换密码的频率分析,在一个简单的替换密码中,明文中的每一个字母都被另一个字母替换,而且明文中相同的字母在转换为密文时总是被同一个字母所替换。比如,所有的e都会被替换成x,一个含有大量x的密文消息会向密码破译者暗示x替换e。

英文字母频率统计表:

下面是人们从大量的英文文章中统计出的字母频率。

第一列的是字母,第二列是每个字母出现的频率,第三列是以最少使用的字母q为1计算得出的倍数表。

E11.1607%56.88M3.0129%15.36
A8.4966%43.31H3.0034%15.31
R7.5809%38.64G2.4705%12.59
I7.5448%38.45B2.0720%10.56
O7.1635%36.51F1.8121%9.24
T6.9509%35.43Y1.7779%9.06
N6.6544%33.92W1.2899%6.57
S5.7351%29.23K1.1016%5.61
L5.4893%27.98V1.0074%5.13
C4.5388%23.13X0.2902%1.48
U3.6308%18.51Z0.2722%1.39
D3.3844%17.25J0.1965%1.00
P3.1671%16.14Q0.1962%(1)

破解过程,首先整理明文,将其中的符号删除,大写字母转换为小写字母

//整理明文,删除除字母外的符号,大写字母变小写字母
void Arr()
{
    ifstream fin("mingwen1.txt");
    ofstream fout("mingwen2.txt");
    string s;
    while(getline(fin,s))
    {
        string r;
        for(int i=0;i<s.length();i++)
        {
            if(s[i]>='A'&&s[i]<='Z')
                s[i] = s[i]+32;  //大写转小写
            if(s[i]>='a'&&s[i]<='z')
                r+=s[i];
        }
        fout<<r<<endl;
    }
    fin.close();
    fout.close();
}

加密明文:

//加密整理后的明文
void encrypt()
{
    ifstream fin("mingwen2.txt");
    ofstream fout("miwen3.txt");
    string s;
    string t = "qwertyuiopasdfghjklzxcvbnm";
    while(getline(fin,s))
    {
        string r;
        for(int i=0;i<s.length();i++)
        {
            for(int k=0;k<t.length();k++)
            {
                if(s[i]==t[k])
                {
                    r+='a'+k;
                    break;
                }
            }
        }
        fout<<r<<endl;
    }
    fin.close();
    fout.close();
}

解密密文:

//解密密文
void decrypt(string t)
{
    ifstream fin("miwen3.txt");
    ofstream fout("mingwen4.txt");
    string s;
    while(getline(fin,s))
    {
        string r;
        for(int i=0;i<s.length();i++)
        {
            for(int j=0;j<t.length();j++)
            {
                if(s[i]==t[j])
                {
                    r+='a'+j;
                    break;
                }
            }
        }
        fout<<r<<endl;
    }
    fin.close();
    fout.close();
}

计算频率:

string fre()
{
    ifstream fin("miwen3.txt");
    int T[26]={0};
    double f[26] = {0};
    int total = 0;
    string s;
    while(getline(fin,s))
    {
        for(int i=0;i<s.length();i++)
        {
            int l = s[i]-'a';
            T[l]++;
            total++;
        }
    }
    cout<<"统计后的频率为:"<<total<<endl;
    for(int i=0;i<26;i++)
    {
        char ch = 'a'+i;
        f[i] = ((float)T[i]/total)*100;
        printf("%c字符频率:%7.4f\n",ch,f[i]);
    }
    string s1 = brk(f);
    return s1;
}

频率排序和破解密文:

//频率排序
string brk(double f[])
{
    string s = "";
    for(int i=0;i<26;i++)
    {
        double max1= 0;
        int mark = 0;  //最大值和下标
        for(int j=0;j<26;j++)
        {
            if(max1<f[j])
            {
                max1 = f[j];
                mark = j;
            }
        }
        s+='a'+mark;
        f[mark] = -1;
    }
    return s;
}

//破解对应表整理
string show(string s)
{
    string s1 = "";
    for(int i=0;i<str.length();i++)
    {
        int k=0; char c = 'a'+i;
        for(int j=0;j<str.length();j++)
        {
            if(str[j]==c)
            {
                k=j;
                break;
            }
        }
        s1 += s[k];
    }
    return s1;
}

破解时,密文越长,精确度越高。

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页