三重 DES 加密需要多少个密钥?

How many keys does Triple DES encryption need?

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

这是为什么?

考虑到密钥长度只是一个简单的密钥,TDEA 键控在这里可能会更好地理解。根据使用的密钥选项,它可以是单密钥长度、双密钥长度或三密钥长度。所有部分都是必需的,将构成 "key bundle".

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

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

您看到的 "two"(或 "three")密钥很可能是使用的双(或三)密钥长度,每个部分单独提供。

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

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


关于 TDEA 工作原理的一些 background/context;来源 Wikipedia

Triple DES uses a "key bundle" that comprises three DES keys, K1, K2 and K3, each of 56 bits (excluding parity bits)...

The encryption algorithm is:

ciphertext = EK3(DK2(EK1(plaintext)))

I.e., DES encrypt with K1, DES decrypt with K2, then DES encrypt with K3.

Decryption is the reverse:

plaintext = DK1(EK2(DK3(ciphertext)))

I.e., decrypt with K3, encrypt with K2, then decrypt with K1.

Each triple encryption encrypts one block of 64 bits of data.

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 密钥,我们将使用该密钥进行加密,然后使用该密钥进行解密(返回原始数据),然后再次使用该密钥进行加密。这使得 "one key" 3DES 等同于 (1)DES.

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

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