37

私は基本的な暗号化方法に取り組んでいます。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);

どんな助けでも大歓迎です。

4

3 に答える 3

68

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

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

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

例:

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

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

hAC8hMf3N5Zb / DZhFKi6Sg ==

この記事は、初期化ベクトルが何であるかについての良い説明を提供します。

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

于 2009-06-03T13:45:56.997 に答える
4

誰かがコードを .NET Framework から .NET Core に移行していて、 でこの例外が発生し始めた場合: 「 .NET Framework は 64 ビットを超える IV を許可し、それらを切り捨てるRijndaelManaged.CreateEncryptor」という事実のために、古い風邪が機能していました。

解決するには、Kevin Jonesのコメントを参照してください: 「IV を最初の 8 バイトのみに変更するだけです

したがって、例として:

private static byte[] IV_192 =  { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18 };

次のようになります。

// Rename field if desired.
private static byte[] IV_192 =  { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };

また、「Rijndael クラスは Aes アルゴリズムの前身です。Rijndael の代わりに Aes アルゴリズムを使用する必要があります。

于 2020-07-27T13:19:56.917 に答える