我需要使用Rijndael和那些值解密字符串:
密钥大小 - 192
块大小 - 128
键 - cmdAj45F37I5ud2134FDg2fF
当我使用下面的代码时,我收到一个错误:字符串大小为illigle,有人可以帮助我吗?
public static string DecryptRijndael(string value, string encryptionKey)
{
var key = Encoding.UTF8.GetBytes(encryptionKey); //must be 16 chars
var rijndael = new RijndaelManaged
{
BlockSize = 128,
IV = key,
KeySize = 192,
Key = key
};
var buffer = Convert.FromBase64String(value);
var transform = rijndael.CreateDecryptor();
string decrypted;
using (var ms = new MemoryStream())
{
using (var cs = new CryptoStream(ms, transform, CryptoStreamMode.Write))
{
cs.Write(buffer, 0, buffer.Length);
cs.FlushFinalBlock();
decrypted = Encoding.UTF8.GetString(ms.ToArray());
cs.Close();
}
ms.Close();
}
return decrypted;
}
答案 0 :(得分:3)
一个(大)问题是使用UTF8.GetBytes()
从字符串中获取byte []。很难控制字节数,这不是很安全。
请改用Rfc2898DeriveBytes.GetBytes()
。然后你可以指定所需的长度。
但是当然你也必须在加密时这样做 我还谈到卢克关于IV的评论
答案 1 :(得分:2)
您能否在代码中看到关键字“必须是16个字符”?你的密钥对我来说更像是24个字符!
在这种情况下,您将重新使用密钥作为IV - 不建议使用最佳实践 - 但IV的大小必须与块大小匹配,块大小设置为128位/ 16字节。
话虽如此,我刚刚描述的问题应该给你错误“指定的初始化向量(IV)与此算法的块大小不匹配”,而不是“字符串大小illigle “,所以这可能是一个红鲱鱼。
答案 2 :(得分:1)
错误是因为输入是64位编码。
IV和关键是不一样的。 Ⅳ是腌制。无论如何,你得到的错误是因为输入是64位编码。这样做,错误就会消失。var decodingEncryptionKey = Base64Decode(encryptionKey);
var key = Encoding.UTF8.GetBytes(decodingEncryptionKey);
这是完整的代码:
private string decyptInit(string toBeDecrypted, string key, string initVector)
{
var keyByte = Encoding.Default.GetBytes(key);
var decodedIV = Base64Decode(initVector);
var iv = Encoding.Default.GetBytes(decodedIV);
var rijndael = new RijndaelManaged
{
BlockSize = 128,
IV = iv,
KeySize = 192,
Key = keyByte
};
var buffer = Convert.FromBase64String(toBeDecrypted);
var transform = rijndael.CreateDecryptor();
string decrypted;
using (var ms = new MemoryStream())
{
using (var cs = new CryptoStream(ms, transform, CryptoStreamMode.Write))
{
cs.Write(buffer, 0, buffer.Length);
cs.FlushFinalBlock();
decrypted = Encoding.UTF8.GetString(ms.ToArray());
cs.Close();
}
ms.Close();
}
return decrypted;
} public static string Base64Decode(string base64EncodedData)
{
var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData);
return System.Text.Encoding.UTF8.GetString(base64EncodedBytes);
}