Java 字母频率

Java 字母频率,java,cryptography,Java,Cryptography,我正在读《密码学和网络安全》一书,我一直在尝试编写程序,对单字母密码执行字母频率攻击。该程序需要生成前10种可能的纯文本 我有点纠结于这是如何工作的,我是否正确地认为“可能的”纯文本并不总是与原始纯文本匹配 如果有人能为该计划的实施提供一些指导,那就太好了 到目前为止,我有代码 读取密文文件。 扫描密文并生成与频率百分比匹配的字母的哈希图。 将英语的相对频率存储在2d数组中 我的下一步是尝试按照与字符百分比最接近的匹配顺序对数组进行排序。 这个方向对吗 任何建议都很好 如果是单字母,最好使用蛮力

我正在读《密码学和网络安全》一书,我一直在尝试编写程序,对单字母密码执行字母频率攻击。该程序需要生成前10种可能的纯文本

我有点纠结于这是如何工作的,我是否正确地认为“可能的”纯文本并不总是与原始纯文本匹配

如果有人能为该计划的实施提供一些指导,那就太好了

到目前为止,我有代码

读取密文文件。 扫描密文并生成与频率百分比匹配的字母的哈希图。 将英语的相对频率存储在2d数组中

我的下一步是尝试按照与字符百分比最接近的匹配顺序对数组进行排序。 这个方向对吗


任何建议都很好

如果是单字母,最好使用蛮力在可能的组合中旋转。既然你是作为一种学习练习来做的,我将尝试帮助你找到一种方法。因此IIRC英语中最常见的两个字母是
E
T
(这可能是错误的)。因此,你要做的是,假设英语中最常见的前5个字符(这里再次假设它是英语),并为每个字符指定一个加权值。通过这样做,您可以获取密码文本并记录每个字符A-Z的频率,并将它们与前5个字符及其加权值进行比较。在你有那么多信息的时候,破译剩余的密文是相当直接的


进一步阅读:

如果是单字母,最好使用蛮力在可能的组合中旋转。既然你是作为一种学习练习来做的,我将尝试帮助你找到一种方法。因此IIRC英语中最常见的两个字母是
E
T
(这可能是错误的)。因此,你要做的是,假设英语中最常见的前5个字符(这里再次假设它是英语),并为每个字符指定一个加权值。通过这样做,您可以获取密码文本并记录每个字符A-Z的频率,并将它们与前5个字符及其加权值进行比较。在你有那么多信息的时候,破译剩余的密文是相当直接的


进一步阅读:

理论上,您可能会得到多个可能的有效英语(?)输出,但如果您的输入文本非常重要,几乎可以肯定只有一个输出主要由英语单词组成

您可以从最可能的映射开始,然后通过将映射创建的输出中的单词与英语单词词典进行比较来计算映射生成的英语单词数。如果英语单词数量较少,请尝试下一个最可能的映射,依此类推

使用英语词典作为控件可以让算法知道它已经完成了


通过使用语言的明确知识,可以提高算法的效率。例如,英语中只有两个单字母单词(I,a)和一小部分双字母单词。如果输入文本包含一个或多个短单词,您可以使用它们来包含或排除可能的映射。

理论上,您可能会得到多个可能的有效英语(?)输出,但如果您的输入文本非常重要,则几乎可以肯定只有一个输出主要由英语单词组成

您可以从最可能的映射开始,然后通过将映射创建的输出中的单词与英语单词词典进行比较来计算映射生成的英语单词数。如果英语单词数量较少,请尝试下一个最可能的映射,依此类推

使用英语词典作为控件可以让算法知道它已经完成了


通过使用语言的明确知识,可以提高算法的效率。例如,英语中只有两个单字母单词(I,a)和一小部分双字母单词。如果输入文本包含一个或多个短单词,您可以使用它们来包含或排除可能的映射。

我不是密码专家,但我认为您过于简单化了。是的,密码学家的一个有用工具是字母相对频率表。但是,我认为,任何给定的文档都与总体频率完全匹配的可能性非常小。比如,我记得,在英语中,最常见的字母是E、T、A、O、N、R、I、S、H。假设在加密文本中,你发现9个最常见的字母是A、B、C、D、E、F、G和H。A必须映射到E、B到T、C到A等,这会自动发生吗?当然不是。假设此特定文档是关于安装Xerox打印机的。“Xerox”一词的频繁出现可能会使X比普通文档中的X高得多。假设这是唯一不寻常的频率,那么现在你最常见的字母是,比如,E,T,X,A,O,N,R,I和S。假设A映射到E,B映射到T仍然有效。但是X被困在序列的中间,从那里开始,所有假设的映射都是错误的。 我认为你破解这样一个简单的替换密码的方法是尝试一两个字母,然后检查结果,看看哪一个是合理的。您还可以查找其他线索,例如经常出现在一起的字母,或者通常出现在单词开头或结尾的字母(假设加密文本保留了分词)

作为一个学习编程的练习,这可能很有趣。但是作为一个严重的破译密码的程序。。。不是那么简单

事后很晚才想到