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

时间:2013-07-15 02:57:31

标签: c# aes rijndaelmanaged

我需要在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)与此算法的块大小不匹配。”

提前致谢。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

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

在解密逻辑中,您需要使用Convert.FromBase64String从64字符串转换回二进制文件。