如何破解弱化的TEA分组密码?

时间:2010-11-11 19:51:13

标签: c cryptography encryption block-cipher tea-cipher

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

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

我有一些明文的例子:

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

    编码方法采用明文和密钥,编码(明文,密钥1)。这又发生了另一个密钥,用于创建编码消息,编码(密文,密钥),然后创建编码(3e08,fbab)或编码(6617,72b5)。

    我如何破解这个密码?

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

    但现在我被困住了,需要指导。


    我如何使用TEA的等效键弱点来降低破解密码所需的时间?另外,我打算用中间人攻击。

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

    然后,我将使用key2中所有可能值的已知密文进行解密。这将给我一个解密表,只有一次解密。

    然后我可以将这两个表进行比较,看看是否有任何一个带有key1的包含与使用key2的解密相匹配。

    我也想使用equilenvent的弱点,如果有人可以帮助我在代码中实现这一点,这将是伟大的。有什么想法吗?

5 个答案:

答案 0 :(得分:4)

这与IOI'2001编程竞赛中的 Double Crypt 问题非常类似。一般解决方案显示为here,它不会为您提供代码,但可能会指向正确的方向。

答案 1 :(得分: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.

答案 2 :(得分:1)

我不确定这个属性是否适用于16位密钥,但128位密钥具有四个密钥相同的属性,将搜索空间减少了四倍。我不会忘记如何找到等效键,只是键空间不像它看起来那么大。这意味着它容易受到相关密钥的攻击。<​​/ p>

你把它标记为家庭作业,所以我不确定这里是否有其他要求,比如不使用蛮力,这似乎是你试图做的。如果你要进行蛮力攻击,你可能需要知道明文应该是什么样的(比如知道英语)。

答案 3 :(得分:1)

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

注意:绿色框是加红色圆圈是XOR

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

答案 4 :(得分:0)

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

执行此操作将覆盖整个域,然后找到一个解决方案,然后实时完成(单个表查找)。

在领先的Office软件中使用(不是很久以前)相同的技巧(密钥截断)。他们现在使用非随机数据来生成加密密钥 - 其中(最多)导致相同的结果。在实践中,在生成加密密钥之前知道加密密钥的能力(因为所谓的随机生成器是可预测的)比密钥截断更令人满意(它导致相同的结果 - 但没有必须构建和存储的障碍彩虹表)。

这被称为进步的进程......