python频率分析,

时间:2015-04-22 12:23:22

标签: python frequency analysis

到目前为止,我正在尝试创建一个频率分析程序。 到目前为止我有:

`frequency_analysis = { "a" : 0,  "b" : 0,  "c" : 0,  "d" : 0,  "e" : 0,                      "f" : 0,  "g" : 0,
    "h" : 0,  "i" : 0,  "j" : 0,  "k" : 0,  "l" : 0,  "m" : 0,  "n" : 0,  "o" :   0,
    "p" : 0,  "q" : 0,  "r" : 0,  "s" : 0,  "t" : 0,  "u" : 0,  "v" : 0,  "w" : 0,
    "x" : 0,  "y" : 0,  "z" : 0 }

        listing = []

        letters = 'eatniroshlcdguwpbfynkvxzjq'
        alphabet = 'abcdefghijklmnopqrstuvwxyz'

        text = input("Please Enter text to decipher").lower()

        for letter in text:

            if letter.isalpha():
              frequency_analysis[letter] += 1

        def get_num (frequency_analysis):
            return frequency_analysis[1]


        unsorted_items = frequency_analysis.items()
        sorted_items = sorted(unsorted_items, key = get_num)

        descending = reversed(sorted_items)
        descending = list(descending)

        inorder = list()
        for char in descending:
            inorder.append(char)


        for key in inorder:

            if key[1] > 0:

                print (key)

我们现在需要用最常用的字母交换密钥 例如。输入:你好 找频率:L,L,O,H,E
从代码顶部(字母)交换大多数频率字母。

L = E
o = A
H = T
E = n

然后按顺序放回。

outcome = TNEEA

3 个答案:

答案 0 :(得分:4)

@tommy建议的确有帮助,但你必须阅读一些文字。

{HTTP_HOST}

答案 1 :(得分:0)

这里有一些代码可以执行频率分析。我注意到这基本上是paddyg建议的实现:

import collections

ALPHABET = "abcdefghijklmnopqrstuvwxyz"
ETAOIN = 'etaoinshrdlcumwfgypbvkjxqz'

def generate_caesar_key(offset):
    dictionary = {}
    index = 0
    for letter in ALPHABET:
        if index+offset >= 26:
            index -= 26
        dictionary.update({letter:ALPHABET[index+offset]})
        index += 1
    return dictionary

def switch_encode(string, key):
    encoded = ""
    for letter in string.lower():
        if letter in key.keys():
            encoded += key[letter]
        else:
            encoded += letter
    return encoded

def switch_decode(string, key):
    key = dict(zip(key.values(),key.keys()))
    decoded = ""
    for letter in string.lower():
        if letter in key.keys():
            decoded += key[letter]
        else:
            decoded += letter
    return decoded

def switch_crack(string):
    key = {}
    frequent_letters = collections.Counter(string).most_common()
    index = 0
    for letter in frequent_letters:
        if letter[0] in ALPHABET:
            key[ETAOIN[index]] = letter[0]
            index += 1
    return key

我还包括一些其他函数来生成凯撒密码密钥,并使用密钥对事物进行编码和解码,以便可以立即使用执行频率分析的switch_crack函数。

然而

这是字母频率分析。虽然人们当然可以对英语中的字母频率进行排名,但这远非绝对可靠。这种方法需要一个巨大的样本才能可靠地猜出交换密码的密钥。例如,我将大象的整个维基百科条目粘贴到此。它正确地猜到了一些字母,比如哪个字母是e,但是,它有一些字母切换或放错位置。

我所说的是,如果一个方法包含注意单词的方法,这个基本算法可以做得更好,更好。例如,它可以想象知道哪些组合单词,并且如果它认识到乱码出现,则切换其字母猜测。或者它可以看一个三个字母的单词,它非常肯定以e结束并猜测它是“the”并相应地更新它的密钥。我上面的函数是使用字母进行基本频率分析的干净实现,但是只需查看字母就可以进行更好的频率分析。

答案 2 :(得分:-1)

Debkanta编写的代码

目标:查找列表的最小和最大频率(Python3)

import collections
def frequency(l):
    cp=[]
    maxl=[]
    minl=[]

    ctr = collections.Counter(l)
    for i in ctr:
        r=ctr[i]
        cp.append(r)
    p=max(cp)
    q=min(cp)
    #print(cp)
    for i in ctr:
        if ctr[i]==p:
            maxl.append(i)
        if ctr[i]==q:
            minl.append(i)

    return (sorted(minl),sorted(maxl))