字母频率java



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

我有点困于这是如何工作的,我认为它并不总是"可能的"纯文本产生将实际上匹配原始纯文本的情况下是对的吗?

如果有人能给这个程序的运行提供一些指导就太好了。

到目前为止,我的代码是;

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

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

任何建议将是伟大的!

我不是密码学专家,但我认为你太简单化了。是的,对于密码学家来说,一个有用的工具是字母的相对频率表。但我认为,任何给定文档与总体频率完全匹配的可能性非常小。比如,在英语中,最常见的字母是,我记得,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"可能会使X的排名比普通文档高得多。假设这是唯一不寻常的频率,那么现在最常见的字母是,比如,E, T, X, A, O, N, R, I和s,假设A映射到E, B映射到T仍然有效。但是由于X卡在序列的中间,从那里开始所有假定的映射都将是错误的。

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

作为一个学习编程的练习,这可能很有趣。但作为一个严肃的密码破解程序…没那么简单。

我突然想到这是AI问题的一个有趣的例子。当然,计算机可以很容易地计算字母的频率,并对映射进行初步猜测。计算机可以很容易地将结果与字典进行比较,看看有多少真正的单词出现。

但是你如何区分正确的点击和错误的点击呢?举个简单的例子,如果我手工做这个,在第一次切割映射后,我看到单词"toe"出现了很多次,那么这个文档可能是在谈论脚,但也许我映射到"o"的字母实际上应该是"h",而这个单词是"the"。

或者,我记得几年前在美国内战期间读到过一条被截获的加密信息,出于某种奇怪的原因,加密信息的人留下了未加密的单词"到达你"。截获信息的人认为,在这之前的单词可能是"before this"或"by The time this"。结果是"在此之前",这条重要线索帮助破解了密码。

人类密码学家通常可以根据直觉和上下文做出很好的猜测。如果我正在阅读关于金融交易的编码信息,遇到"_ank",我猜是"bank"。如果这条信息是关于军事演习的,我的第一个猜测是"坦克"。但如果在财务信息中,前面的词是"这只股票将",那么"坦克"的可能性更大。在军事信息中,"cross the river"更有可能是"bank"。等等。

给计算机编程,让它思考人类能想到的所有事情是非常困难的。几年前我读过一本关于人工智能的书,书中作者说,技术问题大多已经解决了,现代人工智能开发者知道如何通过编程让计算机重现人类思维,除了一个小问题,即"我们咨询的人类专家往往无法用可编程到计算机中的语言表达他们的工作方式"。我只是笑了。我们解决了这个问题。唯一的问题是我们的解决方案实际上不起作用。

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

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

使用英文字典作为控制,可以让你的算法知道它已经完成了。

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

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

进一步阅读:攻击密码

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

自动编程将是相当棘手的,手动方法可能是最好的。另一种方法是对前6-10个字符进行暴力破解,从字典中识别任何有意义的单词。在给定密文的情况下,可以通过忽略概率低于某个阈值的密码字母来减少所需的计算。

最新更新