Vigenere多表加法加密分析


Vigenere介紹

設明文 m=m1m2m3mn ,密鑰 k=k1k2k3kn ,則密文
c=Ek(m)=c1c2c3cn .
其中 ci=(mi+ki)mod26 ios


統計分析

參考密碼以下web

ktbueluegvitnthuexmonveggmrcgxptlyhhjaogchoemqchpdnetxupbqntietiabpsmaoncnwvoutiugtagmmqsxtvxaoniiogtagmbpsmtuvvihpstpdvcrxhokvhxotawswquunewcgxptlcrxtevtubvewcnwwsxfsnptswtagakvoyyak

Kasiski test

若是密文中出現兩個相同的密文片斷,那麼它們對應的明文片斷極有多是相同的,則密碼片斷極可能是這些距離的最大公因子。ide

如下C++代碼輸出相同長度爲3的代碼片斷之間距離。svg

/* birdy&C 17.3.11 多表加密 */

#include <iostream>
#include <algorithm>
#include <functional>
#include <set>
#include <iterator>
#include <vector>
#include<string>
using namespace std;

int main(void) 
{
    string code;
    code = "ktbueluegvitnthuexmonveggmrcgxptlyhhjaogchoemqchpdnetxupbqntietiabpsmaoncnwvoutiugtagmmqsxtvxaoniiogtagmbpsmtuvvihpstpdvcrxhokvhxotawswquunewcgxptlcrxtevtubvewcnwwsxfsnptswtagakvoyyak";

    //Kasiski test
    for (int i = 0; i <= code.size() - 4; i++)
    {
        string temp = code.substr(i, 3);
         int t=code.find(temp, i+1);//找下一個片斷
        if (t != string::npos)
        {
            cout <<  t-i << endl;//輸出位置差
        }

    }

    system("pause");
    return 0;
}

獲得輸出:函數

114
114
114
114
39
39
24
87
18
18
18
72
27
18

求最大公約數,猜想密碼片斷長度爲3ui

index of coincidence

重合指數是字母串中兩個隨機元素相同的機率。
隨機英文文本的IC老是大約爲0.038。
而一段有意義的英文文本的IC老是大約爲0.065。
能夠用這個進一步確認密鑰字的長度。
公式以下:
26i=1p2i0.065 atom

交互重合指數是在兩個字符串中分別取兩字符,它們相同的機率。
能夠以此來判斷兩個字符串的相對位移。
相對位移爲0時,交互重合指數接近0.065,其餘狀況下在0.0031到
0.0045之間。加密

如下爲計數spa

const int step = 3;//密鑰長度
    int count[step][26] = { 0 };
    for (int i = 0; i < code.size(); i++) 
    {
        count[i%step][code[i] - 'a']++;
    }

如下函數返回相對位移code

int shift(int *a,int *t ) 
{
    int sum_a = 0, sum_t = 0;
    for (int i = 0; i < 26; i++)
    {
        sum_a += a[i];
        sum_t += t[i];
    }

int index = -1;
int sum_max = 0;
    for (int i = 0; i < 26; i++) 
    {
        int sum = 0;
        for (int j = 0;  j < 26; j++)
        {
            sum += a[j] * t[(j + i) % 26];

        }
        if (sum > sum_a * sum_t * 0.05)//Ic>0.05,實際應該在0.065附近
        {
            cout << "index" << i << endl;
            if (sum > sum_max) //若是有多個值大於0.05返回最大的
            {
                index = i;
                sum_max = sum;
            }
        }
    }
    return index;
}

若是是簡單的加法密碼的話,能夠直接和字母出現的統計機率表進行比較

其餘

前兩種分析比較側重於多表加密,在解決簡單的密碼的時候單表加密的統計分析會顯得比較直接。
相似於index of coincidence的分析
像mod3=1的那一個部分,
這裏寫圖片描述
5,20機率特別大,根據二者之間的差猜想爲e和t;
mod3=0的部分語法猜想最開始是it的可能性比較大,那麼移動爲24,移動以後的機率相似。
mod3=2直接所有輸出挑了一下……反正也才26種?

結果

這裏寫圖片描述

沒有空格……原本英語就很差……QAQ 蠻好玩的233除了……常常感受本身在加密而不是解碼……

相關文章
相關標籤/搜索