Подтвердить что ты не робот

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

Ниже код работает отлично в С#.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 символов). Это дает ошибку

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

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

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

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

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

Ответ 4

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

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;