C# 中 RijndaelManaged 的​​ IV 块大小问题

IV Block Size Issue with RijndaelManaged in C#


我在使用此代码使用 RinjndaelManaged 加密字符串时遇到问题。我一直收到错误消息“指定的初始化向量 (IV) 与该算法的块大小不匹配”并且匹配了密钥和 IV 长度并尝试了 32 个字符长度的密钥和从 4 到 32 每 4 个字节。代码错误开头的行:

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 代码来解密这些数据。

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

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

Base64: 'JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ'

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

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

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