Указанный вектор инициализации (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);
Любая помощь будет оценена.
Ответы
Ответ 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);
Надеюсь, что это поможет.