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

本文关键字:密钥 多少 DES 加密 三重 | 更新日期: 2023-09-27 18:06:48

我正在将一些c#代码移植到c++中,并尝试使用三重DES加密加密文本文件。但我很困惑;一些加密api对于三重DES只需要一个密钥(例如c#:如何在c#中实现三重DES(完整示例)),而其他加密api则需要2或3个密钥(在我发现的几个c++实现中)。

为什么?

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

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

3DES在某些规范中也被称为DES-EDE,即des - encryption/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 = key
    • k2 = key
    • k3 = key
  • 如果3DES密钥为128位(密钥强度为112位)
    • k1 = key[0..7]
    • k2 = key[8..15]
    • k3 = k1
  • 如果3DES密钥为192位(密钥强度为168位)
    • k1 = key[0..7]
    • k2 = key[8..15]
    • k3 = key[16..23]

所以如果我们有一个64位的3DES密钥,我们用密钥加密,然后用密钥解密(返回原始数据),然后再用密钥加密。这使得"一键"3DES相当于(1)DES。

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

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

考虑到密钥长度比一个简单的密钥更容易理解TDEA密钥。根据所使用的键控选项,它可以是单键长度、双键长度或三键长度。所有部件都是必需的,并将构成"密钥包"。

TDEA基本上是DES密码的三种应用。"密钥包"的每个部分都与一个或多个DES密码算法的执行一起使用(另见Feistel密码);
  • 对于单个密钥,使用三次(相当于经典的DES,但不再推荐使用),K1 = K2 = K3;
  • 对于双密钥,密钥的第一部分使用两次,K1和K2相互独立,K3 = K1;
  • ,对于三键长度,每个键部分使用一次,所有部分都是独立的。

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

每个API的文档应该提供如何提供/期望键的详细信息。

几个测试用例来检查互操作性也没有坏处。


关于TDEA如何工作的一些背景/背景;维基百科来源;

三重DES使用一个"密钥束",包括三个DES密钥,K1, K2和K3,每个56位(不包括奇偶校验位)…

加密算法为:

密文= E <子> K3 (D <子> K2 (E <子> K1 (明文)))

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

解密是相反的:

明文= D <子> K1 (E <子> K2 (D <子> K3 (密文)))

。,先用K3解密,再用K2加密,再用K1解密。

每个三重加密加密一个64位的数据块。