三重 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 键键进行片段克隆。
我正在将一些 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 键键进行片段克隆。