2

目前我正在尝试破解 C 中的 TEA 分组密码。这是一个分配,并且茶密码已被削弱,因此密钥是 2 个 16 位数字。

我们已经获得了使用密钥对明文进行编码并使用密钥对密文进行解码的代码。

我有一些明文示例:

  1. 明文(1234,5678)编码(3e08,fbab)
  2. 明文(6789,dabc) 编码 (6617,72b5)

更新

编码方法接受明文和一个密钥,encode(plaintext,key1)。使用另一个密钥再次发生这种情况以创建编码消息,encode(ciphertext1,key),然后创建编码的 (3e08,fbab) 或编码的 (6617,72b5)。

我将如何破解这个密码?

目前,我用每个可能的密钥对已知的明文进行编码;密钥大小为十六进制值 ffffffff。我把它写到文件中。

但现在我被困住了,需要方向。


我如何利用 TEA 的等效密钥弱点来减少破解密码所需的时间?另外,我将在中间攻击中使用一个人。

当我使用已知明文和所有密钥 1 进行编码时,它将创建所有具有关联密钥的加密文本并将其存储在表中。

然后,我将使用我分配中的已知密文以及 key2 的所有可能值进行解密。这将给我留下一张只解密过一次的解密表。

然后我可以比较这两个表,看看是否有任何带有 key1 的 encrpts 与带有 key2 的解密相匹配。

如果有人可以帮助我在代码中实现这一点,我也想使用等效的弱点。有任何想法吗?

4

5 回答 5

4

这与 IOI '2001 编程竞赛中的Double Crypt问题非常相似。此处显示了通用解决方案,它不会为您提供代码,但可能会为您指明正确的方向。

于 2010-11-11T21:04:42.877 回答
2

不要将您的结果写入文件——只需将您生成的每个密文与已知密文进行比较,使用每个可能的密钥对已知纯文本进行编码,直到其中一个生成正确的密文。此时,您使用了正确的密钥。通过使用相同的密钥加密第二个已知的明文来验证它是否也产生了正确的输出。

编辑:发生两次的编码影响不大。你仍然会得到这样的东西:

for (test_key=0; test_key<max; test_key++)
    if (encrypt(plaintext, test_key) == ciphertext)
        std::cout << "Key = " << test_key << "\n";

加密发生两次意味着您encrypt将看起来像:

return TEA_encrypt(TEA_encrypt(plaintext, key), key);

Edit2:好的,根据编辑过的问题,您显然必须执行两次弱化 TEA,每次都有自己的 16 位密钥。您可以使用上面的单个循环来做到这一点,并将其拆分test_key为两个独立的 16 位键,或者您可以执行嵌套循环,例如:

for (test_key1=0; test_key1<0xffff; test_key1++)
    for (test_key2=0; test_key2<0xffff; test_key2++)
        if (encrypt(encrypt(plaintext, test_key1), test_key2) == ciphertext)
            // we found the keys.
于 2010-11-11T19:59:05.980 回答
1

我不确定这个属性是否适用于 16 位密钥,但 128 位密钥具有四个密钥等效的属性,从而将您的搜索空间减少了四倍。我不记得如何找到等效的密钥,只是密钥空间没有看起来那么大。这意味着它容易受到相关密钥攻击。

您将此标记为家庭作业,因此我不确定这里是否还有其他要求,例如不使用蛮力,您似乎正在尝试这样做。如果您要进行蛮力攻击,您可能需要知道明文应该是什么样子(例如知道它是英语)。

于 2010-11-11T20:02:02.523 回答
1

等效键很容易理解并将键空间减少了四倍。密钥分为四个部分。每个 TEA 循环有两轮。第一个使用键的前两个部分,而第二个使用第三和第四部分。这是 TEA 的单个周期(两轮)的图表:(未注册的用户不允许包含图像,所以这里有一个链接) https://en.wikipedia.org/wiki/File:TEA_InfoBox_Diagram.png

注意:绿色方框是加法,红色圆圈是异或

TEA 在它分成两半的块上运行。在每一轮中,块的一半向左移动 4,0 或 -5 位,将一部分密钥或轮常数添加到其中,然后将结果值的 XOR 添加到另一半块的。翻转任一关键段的最高有效位会翻转其用于和扩展的 XOR 结果中的相同位,但没有其他效果。翻转一轮中使用的两个关键段的最高有效位会翻转 XOR 乘积中的同一位两次,使其保持不变。将这两位翻转在一起不会改变分组密码结果,使翻转的密钥与原始密钥等效。这可以针对(第一/第二)和(第三/第四)键段进行,将键的有效数量减少四倍。

于 2013-02-04T01:48:27.070 回答
0

鉴于加密密钥的(适度)大小,您可以创建一个预先计算的表(使用上面给出的相同代码,并将数据存储在大块内存中 - 如果您没有足够的 RAM,请将这些块转储到磁盘并保留一个寻址方案,以便您可以按正确的顺序查找它们)。

这样做可以让您覆盖整个领域,然后实时找到解决方案(一个单一的表查找)。

领先的 Office 软件(不久前)使用了相同的技巧(关键截断)。他们现在使用非随机数据来生成加密密钥——这(充其量)会导致相同的结果。在实践中,在生成加密密钥之前知道它们的能力(因为所谓的随机生成器是可预测的)甚至比密钥截断(它导致相同的结果——但没有构建和存储的障碍)更可取彩虹表)。

这叫做进步的进行曲……

于 2010-11-11T20:35:27.763 回答