CryptoJS 、C#互通加解密(AES版)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | ///////////////////////////////////////前端代码///////////////////////////////////////@{ViewBag.Title = "Login"; Layout = null; } < form method="post" onsubmit="CryptoLoginInfo()"> < label >用户名:</ label >< input type="text" name="userId" id="userId" /> < label >密码:</ label >< input type="text" name="passWord" id="passWord" /> < label >< input type="submit" value="提交" /> </ label > </ form > < script src="~/Scripts/crypto-js-3.1.8/crypto-js-3.1.8/crypto-js.js"></ script > < script src="~/Scripts/crypto-js-3.1.8/crypto-js-3.1.8/aes.js"></ script > < script type="text/javascript"> function CryptoLoginInfo() { var key = "@ViewBag.AESKey"; document.getElementById("userId").value = Encrypt(document.getElementById("userId").value, key); document.getElementById("passWord").value = Encrypt(document.getElementById("passWord").value, key); } </ script > < script type="text/javascript"> function Encrypt(source, key) { var key = CryptoJS.enc.Utf8.parse(key);//32位 var iv = CryptoJS.enc.Utf8.parse("1234567890000000");//16位 var srcs = CryptoJS.enc.Utf8.parse(source); var encrypted = CryptoJS.AES.encrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); return encrypted.ciphertext.toString(); } </ script >< br > |
1 | ///////////////////////////////////////后台代码/////////////////////////////////////// |
public class CryptoJSController : Controller { public ActionResult Login() { ViewBag.AESKey = Session["AESKey"] = LoginCryptoHelper.GetAesKey(); return View(); } [HttpPost] public ActionResult Login(string userId, string passWord) { string AesKey = Session["AESKey"] as string; string content = string.Format("DuserId:{0},DpassWord:{1}", LoginCryptoHelper.DecryptByAES(userId, AesKey), LoginCryptoHelper.DecryptByAES(passWord, AesKey)); return Content(content); } } public static class LoginCryptoHelper { const string IV = "1234567890000000"; /// <summary> /// 获取Aes32位密钥 /// </summary> /// <returns></returns> public static string GetAesKey() { string key = Convert.ToString(Guid.NewGuid()); if (key.Length < 32) { // 不足32补全 key = key.PadRight(32, '0'); } else if (key.Length > 32) { key = key.Substring(0, 32); } return key; } /// <summary> /// AES加密算法 /// </summary> /// <param name="input">明文字符串</param> /// <param name="key">密钥(32位)</param> /// <returns>字符串</returns> public static string EncryptByAES(string input, string key) { byte[] keyBytes = Encoding.UTF8.GetBytes(key.Substring(0, 32)); using (AesCryptoServiceProvider aesAlg = new AesCryptoServiceProvider()) { aesAlg.Key = keyBytes; aesAlg.IV = Encoding.UTF8.GetBytes(IV.Substring(0, 16)); ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV); using (MemoryStream msEncrypt = new MemoryStream()) { using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) { using (StreamWriter swEncrypt = new StreamWriter(csEncrypt)) { swEncrypt.Write(input); } byte[] bytes = msEncrypt.ToArray(); return ByteArrayToHexString(bytes); } } } } /// <summary> /// AES解密 /// </summary> /// <param name="input">密文字节数组</param> /// <param name="key">密钥(32位)</param> /// <returns>返回解密后的字符串</returns> public static string DecryptByAES(string input, string key) { byte[] inputBytes = HexStringToByteArray(input); byte[] keyBytes = Encoding.UTF8.GetBytes(key.Substring(0, 32)); using (AesCryptoServiceProvider aesAlg = new AesCryptoServiceProvider()) { aesAlg.Key = keyBytes; aesAlg.IV = Encoding.UTF8.GetBytes(IV.Substring(0, 16)); ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV); using (MemoryStream msEncrypt = new MemoryStream(inputBytes)) { using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, decryptor, CryptoStreamMode.Read)) { using (StreamReader srEncrypt = new StreamReader(csEncrypt)) { return srEncrypt.ReadToEnd(); } } } } } /// <summary> /// 将指定的16进制字符串转换为byte数组 /// </summary> /// <param name="s">16进制字符串(如:“7F 2C 4A”或“7F2C4A”都可以)</param> /// <returns>16进制字符串对应的byte数组</returns> public static byte[] HexStringToByteArray(string s) { s = s.Replace(" ", ""); byte[] buffer = new byte[s.Length / 2]; for (int i = 0; i < s.Length; i += 2) buffer[i / 2] = (byte)Convert.ToByte(s.Substring(i, 2), 16); return buffer; } /// <summary> /// 将一个byte数组转换成一个格式化的16进制字符串 /// </summary> /// <param name="data">byte数组</param> /// <returns>格式化的16进制字符串</returns> public static string ByteArrayToHexString(byte[] data) { StringBuilder sb = new StringBuilder(data.Length * 3); foreach (byte b in data) { //16进制数字 sb.Append(Convert.ToString(b, 16).PadLeft(2, '0')); //16进制数字之间以空格隔开 //sb.Append(Convert.ToString(b, 16).PadLeft(2, '0').PadRight(3, ' ')); } return sb.ToString().ToUpper(); } } }
js加密包地址 https://pan.baidu.com/s/1ha2i-e9WiRCIkMjrHZcLuw https://www.oschina.net/p/crypto-js
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?