【问题标题】:Emulate 3DES EDE using only DES仅使用 DES 模拟 3DES EDE
【发布时间】:2012-04-20 12:17:05
【问题描述】:

我的设备不支持完整的 3DES (EDE)。如何使用标准 DES 模拟一个?加密方式为CBC。

【问题讨论】:

    标签: encryption encryption-symmetric des 3des


    【解决方案1】:

    您首先选择三个独立的 DES 密钥,它们彼此之间没有任何关系。

    您需要将 DES 置于 ECB 模式,不是 CBC 模式。您还需要确保每个加密和解密操作仅在 64 位块上完成,仅此而已。填充方案等会导致实现中的漏洞,并会导致通过暴力破解比暴力破解每个密钥更快地发现块内容。

    使用第一个密钥加密您的明文。使用第二个密钥解密该值。使用第三个密钥加密完整块的值。它看起来像这样:

    Encrypt(k3, Decrypt(k2, Encrypt(k1, plaintext)))

    解密是相反的,看起来像这样:

    Decrypt(k1, Encrypt(k2, Decrypt(k3, ciphertext)))

    当您使用 3DES 加密您的块时,您需要应用您的操作模式,例如 CBC 或 CTR,并在需要时应用填充。

    小心点。

    【讨论】:

      【解决方案2】:

      块模式加密

      您所做的是将大小为 128 位(16 字节)或 168 位(24 字节)的密钥分别分成两块或三块。因此,对于 16 字节的密钥 K,您将有两个密钥 Ka 和 Kb,对于 24 字节的密钥,您将拥有 Ka、Kb 和 Kc。 DES ABC 密钥的有效强度约为 112 位,DES ABA 密钥的有效强度约为 80 位。

      要加密 8 字节的单个块(DES 和 3DES 的块大小),您将执行以下加密操作: Cn = E(Ka, D(Kb, E(Kc, Mn))) 其中 Mn 是纯文本消息的第 n 个块和 Cn 密文的第 n 个块。如果您没有 Kc,那么您可以使用 Ka(DES ABC 密钥与 DES ABA 密钥)。

      为此,您需要单块 DES 加密,这与 ECB 模式下的单块加密相同,或者使用 CBC 和由 8 字节值 00h 组成的 IV 进行单块加密。

      CBC

      这就是排序的块加密,现在你需要某种加密模式和填充模式。我这里解释一下CBC模式加密,ECB不应该用于加密非随机数据。

      使用 CBC 模式加密,您可以将向量异或到纯文本。该向量通常只是最后一个 DESede 加密块的输出。由于您没有任何前面的密文,因此您需要使用随机数据自己创建第一个向量。这个向量称为初始化向量或IV。请参阅wikipedia 以获得清晰的图片。

      填充

      块密码模式只允许加密完整的纯文本块。所以你需要某种填充方案。虽然有很多填充模式,但大部分时间都使用 PKCS#5 填充。您应该像这样填充纯文本:使用值为 0Xh 的字节填充,其中 X 是创建完整块所需的填充字节数。 X 应该在 1 到 8 之间:换句话说,始终使用 PKCS#5 填充;这使得从纯文本中区分填充字节成为可能。

      如果您在在线协议中使用填充,那么您需要防止填充预言攻击。在这种情况下,强烈建议使用某种形式的完整性检查,例如通过使用单独的密钥在密文上添加 HMAC。

      【讨论】:

        【解决方案3】:

        3DES 只是 DES 在明文中使用了 3 次:

        ciphertext = E_K3(D_K2(E_K1(plaintext)))
        plaintext = D_K1(E_K2(D_K3(ciphertext)))
        
        E_Kn = Encryption with Key number n.
        D_Kn = Decryption with Key number n.
        

        因此您可以仅使用 DES 轻松“模拟”3DES。

        在 CBC 模式下,您需要一个 IV 开头,然后将下一个明文块与前一个密文块进行异或。如果您的设备不支持 CBC,那么这也很容易“模拟”。

        【讨论】:

        • 如果不对块边界进行操作,由于填充和CBC的应用会导致不安全的实现。 CBC 和填充必须在复合 3DES 操作之后完成。
        • @MichaelJ.Gray 这不是一个非常明确的建议迈克尔。对于加密,我认为您不想在复合 3DES 操作之后进行填充。
        • @owlstead 我的错。你是对的。由于明显的原因,CBC 将在之后应用,并且将以 Encrypt(k3, Decrypt(k2, Encrypt(k1, Pad(plaintext)))) 的形式对未对齐的块进行填充。我昨晚发布的时候已经很晚了;)
        猜你喜欢
        • 2015-03-11
        • 2011-01-26
        • 2011-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-15
        • 2017-06-09
        相关资源
        最近更新 更多