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

Shu*_*ham 4 encryption aes cryptojs asp.net-core angular

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

我的 ASP 加密代码是:

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);
        }
Run Code Online (Sandbox Code Playgroud)

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

decryptData(data,key) {

    try {
      const bytes = CryptoJS.AES.decrypt(data, key); //data is encrypted string from ASP
      if (bytes.toString()) {
        return JSON.parse(bytes.toString(CryptoJS.enc.Utf8));
      }
      return data;
    } catch (e) {
      console.log(e);
    }
  }
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢。

Top*_*aco 8

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
Run Code Online (Sandbox Code Playgroud)

CryptoJS 默认使用 AES CBC 模式和 PKCS7 填充。重要的是,CryptoJS.AES.decrypt输入的密钥应作为 传递WordArray,否则它将被解释为首先派生密钥的密码。Base64编码的密文可以直接传递。CryptoJS.AES.decrypt返回WordArray必须使用 Utf8 解码的 a。对于从 s 到 s 的转换,WordArrayCryptoJS 有编码器。以下 CryptoJS 代码允许解密:

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
Run Code Online (Sandbox Code Playgroud)
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, 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
Run Code Online (Sandbox Code Playgroud)

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