C#.NET MVC 前端JS的AES加密
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字符串。

浙公网安备 33010602011771号