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。我应该在示例代码中留下我的值。当时我认为用这种方式显示长度更容易。