C# 指定的初始化向量(IV)与此算法的块大小不匹配

C# 指定的初始化向量(IV)与此算法的块大小不匹配,c#,encryption,rijndaelmanaged,rijndael,C#,Encryption,Rijndaelmanaged,Rijndael,我正在研究一种基本的加密方法。我正在使用RijndaelManaged。我很久以前从某个地方得到这个代码,但不记得在哪里 以前我的代码工作过,但有些地方发生了变化,我不能完全理解 当我运行代码时,我得到以下错误: 指定初始化向量(IV) 与此的块大小不匹配 算法 这是我的密码: string textToEncrypt = "TEST STRING"; int keySize = 256; string hashAlgorithm = "SHA1"; string passPhrase = "

我正在研究一种基本的加密方法。我正在使用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);

任何帮助都将不胜感激。

问题是您的初始化向量大小需要为16字节

初始向量大小为14字节

您需要将初始向量的大小增加2个字节,这样代码就可以工作了

例如:

string initVector = "HR$2pIjHR$2pIj12";
然后,您将使用当前代码和提供的示例IV(初始化向量)大小获得输出:

hAC8hMf3N5Zb/DZhFKi6Sg==

本文很好地解释了什么是初始化向量


您应该能够检查IV需要使用多少字节:

algorithm.BlockSize / 8
BlockSize是以位为单位的,因此128位/8给出16字节的ASCII,您还可以找到
Rfc2898DeriveBytes
一个用于生成密钥的有用类

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

希望有帮助。

如果有人正在将其代码从.NET framework迁移到.NET Core,并且在
RijndaelManaged.CreateEncryptor上开始出现此异常:
:您以前的感冒是由于“”而起作用的

要解决此问题,请参阅注释:“

例如:

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

也值得一提,“

哦,天哪,就是这样!非常感谢您的帮助。在德语中,此错误消息为:“Der Angeebene Initialisierungsvektor(IV)entspricht nicht Der Blockgröe für diesen Algorithmus”。