ASP.net Core 中的加密和 Angular 中的解密 [英] Encryption in ASP.net Core and Decryption in Angular
问题描述
我在ASP.net Core 中的加密和 Angular 中的解密"中遇到了问题.我想从我的 BE 向 FE 发送敏感信息,所以我正在尝试添加加密和解密.
I am facing problems in "Encryption in ASP.net Core and Decryption in Angular". I want to send sensitive information to FE from my BE so I am trying to add encryption and decryption.
我用于加密的 ASP 代码是:
My ASP code for encryption is :
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);
}
我的 Angular 解密代码是:(使用 crypto-js 进行解密)
And my Angular Code for Decryption is: (Using crypto-js for decryption)
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);
}
}
运行代码后出现如下错误:
After running the code I am getting errors like :
错误:格式错误的 UTF-8 数据在 Object.stringify (core.js:513)在 WordArray.init.toString (core.js:268)在...
Error: Malformed UTF-8 data at Object.stringify (core.js:513) at WordArray.init.toString (core.js:268) at ...
谢谢.
推荐答案
C# 代码在 CBC 模式下使用 AES,零向量作为 IV 和 PKCS7 填充.密文是 Base64 编码的.使用以下示例数据得到以下 Base64 编码密文结果:
The C# code uses AES in CBC mode with a zero vector as IV and PKCS7 padding. The ciphertext is Base64 encoded. With the following sample data the following Base64 encoded ciphertext results:
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
s 的转换,CryptoJS 有编码器.以下 CryptoJS 代码允许解密:
CryptoJS uses for AES the CBC mode and PKCS7 padding by default. It is important that the key in CryptoJS.AES.decrypt
is passed as WordArray
, otherwise it will be interpreted as password from which the key is first derived. The Base64 encoded ciphertext can be passed directly. CryptoJS.AES.decrypt
returns a WordArray
that must be decoded with Utf8. For the conversion from and to WordArray
s CryptoJS has encoders. The following CryptoJS code allows the decryption:
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
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>
请注意,使用静态 IV(例如零向量)通常是不安全的.通常,IV是在加密过程中随机生成的,与密文一起传递给接收方.
Note that using a static IV (e.g. zero vector) is generally insecure. Usually, the IV is randomly generated during encryption and is passed to the recipient together with the ciphertext.
这篇关于ASP.net Core 中的加密和 Angular 中的解密的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!