2009-06-03 22 views
21

Sto lavorando su un metodo di crittografia di base. Sto usando RijndaelManaged. Ho ricevuto questo codice da qualche parte molto tempo fa, ma non ricordo dove.Il vettore di inizializzazione specificato (IV) non corrisponde alla dimensione del blocco per questo algoritmo

Ho avuto il mio codice in funzione prima, ma qualcosa è cambiato e non riesco a capirlo.

Quando eseguo il mio codice, ottengo il seguente errore;

specificato vettore di inizializzazione (IV) non corrisponde alla dimensione del blocco per questo algoritmo.

Ecco il mio codice:

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

Qualsiasi aiuto sarà apprezzato.

risposta

48

Il problema è la dimensione del vettore di inizializzazione deve essere di 16 byte.

La dimensione del vettore iniziale è 14 byte.

Sarà necessario aumentare la dimensione del vettore iniziale di 2 byte e il codice funzionerà.

Esempio:

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

Sarà quindi ottenere l'uscita con il codice corrente e l'esempio IV (vettore di inizializzazione) formato previsto:

hAC8hMf3N5Zb/DZhFKi6Sg ==

Questo articolo fornisce una buona spiegazione su cosa sia il vettore di inizializzazione.

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

+0

Oh mio, è successo! Grazie mille per l'aiuto. –

9

Si dovrebbe essere in grado di controllare quanti byte IV deve essere utilizzando:

blocchi sia in bit, in modo da 128 bit/8 dà 16 byte di ASCII, e si può anche trovare Rfc2898DeriveBytes una classe utile per la produzione di chiavi.

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

Spero che sia d'aiuto.

Problemi correlati