C#.Net中的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));
我关于以上的问题是... 如何指定KeySize?如果我使用
des.KeySize=
128
192
256
  指定的密钥对此算法无效 如果我通过添加更多字符(例如40个字符)来更改键中的字符长度。它给出了错误   指定的密钥对此算法无效 我想知道为什么会这样吗?     
已邀请:
3DES密钥的长度为128或192位。请注意,在内部,该算法将仅使用这128个(分别为192个)位中的112个(分别为168个)位;但是,密钥本身(以字节编码,存储和交换)必须具有16或24个字节的长度。尝试设置没有这两个长度之一的密钥会触发错误,当您尝试使用40字节密钥时会观察到此错误。 您不应该尝试设置\“密钥大小\”:设置密钥时您已经决定了。当您设置
TripleDES.Key
属性时,
TripleDES
类将为您提供一个24字节的密钥,因此会将itself7ѭ属性设置为192。 (3DES加密的输出是二进制的,而不是字符串的UTF-8编码。很可能最后的
UTF8Encoding.UTF8.GetString(enc)
会提出抗议。)     
TripleDES的密钥大小为168位。因此,您将需要21个字节。如果要使用字符串作为键,则应首先对其进行哈希处理。在这种情况下,您可以使用任何长度的字符(越多越好),然后将散列的输出修剪为您的密钥大小。例如。如果您使用SHA-256,将从中获得32个字节,请使用其中的21个字节。     
这是我用来完成此“修剪”的一些代码
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;
    
我认为这里的问题是192位是C#中3DES支持的最大密钥大小(以及我认为的其他地方) http://msdn.microsoft.com/zh-CN/library/system.security.cryptography.symmetricalgori ... 您是否尝试过将密钥设置为16个字节/字符的值? 支持的唯一其他大小似乎是128位。如果您想要更强大的功能,则必须使用其他算法,即Aes / Rijndael。 如果您在Wikipedia上查找TDES,似乎最大密钥大小为168位,因此我不确定Microsoft如何实现它。 我为简洁起见,在您的示例中忽略了它,但是您应该从大量盐中散列密钥。加密名称空间中有几种RNG / HSH算法。     

要回复问题请先登录注册