Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IV用C管理Rijndaelm的区块大小问题#_C#_Encryption_Rijndaelmanaged - Fatal编程技术网

C# IV用C管理Rijndaelm的区块大小问题#

C# IV用C管理Rijndaelm的区块大小问题#,c#,encryption,rijndaelmanaged,C#,Encryption,Rijndaelmanaged,我在使用RinjndaelManaged加密字符串时遇到问题。我不断得到错误“指定的初始化向量(IV)与此算法的块大小不匹配”,并且匹配了密钥和IV长度,并尝试了密钥的32字符长度,每4个字节从4到32。以以下开头的行中的代码错误: aes.IV = Convert.FromBase64String(myString); 代码块如下所示: private String AES_encrypt(String Input) { var aes = new RijndaelM


我在使用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代码,它将解密这些数据

要设置为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使用相同的值是不安全的。

考虑到AES是块大小为128位的Rijndael,您想知道为什么要使用块大小为256位的Rijndael。通常,使用AES块大小对于互操作性更好。此外,还有人担心更大的块大小可能不那么安全,对更大的块大小的研究更少。我来看看这个块大小。我认为它曾经与接收此代码输出的PHP函数兼容。@zaph我在这里对它进行了解码,它成功了,请自己尝试:32字节Base64解码将产生24字节,而不是16字节。读取规范,Base64将每3个字节编码为4个字节。”JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ'解码为(十六进制):249249249249249249249249249249249249249249,即24字节。在ASCII中查看时,0x92不可打印,因此您会看到“$I$I$I$I$I$I$I$I$I”,但实际结果是24字节。尝试Base64编码“$I$I$I$I$I$I$I$I$I”。谢谢。这是我的关键问题。我没有使用all Js,也没有使用相同的键和IV。我应该在示例代码中留下我的值。当时我认为用这种方式显示长度更容易。