1

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

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

4

1 回答 1

1

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

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

于 2013-07-15T05:40:13.533 回答