C#Net中的3DES键大小问题
下面的代码在c#.NET中运行良好 关于上述问题,我的问题是C#Net中的3DES键大小问题,c#,encryption,3des,C#,Encryption,3des,下面的代码在c#.NET中运行良好 关于上述问题,我的问题是 如何指定密钥大小?如果我使用des.KeySize=128或192或256它给出 指定的密钥不是此算法的有效大小 如果我通过添加更多字符(例如:40个字符)来更改键中的字符长度。这是错误的 指定的密钥不是此算法的有效大小 我想知道为什么会发生这种情况?的密钥大小是168位。所以你需要21个字节。如果您想使用字符串作为密钥,您确实应该首先对其进行散列。在这种情况下,您可以使用任意长度的字符(越多越好),然后将散列输出修剪为密钥大小。例如
128
或192
或256
它给出我想知道为什么会发生这种情况?的密钥大小是168位。所以你需要21个字节。如果您想使用字符串作为密钥,您确实应该首先对其进行散列。在这种情况下,您可以使用任意长度的字符(越多越好),然后将散列输出修剪为密钥大小。例如,如果您使用的是32个字节,那么就使用其中的21个。我认为这里的问题是,192bit是C#中3DES支持的最大密钥大小(我假设在其他地方) 您是否尝试过将键设置为16字节/字符值 唯一支持的其他大小似乎是128位。如果你想要更强大的东西,你必须使用不同的算法,Aes/Rijndael 如果您查看TDE,它的最大密钥大小似乎是168位,因此我不确定Microsoft是如何实现它的
我怀疑为了简洁起见,您的示例中省略了它,但您可能应该从大量的盐中删除密钥。在加密名称空间中有几种用于此的RNG/HSH算法 3DES密钥的长度为128或192位。注意,在内部,算法将仅使用128(分别为192)位中的112(分别为168)位;但是,密钥本身编码为字节、存储和交换的长度必须为16或24字节。试图设置一个没有这两种长度之一的键会触发一个错误,您在尝试使用40字节键时会观察到这个错误 您不应该尝试设置“密钥大小”:在设置密钥时,您已经决定了。当您设置
TripleDES.Key
属性时,TripleDES
类会看到您给它一个24字节的键,因此会将KeySize
属性设置为192
(3DES加密的输出是二进制的,而不是字符串的UTF-8编码。您的最终
UTF8Encoding.UTF8.GetString(enc)
可能会提出抗议。)以下是我用来完成此“修剪”的一些代码
我想您被限制为16和24个字符/字节的密钥长度,请参见我的答案。虽然
TripleDES
的密钥大小是168位,但其字节长度仍然是24个字节(或192位)。未使用每个字节的最后一位(或在某些硬件中用作版本)。TripleDES
的密钥len也可以是112位,再次以128位或16字节的形式存储。TripleDES是三倍的,其语言不特定,因此密钥大小将保持不变,单长度(56)、双长度(112)或三长度(168),然而,由于使用单长度,其输出相当于DES,因此一些语言现在不支持56长度的键。
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));
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;