Размер ключа 3DES в C # .Net - PullRequest
       23

Размер ключа 3DES в C # .Net

19 голосов
/ 12 апреля 2011

Ниже код отлично работает в 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 ]

26 голосов
/ 12 апреля 2011

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

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

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

4 голосов
/ 12 апреля 2011

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

0 голосов
/ 08 мая 2015

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

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;
0 голосов
/ 12 апреля 2011

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

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

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

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

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

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

...