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

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

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

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

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

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

Вот мой код:

string textToEncrypt = "TEST STRING";

            int keySize = 256;
            string hashAlgorithm = "SHA1";
            string passPhrase = "AH!PSB0%FGHR$";
            string saltValue = "LRT%YUR#[email protected]";
            string initVector = "HR$2pIjHR$2pIj";



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

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

            PasswordDeriveBytes 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();

            CryptoStream 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);

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

4b9b3361

Ответ 1

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

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

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

Пример:

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

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

hAC8hMf3N5Zb/DZhFKi6Sg ==

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

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

Ответ 2

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

algorithm.BlockSize / 8

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

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

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