2011-09-07 123 views
1

我正在读“加密和网络安全”一书,我一直在试图编写该程序在单音字母密码上执行字母频率攻击。该程序需要生成前10个可能的纯文本。字母频率java

我有点卡住了这可能是如何工作的,我是否认为它并不总是这样的情况,即“可能的”纯文本生成将实际上匹配原始纯文本?

如果有人能够提供一些关于程序如何流动的指导,那将是非常棒的。

到目前为止,我有代码;

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

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

任何建议将是伟大的!

+0

你可以发布你目前使用的代码吗? – Woot4Moo

回答

1

我不是密码学方面的专家,但我认为你是过于简单化了。是的,密码学家的一个有用的工具是字母的相对频率表。但是,我认为,任何给定的文件将完全匹配整体频率的概率非常小。正如我记得的那样,在英语中,最常见的字母是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停留在序列中间时,从那里开始,所有假定的映射都是错误的。

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

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

+0

这正是我以为,从我从事过我曾用过试验和错误的例子,直到我得到正确的纯文本。我真的不知道没有人为干预的情况下程序如何做到这一点(这就是问题所在) – Lunar

+1

简短回答:是的。长的回答:我不怀疑你可以编写一个程序来打破简单的替代密码而无需人工干预。它只需要更复杂。在某些时候,它将不得不在字典中试图查看它们是否映射到真正的英语单词,可能是进行一定程度的语法检查等。 – Jay

+0

@Jay:你几乎肯定不需要语法检查。对于任何非平凡的输入,产生大量英文单词的错误映射的可能性很小。 –

1

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

延伸阅读:attacking ciphers

+0

我已经进行了纸上的攻击,它工作正常,我认为单字母密码也包含随机字母密码?在这种情况下,蛮力攻击不会奏效,因为密钥太多了。 – Lunar

+0

有很多针对单字母密码的攻击。 – Woot4Moo

+1

@lunar此链接可能会有所帮助:http://unsecure.co.uk/attackingmonoalphabeticciphers.asp – Woot4Moo

1

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

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

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

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

+0

我不是说这就是你说的,但是:理论上,你可以尝试每一个可能的映射,然后选择给出最多英文单词的那个。 (在正确的映射中,你不能指望100%英文单词,因为文本可能包含专有名称或其他技术或其他不太明显的单词,而不在你的字典中。)但是有26个!映射,这是一个巨大的数字。即使有一台电脑,我猜想全部尝试都是不切实际的。 – Jay

0

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

编程这一切都是非常棘手的,手动方法可能是最好的。或者,对前6到10个字符采用暴力方法来识别字典中任何明智的字词。考虑到密码文本,您可以通过忽略其概率低于某个阈值的密码字母来减少所需的计算。