【问题标题】:IV Block Size Issue with RijndaelManaged in C#C# 中 RijndaelManaged 的​​ IV 块大小问题
【发布时间】:2016-05-05 05:38:38
【问题描述】:


我无法使用此代码使用 RinjndaelManaged 加密字符串。我不断收到错误“指定的初始化向量 (IV) 与此算法的块大小不匹配”,并且匹配了密钥和 IV 长度,并尝试了 32 字符长度的密钥和每 4 个字节从 4 到 32。以:

开头的行的代码错误
aes.IV = Convert.FromBase64String(myString);

代码块如下:

private String AES_encrypt(String Input)
    {
        var aes = new RijndaelManaged();
        aes.KeySize = 256;
        aes.BlockSize = 256;
        aes.Padding = PaddingMode.PKCS7;
        String myString = new string('J', 32);
        aes.Key = Convert.FromBase64String(myString);
        aes.IV = Convert.FromBase64String(myString);
        var encrypt = aes.CreateEncryptor(aes.Key, aes.IV);
        byte[] xBuff = null;
        using (var ms = new MemoryStream())
        {
            using (var cs = new CryptoStream(ms, encrypt, CryptoStreamMode.Write))
            {
                byte[] xXml = Encoding.UTF8.GetBytes(Input);
                cs.Write(xXml, 0, xXml.Length);
            }

            xBuff = ms.ToArray();
        }

        String Output = Convert.ToBase64String(xBuff);
        return Output;
    }
}

我只使用 myString 长度来快速迭代一堆选项。我正在使用这个特定的 Keysize/Block/Padding 和加密方案来处理可以解密这些数据的 PHP 代码。

【问题讨论】:

  • 想知道为什么要使用块大小为 256 位的 Rijndael,因为 AES 是块大小为 128 位的 Rijndael。通常,使用 AES 块大小对互操作性更好。此外,人们担心较大的块大小可能不那么安全,对较大块大小的研究要少得多。
  • 我会看看这个块大小。我认为它曾经与接收此代码输出的 PHP 函数兼容。

标签: c# encryption rijndaelmanaged


【解决方案1】:

32 个 'J' 的字符串将产生 24 个字节,而不是 16 或 32。不要尝试对它进行 Base64 解码。最好阅读 Base64。

对密钥和 IV 使用相同的值是不安全的。

【讨论】:

  • 谢谢。那是我的关键问题。我没有使用所有的 Js,也没有使用相同的密钥和 IV。我应该在示例代码中保留我的值。当时我认为这样显示长度更容易。
【解决方案2】:

您想要设置为 IV 的结果 Base64 字符串为 16 字节(128 位)长,而您的加密算法需要 256 位 IV。

将您的 IV 更改为 32 字节长的字节数组。

Base64: 'JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ'

Decoded: '$I$I$I$I$I$I$I$I' (16 bytes = 128 bits long)

【讨论】:

  • @zaph 我在这里解码它并且它工作,试试你自己:base64decode.org
  • 32 字节 Base64 解码将产生 24 字节,而不是 16 字节,阅读规范,Base64 将每 3 字节编码为 4 字节。 'JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ' 解码为(十六进制):2492492492492492 49249249249249249249249249249249,即 24 字节。在 ASCII 中查看时 0x92 是不可打印的,因此您会看到 '$I$I$I$I$I$I$I$I' 但实际结果是 24 个字节。尝试 Base64 编码 '$I$I$I$I$I$I$I$I'。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多