[英]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.