【问题标题】:How many keys does Triple DES encryption need?三重 DES 加密需要多少个密钥?
【发布时间】:2016-09-12 09:09:27
【问题描述】:

我正在将一些 C# 代码移植到 C++,并尝试使用三重 DES 加密来加密文本文件。但我很困惑;一些加密 API 只需要一个用于 Triple DES 的密钥(例如 C#:How to implement Triple DES in C# (complete example)),而另一些则需要 2 或 3 个密钥(在我发现的几个 C++ 实现中)。

这是为什么呢?

【问题讨论】:

    标签: c# c++ encryption des tripledes


    【解决方案1】:

    Niall 的回答是正确的,但对我来说,更多的信息会帮助您更好地理解问题。

    3DES 在某些规范中交替称为 DES-EDE,即 DES-Encrypt/Decrypt/Encrypt。

    var x = Encrypt(key1, input);
    x = Decrypt(key2, x);
    x = Encrypt(key3, x);
    return x;
    

    所以 3DES 总是需要 3 个密钥,每个密钥都有 56 个密钥位,扩展为 64 位(8 个字节),因为每 7 位都会进行 1 位奇偶校验。这通常表示为一个 192 位值(24 字节)值,或一个中间 128 位值(16 字节)。

    • 如果 3DES 密钥是 64 位(密钥强度为 56 位,许多实现会拒绝)
      • k1 = 键
      • k2 = 键
      • k3 = 键
    • 如果 3DES 密钥为 128 位(密钥强度为 112 位)
      • k1 = 键[0..7]
      • k2 = 键[8..15]
      • k3 = k1
    • 如果 3DES 密钥为 192 位(其密钥强度为 168 位)
      • k1 = 键[0..7]
      • k2 = 键[8..15]
      • k3 = 键[16..23]

    因此,如果我们有一个 64 位 3DES 密钥,我们会使用该密钥进行加密,然后使用该密钥解密(返回原始数据),然后再次使用该密钥进行加密。这使得“一键”3DES 等同于 (1)DES。

    请注意,如果 k2 恰好是 k1(或 3-key 如果 k1=k2=k3),则双键 3DES 可能会发生 DES 等效行为,因此使用 3DES 并不总是比使用 DES 升级。

    至于实现不同的原因:在 C# 中,数组带有长度标签,因此传递一个数组,接收者可以检查您传递的是 8、16 还是 24 个字节。在 C 中,数组没有长度标记,因此 API 需要询问您的数据有多长(这是 Windows CAPI 和 CNG 所做的),或者只需要三个不同的键指针,然后让您进行片段克隆 1-键和 2 键键。

    【讨论】:

    • 啊,有道理!非常感谢:)
    【解决方案2】:

    考虑到密钥长度而不是简单密钥,这里可能更好地理解TDEA 密钥。根据所使用的键控选项,它可以是单键长度、双键长度或三键长度。所有部分都是必需的,并且将构成“密钥包”。

    TDEA 基本上是 DES 密码的三种应用。 “密钥包”的每一部分都与 DES 密码算法的一次或多次执行一起使用(另请参阅Feistel cipher);

    • 对于单个密钥,使用3次(相当于经典DES但不再推荐),K1 = K2 = K3;
    • 对于双密钥,密钥的第一部分使用了两次,K1和K2是独立的,K3 = K1;
    • 对于三重密钥长度,每个密钥部分使用一次,所有部分都是独立的。

    您所看到的“二”(或“三”)键很可能是使用的双(或三)键长度,每个部分单独提供。

    每个 API 的文档应提供有关如何提供/预期密钥的详细信息。

    一些检查互操作性的测试用例也没有什么坏处。


    关于 TDEA 工作原理的一些背景/上下文;来源Wikipedia;

    三重 DES 使用包含三个 DES 密钥 K1、K2 和 K3 的“密钥包”,每个密钥为 56 位(不包括奇偶校验位)...

    加密算法是:

    密文 = EK3(DK2(EK1(明文)))

    即 DES 用 K1 加密,DES 用 K2 解密,然后 DES 用 K3 加密。

    解密是相反的:

    明文 = DK1(EK2(DK3(密文)))

    即用 K3 解密,用 K2 加密,然后用 K1 解密。

    每次三重加密都会加密一个 64 位数据块。

    【讨论】:

    • 好的,谢谢!这也意味着如果我在所有两个或三个中使用相同的密钥,它会与我只使用一个的情况兼容吗?
    • 是的。那是可以预期的;通常的警告需求如下,但不建议这样做,因为那将是简单的 DES。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 2020-12-31
    • 2012-03-30
    • 2015-06-22
    • 2017-06-09
    相关资源
    最近更新 更多