2009-06-03 8 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

ああ私はこれでした!助けてくれてありがとう。 –

9

あなたはIVを使用する必要があるバイト数を調べることができる必要があります:

BlockSizeにはビットであるので、128ビット/ 8はASCIIの16のバイトを与え、そしてあなたキーを生成するために有用なクラスであることがわかるかもしれません(Rfc2898DeriveBytes)。

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

希望します。

関連する問題