3DES密钥大小在C#.Net中很重要

时间:2011-04-12 08:11:47

标签: c# encryption 3des

下面的代码在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则会提供
  2.   

    指定密钥不是此算法的有效大小

    1. 如果我通过添加更多来改变键中的字符长度(例如:40个字符)。它给出了错误
    2.   

      指定密钥不是此算法的有效大小

      我想知道为什么会这样?

4 个答案:

答案 0 :(得分:26)

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

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

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

答案 1 :(得分:4)

TripleDES的密钥大小为168位。所以你需要21个字节。如果你想为密钥使用一个字符串,你应该先将它哈希。在这种情况下,您可以使用任意长度的字符(越多越好),然后将散列输出修剪为您的密钥大小。例如。如果您使用SHA-256,您将获得32个字节,请使用其中的21个。

答案 2 :(得分:0)

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

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

您是否尝试将密钥设置为16字节/字符值?

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

如果你在Wikipedia上查看TDES,似乎最大密钥大小是168位,所以我不确定微软是如何实现它的。

我怀疑为了简洁起见,你的例子中省略了它,但你应该从一个好的盐中哈希你的钥匙。在加密命名空间中有几种RNG / HSH算法。

答案 3 :(得分:0)

以下是我用来完成此操作的一些代码" 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;