在C#.Net中,3DES密钥大小是否重要?

19

以下代码在c#.NET中运行良好

byte[] key = Encoding.ASCII.GetByte("012345678901234567890123"); //24characters        
byte[] plainText = Encoding.ASCII.GetBytes("lasaa"); 
TripleDES des = TripleDES.Create();
des.Key = key;
des.Mode = CipherMode.CBC;
ICryptoTransform ic = des.CreateEncryptor();
byte[] enc = ic.TransformFinalBlock(plainText, 0, plainText.Length);
MessageBox.Show(UTF8Encoding.UTF8.GetString(enc));

关于上述问题,我的问题是...

  1. 如何指定 KeySize?如果我使用 des.KeySize= 128192256,它会给出:

指定的密钥对于此算法无效。

  1. 如果我通过添加更多字符长度(例如:40个字符)来更改密钥,则会出现错误。

指定的密钥对于此算法无效。

我想知道为什么会发生这种情况?


我认为你受到了16和24个字符/字节密钥长度的限制,详见我的回答。 - Jodrell
4个回答

27

3DES密钥长度为128或192位。注意,算法在内部仅使用这些128(或192)位中的112(或168)位;但是,密钥本身以字节编码、存储和交换,必须具有16或24个字节的长度。尝试设置不具有这两种长度之一的密钥会触发错误,您会在尝试使用40字节密钥时遇到此错误。

您不应尝试设置“密钥大小”:在设置密钥时,您已经决定了其大小。当您设置TripleDES.Key属性时,TripleDES类会看到您提供了一个24字节的密钥,因此会将自己的KeySize属性设置为192。

(3DES加密的输出是二进制的,而不是字符串的UTF-8编码。最终的UTF8Encoding.UTF8.GetString(enc)可能会报错。)


4
TripleDES的密钥大小为168位,因此需要21字节。如果要使用字符串作为密钥,您应该先进行哈希处理。在这种情况下,您可以使用任意长度的字符(越多越好),然后将修剪哈希输出到密钥大小。例如,如果您使用SHA-256,您将获得32个字节,使用其中的21个字节即可。

1
尽管“TripleDES”的密钥大小为168位,但其字节长度仍为24字节(或192位)。每个字节的最后一位未被使用(或在某些硬件中用作版本)。 “TripleDES”的密钥长度也可以是112位,这再次存储在128位或16字节中。 - AaA

1

这是我用来实现“trim”的一些代码

byte[] keyArray;
SHA512CryptoServiceProvider hash = new SHA512CryptoServiceProvider();
keyArray = hash.ComputeHash(UTF8Encoding.UTF8.GetBytes("someProperlySaltedKey"));
byte[] trimmedBytes = new byte[24];
Buffer.BlockCopy(keyArray, 0, trimmedBytes, 0, 24);
keyArray = trimmedBytes;
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
tdes.Key = keyArray;

0

我认为这里的问题是C#(以及其他地方)支持3DES的最大密钥大小为192位。

http://msdn.microsoft.com/en-us/library/system.security.cryptography.symmetricalgori...

你尝试过将密钥设置为16字节/字符吗?

唯一支持的其他大小似乎是128位。如果您想要更强的加密,您将需要使用不同的算法,如Aes/Rijndael。

如果您在Wikipedia上查看TDES,似乎最大密钥大小为168位,因此我不确定Microsoft如何实现它。

我怀疑由于简洁性而省略了您示例中的哈希密钥,但您应该从密码学命名空间中选择几个RNG/HSH算法来对密钥进行散列处理。


TripleDES是TripleDES,它不是特定于语言的,因此密钥大小将保持不变,单长度(56)、双长度(112)或三倍长度(168)。但是,由于单长度的输出等效于DES,因此某些语言现在不支持56位长度的密钥。 - Mubashar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接