Дело размера ключа 3DES внутри C#.Net

ниже код работает нормально в 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= 128 или 192 или 256 дает

указанный ключ не является допустимым размером для данного алгоритма

  1. если я изменю длину символа в ключе, добавив больше (например:40 символов). Это дает ошибку

указанный ключ не является допустимым размером для данного алгоритма

Я хочу знать, почему это произошло?

4 ответов


ключ 3DES имеет длину 128 или 192 бита. Обратите внимание, что, внутри, алгоритм будет использовать только 112 (соответственно 168) бит из этих 128 (соответственно 192) бит; однако сам ключ, закодированный в байты, сохраненный и обмененный, должен иметь длину 16 или 24 байта. Попытка установить ключ, который не имеет одной из этих двух длин, вызывает ошибку, которую вы наблюдаете при попытке использовать 40-байтовый ключ.

вы не должны пытаться установить "размер ключа": вы уже решите это, когда установите ключ. Когда вы устанавливаете TripleDES.Key собственности,TripleDES класс видит, что вы даете ему 24-байтовый ключ, и таким образом поставила себе KeySize свойство до 192.

(выход шифрования 3DES является двоичным, а не кодированием строки UTF-8. Скорее всего, ваш окончательный UTF8Encoding.UTF8.GetString(enc) будут протестовать.)


размер ключа для TripleDES составляет 168 бит. Таким образом, вам понадобится 21 байт. Если вы хотите использовать строку для ключа, вы действительно должны сначала хэшировать ее. В этом случае вы можете использовать любую длину символов (чем больше, тем лучше), а затем обрезать хэшированный вывод до размера ключа. Е. Г. если вы используете SHA-256 из которых вы получите 32 байта, используйте 21 из них.


Я думаю, что проблема здесь в том, что 192bits-это максимальный размер ключа, поддерживаемый для 3DES в C# (и в другом месте я предполагаю)

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

вы пытались установить ключ на значение 16 байт/char?

единственный другой поддерживаемый размер, кажется, 128bits. Если вы хотите что-то сильнее, вам придется использовать другой алгоритм, Aes/Rijndael.

Если вы посмотрите TDES на Википедия, кажется, максимальный размер ключа 168bits, поэтому я не уверен, как Microsoft реализовали его.

Я подозреваю, что это было опущено из вашего примера для краткости, но вы, вероятно, должны хэшировать свой ключ от хорошей дозы соли. Существует несколько алгоритмов RNG/HSH для этого в пространстве имен crypto.


вот некоторый код, который я использовал для выполнения этой "обрезки"

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;