字母频率java

时间:2011-09-07 17:20:06

标签: java cryptography

我正在阅读“密码学和网络安全”这本书,我一直试图编写程序对单字母密码执行字母频率攻击。该程序需要产生十大可能的纯文本。

我对这可行的方式感到有些困惑,我是否正确地认为所产生的“可能的”普通文本实际上并不总是与原始纯文本相匹配?

如果有人能为程序的流程提供一些指导,那就太棒了。

到目前为止,我有代码;

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

我的下一步是尝试按照与char的百分比最接近的匹配顺序对数组进行排序。 这是朝着正确的方向发展的吗?

任何建议都会很棒!

4 个答案:

答案 0 :(得分:2)

我不是密码学专家,但我认为你过于简单化了。是的,密码学家的一个有用的工具是一个相对频率的字母表。但是,我认为,任何给定文件与整体频率完全匹配的概率非常小。就像在英语中一样,最常见的字母是,我记得,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比普通文档中的要高得多。假设这是唯一不常见的频率,所以现在你最常用的字母是E,T,X,A,O,N,R,I和S.假设A映射到E而B到T仍然有效。但是当X卡在序列的中间时,从那里开始所有假设的映射都是错误的。

我认为你实际上打破这样一个简单的替换密码的方法是尝试一两个字母,然后检查结果,看看哪些是合理的。您还可以查找其他线索,例如经常出现在一起的字母,或者通常出现在单词开头或结尾的字母(假设加密文本保留单词中断)。

作为学习编程练习,这可能很有趣。但作为一个严肃的破解程序......并不是那么简单。

非常迟到的

令我感到震惊的是,这是人工智能问题的一个有趣例子。当然,计算机可以轻松计算字母频率,并对映射进行初步猜测。计算机可以轻松地将结果与字典进行比较,看看有多少真实单词出现。

但是你如何区分好的命中和假命中?举一个简单的例子,如果我是手动完成这个并且在第一次切割映射后我看到很多出现的“toe”这个词,那么这篇文章可能是在谈论脚,但也许我写的信是“ o“应该真的是”h“,这个词就是”the“。

或者,我记得在几年前读过在美国内战期间截获的一条密码消息,由于一些奇怪的原因,加密消息的人留下了“未达到你”的字样。截获它的人认为,之前的话可能是“在此之前”或“到此时”。事实证明它是“在此之前”,而这一重要线索帮助打破了密码。

人类密码学家通常可以根据直觉和背景做出好的猜测。如果我正在阅读关于金融交易的编码信息并遇到“_ank”,我猜“银行”。如果消息是关于军事演习,我的第一个猜测将是“坦克”。但如果在财务信息中前面的词语是“这个股票将”,那么“坦克”更有可能。在军事信息中,“过河”将使其更有可能成为“银行”。等等。

编程计算机以考虑人类会想到的所有事情是非常困难的。几年前我读了一本关于人工智能的书,其中作者说技术问题基本上已经解决了,现代人工智能开发人员知道如何编程计算机来重现人类思维,除了“我们咨询的人类专家经常会遇到的小问题”无法用可编程到计算机中的术语来表达它们的工作方式“。我只是笑了。我们解决了这个问题。唯一的问题是我们的解决方案实际上并不起作用。为此,我们责备其他人。

答案 1 :(得分:1)

如果它是单字母的,那么最好使用蛮力来旋转可能的组合。既然你是在做一个学习练习,我会尽力帮助你。因此,IIRC最常发现的两种英文字母是ET(这可能是错误的)。所以你要做的就是用英语中最常见的前5个字符(这里再次假设它是英语)并为每个字符分配一个加权值。通过执行此操作,您可以获取密文并记录每个字符A-Z的频率,并将它们与前5个字符及其加权值进行比较。在您掌握了大量信息的情况下,打破密文的其余部分非常简单。

进一步阅读:attacking ciphers

答案 2 :(得分:1)

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

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

使用英语字典作为控件,可以让您的算法知道它已经完成。

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

答案 3 :(得分:0)

假设这不仅仅是移位密码(在这种情况下,前10个字符的暴力方法可以快速显示密钥并允许您破解密码) - 您最好的选择是首先使用频率分析来猜三个最常见的字母(标准英语中的E,T,A)。然后,您可以将其与最常见的字符对或三元组进行进一步的频率分析。特别是,如果你已经正确识别出“T”和“E”,那么经常出现TXE表明X可能是H.

自动编程将非常棘手,手动方法可能是最好的。或者,在前6-10个字符上使用蛮力方法来识别字典中的任何敏感词都可以。在给定密文的情况下,您可以通过忽略概率低于某个阈值的密码字母来减少所需的计算。