我在.NET C#应用程序中解密AES加密数据时遇到问题。我正在使用CryptoJS库在Angular中加密JSON对象,并试图使用RijndaelManaged
类在C#中解密它。当我尝试在C#中解密数据时,我遇到以下错误:
输入不是有效的Base-64字符串,因为它包含一个非Base-64字符、两个以上的填充字符或填充字符中的非法字符
以下是我在Angular中的加密代码:
const key = CryptoJS.enc.Utf8.parse('4512631236589784');
const iv = CryptoJS.enc.Utf8.parse('4512631236589784');
const data = {id: 1, name: "test"};
const encrypted = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse(JSON.stringify(data)), key, {
keySize: 128 / 8,
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
console.log('Encrypted : ' + encrypted);
字符串
下面是我的C#解密代码:
public string DecryptData()
{
try
{
var token = HttpContext.Request.Query["token"];
var keybytes = Encoding.UTF8.GetBytes("4512631236589784");
var iv = Encoding.UTF8.GetBytes("4512631236589784");
var encrypted = Convert.FromBase64String(token);
var decryptedFromJavascript = DecryptStringFromBytes(encrypted, keybytes, iv);
return decryptedFromJavascript;
}
catch (Exception e)
{
Console.WriteLine(e);
return e.Message;
}
}
private string DecryptStringFromBytes(byte[] cipherText, byte[] key, byte[] iv)
{
// Check arguments.
if (cipherText == null || cipherText.Length <= 0)
{
throw new ArgumentNullException("cipherText");
}
if (key == null || key.Length <= 0)
{
throw new ArgumentNullException("key");
}
if (iv == null || iv.Length <= 0)
{
throw new ArgumentNullException("key");
}
// Declare the string used to hold
// the decrypted text.
string plaintext = null;
// Create an RijndaelManaged object
// with the specified key and IV.
using (var rijAlg = new RijndaelManaged())
{
//Settings
rijAlg.Mode = CipherMode.CBC;
rijAlg.Padding = PaddingMode.PKCS7;
rijAlg.FeedbackSize = 128;
rijAlg.Key = key;
rijAlg.IV = iv;
// Create a decrytor to perform the stream transform.
var decryptor = rijAlg.CreateDecryptor(rijAlg.Key, rijAlg.IV);
try
{
// Create the streams used for decryption.
using(var msDecrypt = new MemoryStream(cipherText))
{
using(var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
{
using(var srDecrypt = new StreamReader(csDecrypt))
{
// Read the decrypted bytes from the decrypting stream
// and place them in a string.
plaintext = srDecrypt.ReadToEnd();
}
}
}
}
catch
{
plaintext = "keyError";
}
}
return plaintext;
}
型
奇怪的是,只有当加密的数据较大时才会出现此问题,例如当我加密JSON对象时。当我加密较小的文本时,如“welcome”,它可以正常工作。我已经验证了key
和IV
在两侧是相同的。我怀疑这可能是与编码,传输或填充有关的问题,但我无法确定确切的问题。
例如,当我通过:
const data = { id: 1, name: "test" };
型
并加密它,我得到以下结果:
+IhryRiKnNFiOWNv3cnWde97CiTZZLtVPMbnIm5ieDg=
型
类似地,当我加密单词hello
时:
我得到了输出
v8FQU3S6MnFlkSK349fZUQ==
型
任何可能导致此问题的帮助或建议将不胜感激。谢谢!
1条答案
按热度按时间62lalag41#
错误消息“The input is not a valid base-64 string”表示您尝试在C#应用程序中解密的数据存在问题。此问题通常发生在数据格式不匹配或加密数据中存在意外字符时。