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

C 如何破解弱化的TEA分组密码?,c,cryptography,encryption,block-cipher,C,Cryptography,Encryption,Block Cipher,目前我正在尝试破解C中的TEA分组密码。这是一个赋值,TEA密码已被削弱,因此密钥是2个16位的数字 我们已经得到了使用密钥对明文进行编码以及使用密钥对密文进行解码的代码 我有一些纯文本的例子: 明文(12345678)编码(3e08,fbab) 明文(6789,dabc)编码(6617,72b5) 更新 encode方法接受明文和一个键encode(明文,键1)。使用另一个密钥创建编码消息encode(ciphertext1,key)时会再次出现这种情况,然后创建编码(3e08,fbab)或编

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

我们已经得到了使用密钥对明文进行编码以及使用密钥对密文进行解码的代码

我有一些纯文本的例子:

  • 明文(12345678)编码(3e08,fbab)
  • 明文(6789,dabc)编码(6617,72b5)
  • 更新 encode方法接受明文和一个键encode(明文,键1)。使用另一个密钥创建编码消息encode(ciphertext1,key)时会再次出现这种情况,然后创建编码(3e08,fbab)或编码(6617,72b5)

    我该如何破解这个密码

    现在,我用每一个可能的密钥对已知的明文进行编码;键大小为十六进制值FFFFFF。我把这个写进文件

    但现在我陷入困境,需要指引方向


    我如何利用TEA的等效密钥的弱点来减少破解密码所需的时间?另外,我会使用中间人攻击。< /P> 当我使用已知明文和所有密钥1进行编码时,它将创建所有带有相关密钥的加密文本,并将其存储在表中

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

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


    如果有人能帮助我在代码中实现这一点,那将是非常好的,我也希望使用equilenvent弱点。有什么想法吗?

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

    编辑:两次编码没有什么影响。你仍然会得到这样的结果:

    for (test_key=0; test_key<max; test_key++)
        if (encrypt(plaintext, test_key) == ciphertext)
            std::cout << "Key = " << test_key << "\n";
    
    Edit2:好的,根据编辑过的问题,显然你必须做两次弱化TEA,每个都有自己的16位键。您可以使用如上所述的单个循环,将
    test\u键
    拆分为两个独立的16位键,或者可以执行嵌套循环,类似于:

    return TEA_encrypt(TEA_encrypt(plaintext, key), key);
    
    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.
    

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

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

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

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

    领先的办公软件(不久前)也使用了同样的技巧(密钥截断)。现在,他们使用非随机数据生成加密密钥,这(最多)会导致相同的结果。实际上,在生成加密密钥之前就知道加密密钥的能力(因为所谓的随机生成器是可预测的)甚至比密钥截断更可取(它会导致相同的结果,但不需要构建和存储彩虹表)


    这被称为进步的进军…

    这与IOI'2001编程竞赛中的双重密码问题非常相似。一般的解决方案是,它不会给出代码,但可能会为您指明正确的方向。

    等效密钥非常容易理解,并将密钥空间缩减了四倍。密钥是分为四个部分。每个周期的茶有两轮。第一轮使用钥匙的前两部分,第二轮使用钥匙的第三和第四部分。以下是一个周期(两轮)的茶图: (未注册的用户不允许包含图像,因此这里有一个链接)

    注:绿色方框为加法,红色圆圈为XOR


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

    我忘了添加,编码发生两次,但它们是两个不同的密钥编码(明文,密钥1)然后编码(密文,密钥2),然后给出编码(3e08,fbab)或编码(6617,72b5)..我编辑了上面的帖子您上面的代码将按如下方式打印:key1=0001,key2=0001,然后按如下方式递增key1=0002 key2=0002,