js加解密

///////////////////////////////////////前端代码///////////////////////////////////////
@{
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>

  

///////////////////////////////////////后台代码///////////////////////////////////////
 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

参考网站:https://www.cnblogs.com/wz122889488/p/6899615.html

猜你喜欢

转载自www.cnblogs.com/5tomorrow/p/9281036.html