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= 128or192或者256它给出

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

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

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

我想知道为什么会这样?

4

4 回答 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)可能会抗议。)

于 2011-04-12T11:49:14.050 回答
4

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

于 2011-04-12T08:15:28.343 回答
1

这是我用来完成此“修剪”的一些代码

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;
于 2015-05-07T22:56:12.790 回答
0

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

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

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

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

如果您在Wikipedia上查找 TDES ,似乎最大密钥大小为 168 位,所以我不确定 Microsoft 是如何实现它的。

我怀疑为简洁起见,您的示例中省略了它,但您可能应该从大量盐中散列您的密钥。在加密命名空间中有几种 RNG/HSH 算法。

于 2011-04-12T08:24:54.393 回答