2009-06-03 4 views
21

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

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

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

указано вектор инициализации (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); 

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

ответ

48

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

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

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

Пример:

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

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

hAC8hMf3N5Zb/DZhFKi6Sg ==

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

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

+0

Ой, это было! Большое вам спасибо за помощь. – 2009-06-03 14:10:20

9

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^