惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

U
Unit 42
T
The Blog of Author Tim Ferriss
H
Help Net Security
博客园 - 叶小钗
云风的 BLOG
云风的 BLOG
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
D
DataBreaches.Net
博客园 - 聂微东
A
About on SuperTechFans
大猫的无限游戏
大猫的无限游戏
P
Proofpoint News Feed
Martin Fowler
Martin Fowler
博客园 - 【当耐特】
S
SegmentFault 最新的问题
Blog — PlanetScale
Blog — PlanetScale
酷 壳 – CoolShell
酷 壳 – CoolShell
G
Google Developers Blog
I
InfoQ
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
GbyAI
GbyAI
B
Blog
Engineering at Meta
Engineering at Meta
V
V2EX
Hugging Face - Blog
Hugging Face - Blog

博客园 - runliuv

网易 S9 PRO 椅子 螺丝规格 VISUAL STUDIO 如果查找即带Contains,又带SubAgentId 字样的代码? 屏蔽论坛头像图片 WIN10,WIN11 微信 多开 微信付款码支付:“暂无权限使用该授权码,请联系客服处理” Windows 7虚拟机安装Vmware tools 装不了 WIN7 trea 默认utf-8-bom,.editorconfig 使用 openssl 生成国密 公钥 私钥 公私钥 EC PRIVATE KEY 蓝湾 Q36 手柄 说明书 京东APP 如何查看 京东支付 的交易明细 银行卡 禁用firefox自动更新,149及以上版本 Microsoft SQL Server Enterprise 2025 v17.0 正式发布 ISO 镜像 小米电脑管家 妙享桌面 无法输入数字 建行支付接口,退款时提示:服务端返回异常(HTTP状态码:400)(如果该笔交易为帐务交易,则处理结果不确定,请先核对明细!) windows win10 win11 打开图片、照片慢、卡 微PE 官网 WINPE QKeyMapper runliuv EC版国密SM2私钥解析C#.NET FFmpeg 截取视频 runliuv 麦当劳9.9元早餐活动,到哪儿领取? 2026.03 录 MP3 录制 软件 Audacity PowerShell将我的文档、图片、视频等目录复制备份到D盘 抖音网页发布视频时,如何声明是A创作的? Realtek HD Audio Driver for DCH,这个DCH是什么意思 ? Realtek Audio Control 在微软应用商店地址 IDEA一个项目多JAR包文件夹 WIN10 WIN11 命令快速锁屏 使用PowerShell一键备份我的文档视频图片等 C#.NET 从国密私钥中提取出(导出)公钥,SM2 重庆银行,国密SM4,自定义算法,C#.NET版
C#.NET MVC 前端JS的AES加密
runliuv · 2026-02-26 · via 博客园 - runliuv

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,
            });
        }

效果截图:

image

 -

总结:

AES 的算法:ECB还是CBC、KEY 和 IV 要与后端商量好。

CryptoJS.AES.encrypt 加密出来的是base64字符串。