ASP.net 核心中的加密和 Angular 中的解密
Encryption in ASP.net Core and Decryption in Angular
我在“ASP.net 核心加密和 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);
}
我的Angular解密代码是:(使用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);
}
}
在 运行 代码之后,我收到如下错误:
错误: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
returns 必须使用 Utf8 解码的 WordArray
。对于从 WordArray
s 到 WordArray
s 的转换,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, 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是在加密时随机生成的,与密文一起传递给接收方。
我在“ASP.net 核心加密和 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);
}
我的Angular解密代码是:(使用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);
}
}
在 运行 代码之后,我收到如下错误:
错误: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
returns 必须使用 Utf8 解码的 WordArray
。对于从 WordArray
s 到 WordArray
s 的转换,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, 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是在加密时随机生成的,与密文一起传递给接收方。