2009-06-03 24 views
21

Tôi đang làm việc trên phương pháp mã hóa cơ sở. Tôi đang sử dụng RijndaelManaged. Tôi đã nhận được mã này từ một nơi nào đó từ lâu rồi, nhưng không thể nhớ được ở đâu.Vectơ khởi tạo được chỉ định (IV) không khớp với kích thước khối cho thuật toán này

Tôi đã làm việc với mã trước đây, nhưng đã thay đổi và tôi không thể hiểu được.

Khi tôi chạy mã của mình, tôi nhận được lỗi sau;

Vectơ khởi tạo được chỉ định (IV) không khớp với kích thước khối cho thuật toán này.

Đây là mã của tôi:

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

Bất kỳ trợ giúp sẽ được đánh giá cao.

Trả lời

48

Vấn đề là kích thước vectơ khởi tạo của bạn cần phải là 16 byte.

Kích thước vector ban đầu của bạn là 14 byte.

Bạn sẽ cần tăng kích thước của vectơ ban đầu lên 2 byte và mã của bạn sẽ hoạt động.

Ví dụ:

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

Sau đó bạn sẽ nhận được đầu ra với mã hiện tại của bạn và ví dụ IV (khởi vector) kích thước được cung cấp:

hAC8hMf3N5Zb/DZhFKi6Sg ==

Bài viết này cung cấp một lời giải thích tốt về vector khởi tạo là gì.

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

+0

Oh my, đây là nó! Cảm ơn bạn rất nhiều vì sự giúp đỡ. –

9

Bạn sẽ có thể kiểm tra có bao nhiêu byte IV cần phải được sử dụng:

kích cỡ khối được theo bit, vì vậy 128 bit/8 cung cấp cho 16 byte ASCII, và bạn cũng có thể tìm thấy Rfc2898DeriveBytes một lớp hữu ích để sản xuất khóa.

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

Hy vọng điều đó sẽ hữu ích.

Các vấn đề liên quan