web-dev-qa-db-fra.com

Le vecteur d'initialisation (IV) spécifié ne correspond pas à la taille de bloc pour cet algorithme

Je travaille sur une méthode de cryptage de base. J'utilise RijndaelManaged. J'ai obtenu ce code quelque part il y a longtemps, mais je ne me souviens plus où.

J'ai déjà fait fonctionner mon code, mais quelque chose a changé et je n'arrive pas à le comprendre.

Lorsque j'exécute mon code, j'obtiens l'erreur suivante;

Le vecteur d'initialisation spécifié (IV) ne correspond pas à la taille de 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#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);

Toute aide serait appréciée.

27

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

La taille initiale de votre vecteur 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 la taille de l'exemple IV (vecteur d'initialisation) fournie:

hAC8hMf3N5Zb/DZhFKi6Sg ==

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

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

59
CodeLikeBeaker

Vous devriez pouvoir vérifier le nombre d'octets que l'IV doit utiliser:

algorithm.BlockSize / 8

BlockSize est en bits, donc 128 bits/8 donne 16 octets d'ASCII, et vous pouvez également trouver Rfc2898DeriveBytes une classe utile pour produire des clés.

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

J'espère que ça aide.

12
Luke Puplett