C#.NET MVC 前端JS的AES加密,JQUERY,AJAX,AES ECB ,AES CBC。
前端先引用 CryptoJS 库。
<!-- 引入 CryptoJS -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>
<!-- 引入 jQuery -->
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
封装一个JS函数:
<script>
function encryptAES_ECB_PKCS7(plaintext, key) {
// 将密钥转换为 WordArray
const keyBytes = CryptoJS.enc.Utf8.parse(key);
// 加密配置(ECB模式 + PKCS7填充)
const options = {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
};
// 执行加密
const encrypted = CryptoJS.AES.encrypt(plaintext, keyBytes, options);
// 返回 Base64 编码的密文
return encrypted.toString();
}
</script>
加密后,向后台API POST请求即可。
完整页面:
@{
ViewBag.Title = "测试 JS AES 加密";
}
<div class="jumbotron">
<h1>ASP.NET</h1>
<input type="button" id="submitBtn" value="测试JS AES" class="btn btn-primary btn-lg" />
</div>
<!-- 引入 CryptoJS -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>
<!-- 引入 jQuery -->
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
function encryptAES_ECB_PKCS7(plaintext, key) {
// 将密钥转换为 WordArray
const keyBytes = CryptoJS.enc.Utf8.parse(key);
// 加密配置(ECB模式 + PKCS7填充)
const options = {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
};
// 执行加密
const encrypted = CryptoJS.AES.encrypt(plaintext, keyBytes, options);
// 返回 Base64 编码的密文
return encrypted.toString();
}
</script>
<script>
$(document).ready(function () {
$("#submitBtn").click(function () {
const plaintext = "Hello, .NET MVC!这是要加密的字符串。";
// 16字节密钥(AES-128)
const key = "1234567890123456";
// 加密数据
const encryptedData = encryptAES_ECB_PKCS7(plaintext, key);
// 发送 POST 请求
$.ajax({
url: "/Home/About", // 后台 Controller 地址
type: "POST",
contentType: "application/json",
data: JSON.stringify({ ciphertext: encryptedData }),
success: function (response) {
console.log("服务器响应:", response);
alert(response.code + " " + response.msg);
},
error: function (xhr, status, error) {
console.error("请求失败:", error);
}
});
});
});
</script>
后端实体:
namespace WebAppJsAES.Models
{
public class JsAesReq
{
/// <summary>
/// JS AES 加密后的串
/// </summary>
public string ciphertext { get; set; }
}
}
后端解密工具类:
using System.Security.Cryptography;
namespace WebAppJsAES.Utils
{
public class ButtonAesUtil
{
/// <summary>
/// AES ECB PKCS7 加密
/// </summary>
/// <param name="dataByte"></param>
/// <param name="key"></param>
/// <returns></returns>
public static byte[] EncryptECB(byte[] dataByte, byte[] key)
{
var _aes = new RijndaelManaged();
_aes.Key = key;
_aes.Padding = PaddingMode.PKCS7;
_aes.Mode = CipherMode.ECB;
var _crypto = _aes.CreateEncryptor();
byte[] encrypted = _crypto.TransformFinalBlock(dataByte, 0, dataByte.Length);
_crypto.Dispose();
return encrypted;
}
/// <summary>
/// AES ECB PKCS7 解密
/// </summary>
/// <param name="encryptByte"></param>
/// <param name="key"></param>
/// <returns></returns>
public static byte[] DecryptECB(byte[] encryptByte, byte[] key)
{
var _aes = new RijndaelManaged();
_aes.Key = key;
_aes.Padding = PaddingMode.PKCS7;
_aes.Mode = CipherMode.ECB;
var _crypto = _aes.CreateDecryptor();
byte[] decrypted = _crypto.TransformFinalBlock(
encryptByte, 0, encryptByte.Length);
_crypto.Dispose();
return decrypted;
}
/// <summary>
/// AES CBC PKCS7 加密
/// </summary>
/// <param name="encryptByte"></param>
/// <param name="key"></param>
/// <param name="iv"></param>
/// <returns></returns>
public static byte[] EncryptCBC(byte[] encryptByte, byte[] key, byte[] iv)
{
var _aes = new RijndaelManaged();
_aes.Key = key;
_aes.IV = iv;
_aes.Padding = PaddingMode.PKCS7;
_aes.Mode = CipherMode.CBC;
var _crypto = _aes.CreateEncryptor();
byte[] decrypted = _crypto.TransformFinalBlock(encryptByte, 0, encryptByte.Length);
_crypto.Dispose();
return decrypted;
}
/// <summary>
/// AES CBC PKCS7 解密
/// </summary>
/// <param name="encryptByte"></param>
/// <param name="key"></param>
/// <param name="iv"></param>
/// <returns></returns>
public static byte[] DecryptCBC(byte[] encryptByte, byte[] key, byte[] iv)
{
var _aes = new RijndaelManaged();
_aes.Key = key;
_aes.IV = iv;
_aes.Padding = PaddingMode.PKCS7;
_aes.Mode = CipherMode.CBC;
var _crypto = _aes.CreateDecryptor();
byte[] decrypted = _crypto.TransformFinalBlock(
encryptByte, 0, encryptByte.Length);
_crypto.Dispose();
return decrypted;
}
}
}
后端API 解密:
[HttpPost]
public ActionResult About(JsAesReq model)
{
string bodyStr = "";
if (model != null && !string.IsNullOrWhiteSpace(model.ciphertext))
{
//aesKey与前端协商好
string aesKey = "1234567890123456";
var dataByte = ButtonAesUtil.DecryptECB(Convert.FromBase64String(model.ciphertext), Encoding.UTF8.GetBytes(aesKey));
bodyStr = Encoding.UTF8.GetString(dataByte);
}
return Json(new
{
code = "1000",
msg = "请求成功:" + bodyStr,
});
}
效果截图:

总结:
AES 的算法:ECB还是CBC、KEY 和 IV 要与后端商量好。
CryptoJS.AES.encrypt 加密出来的是base64字符串。