哪些可打印的ASCII字符通常会出现在英文文本中?

时间:2010-08-05 12:56:12

标签: encryption cryptography

我一直试图解决Project Euler's problem #59一段时间,我遇到了麻烦,因为有些问题似乎比以前的问题更加模棱两可。

作为背景,问题是给定的文本文件是加密文本,ASCII码保存为数字。加密方法是用明文循环XOR 3小写字母(因此它是可逆的)。该问题要求将文件解密为英文文本的密钥。我应该如何限制输出的字符集来获得答案,而不是试图筛选所有可能的明文(26 ^ 3)?

我已经尝试过限制字母,空格和标点符号,但这不起作用。

澄清一点:我想从所有可打印的ASCII字符中确定哪些可以丢弃,哪些可以放在明文字符串中。

5 个答案:

答案 0 :(得分:4)

在分析使用的算法时,您是否尝试过两种最“基本”和常用的工具?

  1. 分析字符的频率并尝试将其与英文字母频率匹配
  2. Bruteforce使用词汇表中的键,大多数情况下常用词被“哑”用户用作键
  3. 要分析此特定问题的频率,您必须每隔三个元素拆分字符串,因为密钥长度为3,您现在应该能够生成三列:

    79  59  12
    2   79  35
    8   28  20
    2   3   68
    ...
    

    您必须分析每列的频率,因为现在它们与密钥无关。

    好的,实际上花了我的时间并构建了3个完整的列并计算了每个列的频率,得到了两个最常用的项目或每列:

    Col1  Col2  Col3
    71    79    68
    2     1     1
    

    现在,如果您检查实例:http://en.wikipedia.org/wiki/Letter_frequency 你有最常用的字母,不要忘记你有空格和其他字符在该页面上没有,但我认为你可以假设空间是最常见的字符。

    所以现在只需要xor:表格中最频繁的字符,我提供英语中最常用的字符,看看你是否得到任何小写字符,我发现我认为是一个三个字母的单词只有这些数据才是答案。

    祝你好运,顺便说一句,这是一个很好的问题!

答案 1 :(得分:2)

一种可能的解决方案是简单地假设加密文本中存在给定的三字符序列。您可以使用三个字母的单词,或者可能出现在英文文本中的三个字母的单词(例如" a ":两个空格之间的字母'a')。然后,只需在加密文本中尝试该序列的所有可能位置。每个位置都允许您简单地重新计算密钥,然后将整个文本解密为文件。

由于原始文本的长度为1201,因此您可以浏览1199个文件。在这一点上,这只是一个耐心的问题,但你可以通过在另一个英语频繁序列(例如"are")上使用简单的文本搜索工具来加快速度,例如使用Unix工具{{1} }。

我做到了这一点,并在不到五分钟的时间内获得了解密文本。

答案 2 :(得分:1)

我会先承认我不熟悉XOR密码。

然而,它似乎与vigenere密码的概念非常相似。特别是在他们提到的不可破解加密的行中,密钥长度等于消息长度。那令Vernam Cipher尖叫。

正如在另一个答案中所提到的,打破vigenere密码的战略方法涉及概率方法。我不会详细说明,因为我学到的大部分理论都比较复杂,但可以发现here要记住,vignere是一系列凯撒密码。

这个问题让你很容易,因为你已经知道了keylength。正因为如此,正如您所提到的,您可以通过尝试每个单独的3个字母组合来简单地暴力。

这就是我要做的事情:采用一个相当大小的密文块,比方说10-20个字符,并尝试蛮力方法。跟踪所有似乎创建可理解的字母序列的键,然后在整个密文上使用它们。这样我们可以使用明显的暴力强制方法,但不会破坏整个问题,所以我认为你不必担心限制你的输出。

那就是说,我同意,当你创建输出时,如果你得到一个不可打印的字符,你可能会打破你的循环并转到下一个键。我不会尝试任何比这更具体的内容,因为谁知道原始消息可能具有什么,从不对您正在处理的数据做出假设。像这样的短路逻辑总是一个好主意,特别是在实施强力解决方案时。

答案 3 :(得分:0)

将密文拆分为3。

密文1包括第1,第4,第7,第10 ......数字 密文2包括第2,第5,第8,第11 ......数字 密文3包括第3,第6,第9,第12 ......数字

现在您知道每个密文都使用相同的密钥加密。现在对它进行标准频率分析。这应该给你足够的线索,说明这封信是什么。

答案 4 :(得分:0)

我刚刚解决了这个问题。在不破坏它的情况下,我想描述我解决这个问题的方法。我说的一些内容对你已经知道的内容可能是多余的,但这是我的方法的一部分。

首先,我假设密钥完全按照描述,三个小写ASCII字母。所以我开始强行''aaa'然后去'zzz'。解密时,如果任何结果字节的值低于32(空格的ASCII值,最低​​的“可打印”ASCII值)或高于126(波形符'〜'的ASCII值,这是ASCII中可打印的最高字符)我认为密钥是无效的,因为32和126之外的任何值都是纯文本英语的无效字符。只要一个字节超出此范围,我就会停止解密并转到下一个可能的密钥。

一旦我使用特定密钥解密整个消息(在所有字节的第一次测试都是可打印字符之后),我需要一种方法将其验证为有效的解密。我期待结果是一个简单的单词列表,没有特定的顺序或含义。通过其他加密经验,我回想起字母频率,最简单的是你的文本中的平均英文单词长度为5个字符。该文件包含1201个输入字节。这意味着(平均)会有240个单词。解密后,我计算了结果输出字符串中有多少个空格。由于欧拉项目不是平均水平,我将空间数量与200个进行比较会计更长,更模糊的单词。当输出中有超过200个空格时,我打印出它被解密的密钥和输出文本。具有超过200个空格的唯一输出就是答案。让我告诉你,当你看到它时,你得到的答案就显而易见了。

需要指出的是,问题的答案不是关键。它是输出字符串的所有ASCII值的总和。这种方法也将解决一分钟标记下的等式,事实上,它在大约3或4秒内完成。