三重DES加密需要多少个密钥?
本文关键字:密钥 多少 DES 加密 三重 | 更新日期: 2023-09-27 18:06:48
我正在将一些c#代码移植到c++中,并尝试使用三重DES加密加密文本文件。但我很困惑;一些加密api对于三重DES只需要一个密钥(例如c#:如何在c#中实现三重DES(完整示例)),而其他加密api则需要2或3个密钥(在我发现的几个c++实现中)。
为什么?
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位的数据块。