[英]Rijndael decryption in C#
我需要使用Rijndael和这些值解密字符串:
密钥大小-192
块大小-128
键-cmdAj45F37I5ud2134FDg2fF
当我使用下面的代码时,出现错误:字符串大小不规则,有人可以帮助我吗?
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;
}
一个(大)问题是使用UTF8.GetBytes()
从字符串获取byte []。 很难控制字节数,也不是很安全。
请改用Rfc2898DeriveBytes.GetBytes()
。 然后您可以指定所需的长度。
但是,当然,您也必须在加密时执行此操作。
我同意卢克关于四世的言论
您可以在代码中看到注释,指出“必须为16个字符”键吗? 您的密钥对我来说更像是24个字符!
在这种情况下,您将密钥重新用作IV-仍然不建议采用最佳做法-但IV的大小必须与块大小匹配,该块大小设置为128位/ 16字节。
话虽如此,我刚刚描述的问题应该给您错误“指定的初始化向量(IV)与该算法的块大小不匹配” ,而不是“字符串大小错误” ,因此这可能是一个红色鲱鱼。
错误是因为输入是64位编码的。
IV和键不一样。 IV用于腌制。 无论如何,您得到的错误是因为输入是64位编码的。 这样做,错误就会消失。
var encodedEncryptionKey = Base64Decode(encryptionKey);
var key = Encoding.UTF8.GetBytes(decodedEncryptionKey);
这是完整的代码:
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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.