如何在C#中将RijndaelManaged生成的IV附加到数据中进行AES解密

本文关键字:数据 解密 AES IV 中将 RijndaelManaged | 更新日期: 2023-09-27 18:22:14

我需要一些关于C#中AES加密/解密的帮助。具体来说,我想用RijndaelManaged生成一个IV,将其转换为文本,并将带有加密文本的IV存储在数据库中。我想把IV附加到加密数据的开头,这样我就可以删除它并将其用于解密功能。

这就是我的困惑…RijndaelManaged生成的IV是一个字节数组,16字节长。所以我认为IV在转换为文本时应该是16个字符长,但事实并非如此。

IV的长度是16个字节,但当我将这16个字节转换为文本时,它的长度是24个字符。这正常吗?这种情况会每次都发生吗?如果是这样的话,那么我只将加密文本的前24个字符作为IV进行解密,而不是前16个字符(但这会产生另一个错误,如下所述)。我真的很想了解发生了什么。

这是一些代码。

RijndaelManaged RM= new RijndaelManaged();
byte[] InitialVectorBytes = RM.IV;
// For testing
string stringIV = Convert.ToBase64String(InitialVectorBytes);
int IVLength = InitialVectorBytes.Length;
string test = "IV is " + stringIV + ". Length is " + IVLength;
MessageBox.Show(test);
// MessageBox displays -  "IV is m4L5Xs2FsPoIMSH7qraghQ==. Length is 16"

所以IV是24个字符长(由于某种原因总是以==结尾),但IV的长度是16。我只测试过几次,但这似乎就是模式。

当我从加密文本中获取前24个字符作为IV然后用它解密时,会出现问题…

//Using the first 24 characters of encrypted text as the IV
string InitialVector = CipherText.Remove(24); 
byte[] InitialVectorBytes = Encoding.ASCII.GetBytes(InitialVector);
ICryptoTransform Decryptor = RM.CreateDecryptor(KeyBytes, InitialVectorBytes)

我又犯了一个错误。。。"指定的初始化矢量(IV)与此算法的块大小不匹配。"

提前谢谢。如有任何帮助,我们将不胜感激。

如何在C#中将RijndaelManaged生成的IV附加到数据中进行AES解密

24个字节来自于您正在转换为基数64的事实。基64字符串是使用64个唯一符号(字符)的二进制数据的文本表示。由于只有这64个值,所以每个字符只能表示6位信息。很明显,原来的IV每字节有8位,所以是16*8或128位。要用6位编码来表示这128位,你需要21.3个字符,因为计算机通常不能处理小数字节,所以缓冲区会四舍五入到下一个好数字,在这种情况下是24。

在解密逻辑中,您需要使用convert.FromBase64String.

将64字符串转换回二进制