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

时间:2016-09-12 09:09:28

标签: c# c++ encryption des tripledes

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

为什么?

2 个答案:

答案 0 :(得分:6)

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

3DES在某些规范中被称为DES-EDE,即DES加密/解密/加密。

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密钥,我们使用密钥加密,然后使用密钥解密(返回原始数据),然后再次使用密钥加密。这使得"一键#34; 3DES相当于(1)DES。

请注意,如果k2巧合地为k1,则可能发生DES等效行为(如果k1 = k2 = k3,则为3键),因此使用3DES并不总是使用DES进行升级。

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

答案 1 :(得分:2)

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

TDEA基本上是DES密码的三个应用程序。 "密钥包的每一部分"用于DES密码算法的一个或多个执行(另请参阅Feistel cipher);

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

你所看到的是什么"两个" (或"三")键很可能是使用的双(或三)键长度,每个部分是单独提供的。

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

检查互操作性的一些测试用例也不会受到影响。

关于TDEA如何运作的一些背景/背景;来源Wikipedia;

  

Triple 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位数据块进行加密。