Указанный вектор инициализации (IV) не соответствует размеру блока для этого алгоритма

Я работаю над базовым методом шифрования. Я использую RijndaelManaged. Я получил этот код откуда-то давно, но не могу вспомнить, где.

У меня раньше работал код, но что-то изменилось, и я не могу в этом разобраться.

Когда я запускаю свой код, я получаю следующую ошибку:

Указанный вектор инициализации (IV) не соответствует размеру блока для этого алгоритма.

Вот мой код:

string textToEncrypt = "TEST STRING";

int keySize = 256;
string hashAlgorithm = "SHA1";
string passPhrase = "AH!PSB0%FGHR$";
string saltValue = "LRT%YUR#VBNL@1";
string initVector = "HR$2pIjHR$2pIj";

byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector);
byte[] saltValueBytes = Encoding.ASCII.GetBytes(saltValue);

byte[] plainTextBytes = Encoding.UTF8.GetBytes(textToEncrypt);

var password = new PasswordDeriveBytes(passPhrase, saltValueBytes, hashAlgorithm, 2);

byte[] keyBytes = password.GetBytes(keySize / 8);

RijndaelManaged symmetricKey = new RijndaelManaged();

symmetricKey.Mode = CipherMode.CBC;

ICryptoTransform encryptor = symmetricKey.CreateEncryptor(keyBytes,initVectorBytes);

MemoryStream memoryStream = new MemoryStream();

var cryptoStream = new CryptoStream(memoryStream,encryptor,CryptoStreamMode.Write);
cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);

cryptoStream.FlushFinalBlock();

byte[] cipherTextBytes = memoryStream.ToArray();

memoryStream.Close();
cryptoStream.Close();

string cipherText = Convert.ToBase64String(cipherTextBytes);

Любая помощь будет оценена.


person Community    schedule 03.06.2009    source источник
comment
На немецком языке это сообщение об ошибке выглядит следующим образом: Der angegebene Initialisierungsvektor (IV) entspricht nicht der Blockgröße für diesen Algorithmus.   -  person Uwe Keim    schedule 06.10.2018


Ответы (3)


Проблема в том, что размер вектора инициализации должен быть 16 байт.

Ваш начальный размер вектора составляет 14 байт.

Вам нужно будет увеличить размер исходного вектора на 2 байта, и ваш код заработает.

Пример:

string initVector = "HR$2pIjHR$2pIj12";

Затем вы получите результат с вашим текущим кодом и предоставленным размером примера IV (вектор инициализации):

hAC8hMf3N5Zb/ДЖФКи6Sg==

В этой статье дается хорошее объяснение того, что такое вектор инициализации.

http://en.wikipedia.org/wiki/Initialization_vector

person CodeLikeBeaker    schedule 03.06.2009
comment
О боже, это было оно! Большое спасибо за помощь. - person ; 03.06.2009

Вы должны иметь возможность проверить, сколько байтов должен использовать IV:

algorithm.BlockSize / 8

BlockSize указывается в битах, поэтому 128 бит / 8 дает 16 байтов ASCII, и вы также можете найти Rfc2898DeriveBytes полезный класс для создания ключей.

algorithm.IV = rfc2898DeriveBytesForIV.GetBytes(algorithm.BlockSize / 8);

Надеюсь, поможет.

person Luke Puplett    schedule 06.05.2015

Если кто-то переносит свой код с .NET framework на .NET Core и начинает получать это исключение RijndaelManaged.CreateEncryptor: ваш старый холод работал из-за того, что .NET Framework допускает IV больше 64 бит и усекает их.

Для решения см. комментарий Kevin Jones: просто измените свой IV, указав только первые 8 байтов

Итак, в качестве примера:

private static byte[] IV_192 =  { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18 };

станет:

// Rename field if desired.
private static byte[] IV_192 =  { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };

Также стоит отметить, что Класс Rijndael является предшественником алгоритма Aes. Вам следует использовать алгоритм Aes вместо Rijndael.

person joym8    schedule 27.07.2020