【问题标题】:How to append a RijndaelManaged generated IV to data for AES decryption in C#如何在 C# 中将 RijndaelManaged 生成的 IV 附加到数据以进行 AES 解密
【发布时间】:2013-07-15 02:57:30
【问题描述】:

我需要 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# aes rijndaelmanaged


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-08
      • 1970-01-01
      • 2020-12-09
      • 1970-01-01
      • 2014-08-22
      相关资源
      最近更新 更多