ASP.net Core中的加密和Angular中的解密

问题描述

我在“ ASP.net Core中的加密和Angular中的解密”中遇到问题。 我想从我的BE向FE发送敏感信息,所以我试图添加加密和解密。

我用于加密的ASP代码是:

=INDEX(F$2:F$5,MATCH(A2,E$2:E$5,0))

我的解密Angular代码是:(使用crypto-js进行解密)

public static string EncryptString(string key,string plainText)
        {
            byte[] iv = new byte[16];
            byte[] array;

            using (Aes aes = Aes.Create())
            {
                aes.Key = Encoding.UTF8.GetBytes(key);
                aes.IV = iv;
                aes.Padding = PaddingMode.PKCS7;
                aes.Mode = CipherMode.CBC;

                ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key,aes.IV);

                using (MemoryStream memoryStream = new MemoryStream())
                {
                    using (CryptoStream cryptoStream = new CryptoStream((Stream)memoryStream,encryptor,CryptoStreamMode.Write))
                    {
                        using (StreamWriter streamWriter = new StreamWriter((Stream)cryptoStream))
                        {
                            streamWriter.Write(plainText);
                        }

                        array = memoryStream.ToArray();
                    }
                }
            }

            return Convert.ToBase64String(array);
        }

运行代码后,我得到如下错误

错误:UTF-8数据格式错误 在Object.stringify(core.js:513) 在WordArray.init.toString(core.js:268) 在...

谢谢。

解决方法

C#代码在CBC模式下使用AES,将零向量用作IV和PKCS7填充。密文是Base64编码的。使用以下示例数据,以下Base64编码的密文结果:

string key = "01234567890123456789012345678901"; // 32 bytes key,corresponds to AES-256
string plaintext = "The quick brown fox jumps over the lazy dog";
string encrypted = EncryptString(key,plaintext);
Console.WriteLine(encrypted); // NsFJlGQScUEazmSEykVeO/lh+o2L5ykFd2hkNa5lVrHACwKfTg1pD/uYzjTfjmQO

CryptoJS默认使用AES的CBC模式和PKCS7填充。重要的是,CryptoJS.AES.decrypt中的密钥必须以WordArray的形式传递,否则它将被解释为首先从中派生密钥的密码。 Base64编码的密文可以直接传递。 CryptoJS.AES.decrypt返回必须用Utf8解码的WordArray。为了与WordArray之间进行转换,CryptoJS具有编码器。以下CryptoJS代码允许解密:

function decryptData(key,ciphertextB64) {                              // Base64 encoded ciphertext,32 bytes string as key
    var key = CryptoJS.enc.Utf8.parse(key);                             // Convert into WordArray (using Utf8)
    var iv = CryptoJS.lib.WordArray.create([0x00,0x00,0x00]);   // Use zero vector as IV
    var decrypted = CryptoJS.AES.decrypt(ciphertextB64,key,{iv: iv}); // By default: CBC,PKCS7 
    return decrypted.toString(CryptoJS.enc.Utf8);                       // Convert into string (using Utf8)
}
    
var ciphertextB64 = "NsFJlGQScUEazmSEykVeO/lh+o2L5ykFd2hkNa5lVrHACwKfTg1pD/uYzjTfjmQO";
var key = "01234567890123456789012345678901";
var decrypted = decryptData(key,ciphertextB64);
console.log(decrypted); // The quick brown fox jumps over the lazy dog
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>

请注意,使用静态IV(例如零向量)通常是不安全的。通常,IV是在加密过程中随机生成的,并与密文一起传递给接收者。