在.NET C#中解密AES加密数据时出错:无效的Base-64字符串问题

kknvjkwl  于 2023-11-20  发布在  .NET
关注(0)|答案(1)|浏览(306)

我在.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”,它可以正常工作。我已经验证了keyIV在两侧是相同的。我怀疑这可能是与编码,传输或填充有关的问题,但我无法确定确切的问题。
例如,当我通过:

const data = { id: 1, name: "test" };


并加密它,我得到以下结果:

+IhryRiKnNFiOWNv3cnWde97CiTZZLtVPMbnIm5ieDg=


类似地,当我加密单词hello时:
我得到了输出

v8FQU3S6MnFlkSK349fZUQ==


任何可能导致此问题的帮助或建议将不胜感激。谢谢!

62lalag4

62lalag41#

错误消息“The input is not a valid base-64 string”表示您尝试在C#应用程序中解密的数据存在问题。此问题通常发生在数据格式不匹配或加密数据中存在意外字符时。

相关问题