Triple DES加密需要多少个密钥?

Jol*_*lle 3 c# c++ encryption des tripledes

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

这是为什么?

bar*_*njs 6

Niall的答案是正确的,但对我而言,感觉更多信息可以帮助您更好地理解问题.

3DES在一些规范中被交替称为DES-EDE,即DES加密/解密/加密.

var x = Encrypt(key1, input);
x = Decrypt(key2, x);
x = Encrypt(key3, x);
return x;
Run Code Online (Sandbox Code Playgroud)

因此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(或者k1 = k2 = k3时为3键),则对于双键3DES会发生DES等效行为,因此使用3DES并不总是使用DES进行升级.

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