guess_key1(cipher_text, words): letter_frequency = get_letter_frequency(cipher_text.lower()) sorted_letters = sorted(letter_frequency.keys(), key=lambda x: letter_frequency[x], reverse=True) # paixu most_common_letters_m = [sorted_letters[:8], sorted_letters[8:16], sorted_letters[-10:]] # high 8 middle 8 low 10 f1 = ['e'] # >10% f2 = ['a', 'i', 'r', 't', 'o', 'n'] f3 = ['s', 'l', 'c'] f4 = ['u', 'p', 'm', 'd', 'h'] f5 = ['g', 'b', 'y', 'f', 'v'] f6 = ['w', 'k', 'x', 'z', 'q', 'j'] # <1% mf = [f1, f2, f3, f4, f5, f6] mp = [[] for _ in range(len(mf))] for i in range(len(mf)): for j in range(len(mf[i])): mp[i].append(None) #print(mp) #print(mp[1]) flag = True while(flag): key = {} for p in itertools.product(*(itertools.permutations(range(len(mf[i]))) for i in range(6))): for i in range(6): for j in range(len(mf[i])): print(p[i][j], end=" ") break for i in range(6): for j in range(len(mf[i])): index = next(mp[i][j]) key.update({most_common_letters_m[i][index]: mf[i][j]}) decrypted_text = decrypt(cipher_text, key) if is_plaintext(decrypted_text, words): flag=False return key
时间: 2024-02-14 11:35:10 浏览: 156
这段代码是用于破解一个包含字母替换的密码文本,它使用了概率分析的方法和暴力搜索的方法来找到正确的密钥。其中,get_letter_frequency函数是用于计算字母频率的,sorted_letters是按照字母频率排序后的字母序列,most_common_letters_m将字母序列按照频率分成了3组,mf是6个字母列表,每个列表包含了一组可能替换的字母,mp是mf的迭代器,用于生成所有可能的组合。在while循环中,使用了itertools.product和itertools.permutations来生成所有可能的字母替换组合,并尝试将密文解密。如果解密得到的明文符合给定的单词列表,则认为找到了正确的密钥,返回密钥。
相关问题
def guess_key(cipher_text, words): letter_frequency = get_letter_frequency(cipher_text.lower()) sorted_letters = sorted(letter_frequency.keys(), key=lambda x: letter_frequency[x], reverse=True) most_common_letters = sorted_letters[:6] for i in range(len(most_common_letters)): for j in range(i+1, len(most_common_letters)): for k in range(j+1, len(most_common_letters)): key = {most_common_letters[i]: 'e', most_common_letters[j]: 't', most_common_letters[k]: 'a'} decrypted_text = decrypt(cipher_text, key) if is_plaintext(decrypted_text, words): return key
这段代码实现了一个猜测密钥的算法,它接受两个参数:`cipher_text`(密文)和 `words`(单词列表),并返回一个字典类型的对象,表示猜测的密钥。
算法的实现原理是首先统计密文中每个字母出现的频率,然后按照频率从高到低排序,选取出现频率最高的 6 个字母作为备选字母。接下来,对于这 6 个字母中的任意 3 个字母,猜测它们分别对应明文中的 'e'、't'、'a' 三个字母,得到一个可能的密钥。然后使用这个密钥解密密文,判断解密后的明文是否合法,如果合法,则返回这个密钥。
需要注意的是,这个算法可能会产生错误的猜测,因为只是根据字母频率进行猜测,没有考虑其他语言特征(如单词长度、语法结构等)。因此,猜测的密钥不一定是正确的,需要进一步进行验证和调整。
def guess_key1(cipher_text, words): letter_frequency = get_letter_frequency(cipher_text.lower()) sorted_letters = sorted(letter_frequency.keys(), key=lambda x: letter_frequency[x], reverse=True) # paixu most_common_letters = sorted_letters[:6] # first 6 for i in range(len(most_common_letters)): for j in range(i+1, len(most_common_letters)): for k in range(j+1, len(most_common_letters)): key = {most_common_letters[i]: 'e', most_common_letters[j]: 't', most_common_letters[k]: 'a'} # key = {'n': 'e', 'o': 't', 's': 'a'} .... decrypted_text = decrypt(cipher_text, key) if is_plaintext(decrypted_text, words): return key def decrypt(cipher_text, key): mapping_dict = str.maketrans(key) return cipher_text.translate(mapping_dict) def is_plaintext(text, words): words_found = 0 for word in text.split(): if word.lower() in words: words_found += 1 return (words_found / len(text.split())) > 0.001 其中key并没有替换掉所有字母,修改
可以尝试将key字典中没有替换的字母的值设置为出现频率最高的字母,即将如下代码:
```
key = {most_common_letters[i]: 'e', most_common_letters[j]: 't', most_common_letters[k]: 'a'}
```
修改为:
```
key = {most_common_letters[i]: 'e', most_common_letters[j]: 't', most_common_letters[k]: 'a'}
for letter in sorted_letters:
if letter not in key:
key[letter] = sorted_letters[0]
```
这样就可以保证key字典中所有字母都被替换了,并且未被替换的字母的值为出现频率最高的字母。
阅读全文