zoukankan      html  css  js  c++  java
  • CryptoJS 、C#互通加解密(AES版)

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

  • 相关阅读:
    Objective-C实用类和协议
    KVC(Key-Value-Coding)和KVO(Key-Value-Observer)
    Xcode
    IOS模拟器
    沙盒机制
    UIScrollView
    NSPredicate
    输入控件适应键盘
    10步成为专业iOS开发者——新手向,从零起步
    2015 年五大移动端设计趋势
  • 原文地址:https://www.cnblogs.com/5tomorrow/p/9281036.html
Copyright © 2011-2022 走看看