频率分析协助

时间:2015-04-17 13:45:47

标签: python frequency analysis frequency-analysis

基本上,我已经分配了一项任务来计算字母表中每个字母出现在一段加密文本中的次数。 完成后,每个字母的频率按降序排列。 例如[(l,2),(e,1),{h,1),(o:1)]。 我已经完成了这项工作。

然后,降序列表中的每个字母都需要被此字符串中的匹配字母替换:'etaoinshrdlcumfwgypbvkjxqz' 这就是我不确定该怎么做。

到目前为止,我有这个:

enc_text = input("Enter Encrypted Text: ").lower()

count = {'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}

for char in enc_text:
if char.isalpha():
    count[char] += 1

print(enc_text)
print(count)

def get_value(count):
    return count[1]


sorted_text = sorted(count.items(), key = get_value)


descending_text = reversed(sorted_text)
descending_text = list(descending_text)
print(descending_text)


most_frequent = {'e': 1, 't': 2, 'a': 3, 'o': 4, 'i': 5, 'n': 6, 's': 7, 'h': 8, 'r': 9, 'd': 10, 'l': 11, 'c': 12, 'u': 13, 'm': 14, 'w': 15, 'f': 16, 'g': 17, 'y': 18, 'p': 19, 'b': 20, 'v': 21, 'k': 22, 'j': 23, 'x': 24, 'q': 25, 'z': 26}


letters = list('abcdefghijklmnopqrstuvwxyz')
etaoin = list('etaoinshrdlcumfwgypbvkjxqz')

我相信我必须在开头循环文本并逐字逐句地查看。然后每个字母应该被字符串中的字母替换?但我不确定如何实施它。

提前感谢您提供任何帮助

4 个答案:

答案 0 :(得分:0)

您对加密文本进行冷循环,然后使用list.index()在降序列表中查找字符,并从etaoin列表中获取此位置的相应字符。

样品:

decryptedChar = eatoin[descending.index(encryptedChar)]

答案 1 :(得分:0)

除了使用不同的库之外,您还完成了大部分工作。只需根据频率创建映射,然后将加密文本中的每个字母替换为相应的映射值。

decryption_map = {}
for index, key in enumerate(sorted(count.items(), key = get_value)):
    decryption_map[key] = etaoin[index]
print ''.join(map( lambda x : decryption_map[key], list(enc_text)))

答案 2 :(得分:0)

这将为您提供替换地图。继续代码的最后一部分(使etaoin成为字符串):

etaoin = "etaoinshrdlcumfwgypbvkjxqz"

rev_etaoin = etaoin[::-1]
replacement_map = sorted_text[:]
for i in range(26):
    replacement_map[i] = (sorted_text[i][0],rev_etaoin[i])
print(replacement_map)

输出:

[('c', 'z'), ('b', 'q'), ('e', 'x'), ('g', 'j'), ('f', 'k'), ('i', 'v'), ('k', 'b'), ('m', 'p'), ('l', 'y'), ('o', 'g'), ('n', 'w'), ('p', 'f'), ('u', 'm'), ('t', 'u'), ('w', 'c'), ('v', 'l'), ('x', 'd'), ('z', 'r'), ('h', 'h'), ('q', 's'), ('r', 'n'), ('y', 'i'), ('j', 'o'), ('s', 'a'), ('d', 't'), ('a', 'e')]

答案 3 :(得分:0)

您已将字母计数保存到字典中。如何将排序的字母保存到字典中,字母为键,排名为值。

rank_dict = {}
for i in range(26):
    rank_dict[sorted(count, key=count.get, reverse = True)[i]] = i+1 
print rank_dict

所以[(l,2),(e,1),{h,1),(o:1)]将改为rank_dict = {' l':1:,&#39 ; e':2,' h':3,' o':4}。 如果你那么反过来最常见的词典

freq_dict = {1: 'e', 2: 't', 3: 'a', 4: 'o', 5: 'i', 6: 'n', 7: 's', 8: 'h', 9: 'r', 10: 'd', 11: 'l', 12: 'c', 13: 'u', 14: 'm', 15: 'f', 16: 'w', 17: 'g', 18: 'y', 19: 'p', 20: 'b', 21: 'v', 22: 'k', 23: 'j', 24: 'x', 25: 'q', 26: 'z'}

然后您可以使用以下方法遍历加密文本:

dec_text = ''
for char in enc_text:
    dec_text = dec_text + freq_dict[rank_dict[char]]

或者,如果你想保留你最常见的dict键:值当前的方式,请使用:

dec_text = dec_text + [key for key in most_frequent \
                       if most_frequent[key] == rank_dict[char]]

请注意,多个字母出现频率相同的情况按字母顺序排序/排序。如果您的文本很长,并且您只是将其用作解密替换密码的指南,那么解密文本可能会出错。