web-dev-qa-db-ja.com

指定された初期化ベクトル(IV)は、このアルゴリズムのブロックサイズと一致しません

私は基本的な暗号化方法に取り組んでいます。私はRijndaelManagedを使用しています。私はずっと前にどこかからこのコードを入手しましたが、どこで覚えていません。

以前はコードを機能させていましたが、何かが変更され、完全に理解できません。

コードを実行すると、次のエラーが発生します。

指定された初期化ベクトル(IV)は、このアルゴリズムのブロックサイズと一致しません。

これが私のコードです:

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

どんな助けでもありがたいです。

27

問題は、初期化ベクトルサイズが16バイトである必要があることです。

初期ベクトルサイズは14バイトです。

初期ベクトルのサイズを2バイト増やす必要があり、コードは機能します。

例:

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

次に、現在のコードと提供されたサンプルのIV(初期化ベクトル)サイズを使用して出力を取得します。

hAC8hMf3N5Zb/DZhFKi6Sg ==

この記事では、初期化ベクトルとは何かについての適切な説明を提供します。

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

59
CodeLikeBeaker

IVが使用する必要があるバイト数を確認できるはずです。

algorithm.BlockSize / 8

BlockSizeはビット単位であるため、128ビット/ 8は16バイトのASCIIを提供し、Rfc2898DeriveBytesキーを生成するための便利なクラス。

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

それが役に立てば幸い。

12
Luke Puplett