我正在将一些C#代码移植到C ++,并尝试使用Triple DES加密来加密文本文件。但我很困惑;一些加密API只需要一个密钥用于Triple DES(C#例如:How to implement Triple DES in C# (complete example)),而其他加密API需要2或3个密钥(在我发现的几个C ++实现中)。
为什么?
答案 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字节)。
因此,如果我们有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);
你所看到的是什么"两个" (或"三")键很可能是使用的双(或三)键长度,每个部分是单独提供的。
每个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位数据块进行加密。