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字符串。