当前位置: 首页 > 知识库问答 >
问题:

使用频率分析/密码分析技术破译密码文本

壤驷心思
2023-03-14

网站(https://www.guballa.de/substitution-solver)他做到了。

我必须通过频率分析来做到这一点(https://en.wikipedia.org/wiki/Frequency_analysis)

我面临的主要问题是,当我替换时,检查单词是否看起来像英语单词。

请指导我如何处理这个问题

谢谢哈基德

共有1个答案

裴卓君
2023-03-14

这可能是一个迟来的答案,但这段代码可以作为你的开始。


from operator import itemgetter

letterFrequency = [
                   [12.00, 'E'], [9.10, 'T'],
                   [8.12, 'A'], [7.68, 'O'],
                   [7.31, 'I'], [6.95, 'N'],
                   [6.28, 'S'], [6.02, 'R'],
                   [5.92, 'H'], [4.32, 'D'],
                   [3.98, 'L'], [2.88, 'U'],
                   [2.71, 'C'], [2.61, 'M'],
                   [2.30, 'F'], [2.11, 'Y'],
                   [2.09, 'W'], [2.03, 'G'],
                   [1.82, 'P'], [1.49, 'B'],
                   [1.11, 'V'], [0.69, 'K'],
                   [0.17, 'X'], [0.11, 'Q'],
                   [0.10, 'J'], [0.07, 'Z']]


plain_to_cipher = {
       "a": "l", "b": "f",
       "c": "w", "d": "o",
       "e": "a", "f": "y",
       "g": "u", "h": "i",
       "i": "s", "j": "v",
       "k": "z", "l": "m",
       "m": "n", "n": "x",
       "o": "p", "p": "b",
       "q": "d", "r": "c",
       "s": "r", "t": "j",
       "u": "t", "v": "q",
       "w": "e", "x": "g",
       "y": "h", "z": "k",
       }
cipher_to_plain = {v: k for k, v in plain_to_cipher.items()}
alphabet = "qwertyuioplkjhgfdsazxcvbnm"


message = input("Enter message to encrypt: ")
message = message.lower()
ciphertext = ""


for c in message:
    if c not in alphabet:
        ciphertext += c
    else:
        ciphertext += plain_to_cipher[c]
print("\nRandom substitution Encryption is: \n\t{}".format(ciphertext))

# .......................................................................
# calculate letter frequency of ciphertext

letter_list = []
cipher_len = 0
for c in ciphertext:
    if c in alphabet:
        cipher_len += 1
        if c not in letter_list:
            letter_list.append(c)

letter_freq = []
for c in letter_list:
    letter_freq.append([round(ciphertext.count(c) / cipher_len * 100, 2), c])

# ....................................................................................
# Now sort list and decrypt each instance of ciphertext according to letter frequency

letter_freq = sorted(letter_freq, key=itemgetter(0), reverse=True)
decrypted_plaintext = ciphertext

index = 0
for f, c in letter_freq:
    print("Replacing {} of freq {} with {}.".format(c, f, letterFrequency[index][1]))
    decrypted_plaintext = decrypted_plaintext.replace(c, letterFrequency[index][1])
    index += 1
print("\nThe Plaintext after decryption using frequency analysis: \n\t{}".format(decrypted_plaintext))

旁注:这个程序可以在大部分时间成功解密最常用的字母,如e, t, a, o,但是不能成功映射较少使用的字母(因为频率差异开始减少,使得结果更难预测)。这个问题可以通过分析英语中最常用的字母(如th)并使用结果做出更准确的预测来克服一点。你可以利用的另一个注意事项是,字母a很容易被打破,这样打破字母i就不那么痛苦了,因为任何一个句子之间有一个密文字符都可能对应于a(例如:一本书)或i(例如:我去了)(我们已经推导出a,所以任何其他单个密文字符都可能是i

 类似资料:
  • 8.2 分析密码 在实现密码破解之前,介绍一下如何分析密码。分析密码的目的是,通过从目标系统、组织中收集信息来获得一个较小的密码字典。本节将介绍使用Ettercap工具或MSFCONSOLE来分析密码。 8.2.1 Ettercap工具 Ettercap是Linux下一个强大的欺骗工具,也适用于Windows。用户能够使用Ettercap工具快速地创建伪造的包,实现从网络适配器到应用软件各种级别的

  • 所以,在我的C代码中,我用一个普通英语的文本文件,通过该文件分析英语字母表中字母的频率,并将它们存储到一个向量中。在获得频率后,我用英语字母表中频率最高的字母替换了以频率最高的字母开头的每个字母。我使用了和这样的字符串来表示字母表中最频繁的字母,然后我逐个查看最频繁的文本(按大于比较的向量排序),并用上面字符串中的字母替换它们。最终,这种天真方法的准确性取决于文件的大小;我想看看我是否能在保持这种

  • 我想做一个程序,可以帮助你打破密码文本,而不知道纯文本和密钥。 我希望在输出中有可能的纯文本,它给出最接近的统计值和一组可能的候选键 我开始做频率分析,完成了。它帮助我知道每个字母表的出现,但我不知道如何从中生成键。

  • 本文向大家介绍php用户密码加密算法分析【Discuz加密算法】,包括了php用户密码加密算法分析【Discuz加密算法】的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php用户密码加密算法。分享给大家供大家参考,具体如下: 今天在拿Discuz进行二次开发时需要在代码里验证Discuz的用户名密码,结果不小心掉进了坑里,因为Discuz的论坛有两张表来存储用户数据,一张在Discuz的

  • 本文向大家介绍替代密码技术与换位密码技术的区别,包括了替代密码技术与换位密码技术的区别的使用技巧和注意事项,需要的朋友参考一下 替代密码技术 替代密码技术是一种传统的密文技术,用于将纯文本加密为密文。在这种技术中,每个字符都用其他字符/数字或其他符号代替。此技术可更改字符的身份,但不会更改其位置。 换位密码技术 换位密码技术也是一种传统的密文技术,用于将纯文本加密为密文。在此技术中,每个字符位置都

  • 我目前正在F#中研究频率替换密码。也就是说,我计算了文本中每个字母的出现次数,完成后,我想根据英文字母表中的字母频率替换这些字母。 到目前为止,我所做的是创建了一个包含(字母、频率百分比、推荐字母)的(char*浮动*char)列表。假设字母P是我的加密文本中最常见的字母(13.5%的字母是P),而E是英语文本中最常用的字母,我们的列表元素看起来像这样(“P”,13.5,“E”)。这个过程完成了文