2009-06-03 9 views
21

Je travaille sur une méthode de chiffrement de base. J'utilise RijndaelManaged. J'ai reçu ce code il y a longtemps, mais je ne me souviens plus où.Le vecteur d'initialisation spécifié (IV) ne correspond pas à la taille du bloc pour cet algorithme

J'avais mon code qui fonctionnait avant, mais quelque chose a changé et je n'arrive pas à le comprendre. Lorsque j'exécute mon code, j'obtiens l'erreur suivante:

vecteur d'initialisation indiquée (IV) ne correspond pas à la taille du bloc pour cet algorithme .

Voici mon code:

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

Toute aide sera appréciée.

Répondre

48

Le problème est que votre taille de vecteur d'initialisation doit être de 16 octets.

Votre taille initiale est de 14 octets.

Vous devrez augmenter la taille de votre vecteur initial de 2 octets et votre code fonctionnera.

Exemple:

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

Vous obtiendrez alors la sortie avec votre code actuel et l'exemple taille IV (vecteur d'initialisation) fourni:

hAC8hMf3N5Zb/DZhFKi6Sg ==

Cet article fournit une bonne explication sur ce qu'est le vecteur d'initialisation.

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

+0

Oh mon dieu, c'était tout! Merci beaucoup pour l'aide. –

9

Vous devriez être en mesure de vérifier combien d'octets IV doit être en utilisant:

BlockSize est en bits, donc 128 bits/8 donne 16 octets de ASCII, et vous peut également trouver Rfc2898DeriveBytes une classe utile pour la production de clés.

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

Espérons que cela aide.

Questions connexes