使用C#中的RijndaelManaged进行IV块大小问题

时间:2016-05-04 19:26:40

标签: c# encryption rijndaelmanaged


我在使用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代码。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:-1)

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

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

Base64: 'JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ'

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