密码传输中Rsa加密

来源:互联网 发布:油烟机推荐 知乎 编辑:程序博客网 时间:2024/05/16 10:34

在用户登录和修改密码的地方,将密码直接传输到后台能看到传输密码的明文参数,所以需要加密一次。此处用RSA加密的方法,至于优缺点,我再研究。

首先定义一个RsaEncrypt公用类

 public class GetRsaPublicKeyResult    {        public int Code { get; set; }        public string RsaPublicKey { get; set; }        public string Key { get; set; }    }    /// <summary>    ///     /// </summary>    public class RsaEncrypt    {        /// <summary>        /// 产生一组RSA公钥、私钥        /// </summary>        /// <returns></returns>        public static Dictionary<string, string> CreateRsaKeyPair()        {            var keyPair = new Dictionary<string, string>();            var rsaProvider = new RSACryptoServiceProvider(1024);            RSAParameters parameter = rsaProvider.ExportParameters(true);            keyPair.Add("PUBLIC", BytesToHexString(parameter.Exponent) + "," + BytesToHexString(parameter.Modulus));            keyPair.Add("PRIVATE", rsaProvider.ToXmlString(true));            return keyPair;        }        /// <summary>        /// RSA解密字符串        /// </summary>        /// <param name="encryptData">密文</param>        /// <param name="privateKey">私钥</param>        /// <returns>明文</returns>        public static string DecryptRSA(string encryptData, string privateKey)        {            string decryptData = "";            try            {                var provider = new RSACryptoServiceProvider();                provider.FromXmlString(privateKey);                byte[] result = provider.Decrypt(HexStringToBytes(encryptData), false);                ASCIIEncoding enc = new ASCIIEncoding();                decryptData = enc.GetString(result);            }            catch (Exception e)            {                throw new Exception("RSA解密出错!", e);            }            return decryptData;        }        private static string BytesToHexString(byte[] input)        {            StringBuilder hexString = new StringBuilder(64);            for (int i = 0; i < input.Length; i++)            {                hexString.Append(String.Format("{0:X2}", input[i]));            }            return hexString.ToString();        }        public static byte[] HexStringToBytes(string hex)        {            if (hex.Length == 0)            {                return new byte[] { 0 };            }            if (hex.Length % 2 == 1)            {                hex = "0" + hex;            }            byte[] result = new byte[hex.Length / 2];            for (int i = 0; i < hex.Length / 2; i++)            {                result[i] = byte.Parse(hex.Substring(2 * i, 2), System.Globalization.NumberStyles.AllowHexSpecifier);            }            return result;        }    }


在登录的地方生成秘钥:

public ActionResult GetRsaPublicKey()        {            var rsaKeys = RsaEncrypt.CreateRsaKeyPair();            var key = Guid.NewGuid().ToString();            Session[key] = rsaKeys["PRIVATE"];            var result = new GetRsaPublicKeyResult()            {                Code = 0,                RsaPublicKey = rsaKeys["PUBLIC"],                Key = key            };            return Json(result,JsonRequestBehavior.AllowGet);        }


在对应的页面中,首先引用js,下载地址:http://www.cnblogs.com/csqb-511612371/p/4898437.html

    <script src="~/Scripts/RSA/Barrett.js"></script>
    <script src="~/Scripts/RSA/BigInt.js"></script>
    <script src="~/Scripts/RSA/RSA.js"></script>

在登录的地方,页面加载出来时就生成秘钥,不然登录时再生成秘钥体验不太好:



var getPublicKey = function () {    var publicKey = "";    if ($.cookie("publicKey") == undefined || $.cookie("publicKey") === "null") {        $.ajax({            url: "/Login/GetRsaPublicKey",            type: "get",            contentType: "application/x-www-form-urlencoded; charset=utf-8",            async: false,            data: {},            dataType: "json",            success: function (data) {                if (data.Code == 0) {                    publicKey = data.RsaPublicKey + "," + data.Key;                    $.cookie("publicKey", publicKey);// 此处存储时间应该小于后台缓存时间                } else {                    return null;                }            }        });    } else {        publicKey = $.cookie("publicKey");    }    return publicKey;}var rsaEncrypt = function (pwd) {    $.cookie("publicKey", null);    var publicKey = getPublicKey();    $.easyui.removeLoading();    setMaxDigits(129);    var rsaKey = new RSAKeyPair(publicKey.split(",")[0], "", publicKey.split(",")[1]);    var pwdRtn = encryptedString(rsaKey, pwd);    return pwdRtn + "," + publicKey.split(",")[2];}


在登录时加密:

 

var rsastr= rsaEncrypt(uPwd);


参数:

txtPass: rsastr.split(",")[0],key:rsastr.split(",")[1]


后台代码中解密:

 

if (Session[key]!=null)            {                var privatekey = Session[key].ToString();                txtPass = RsaEncrypt.DecryptRSA(txtPass, privatekey);}

整个过程就完成了!


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 稳岗补贴如果联系方式填错了怎么办 湖北驾照扣了50多分怎么办 南京驾照违章了50多分怎么办 有一个月没有去国税保税怎么办? 刑政复议通知书被邮政延误了怎么办 高考听力报名注册了两个用户怎么办 左腿神经损伤夏天脚冰凉怎么办 给区组织部的介绍信给到社区怎么办 被丈夫和儿子强送精神病院怎么办 练车穿短袖晒的胳膊特别黑怎么办 车子卖了对方迟迟不过户怎么办 成都华西医院就诊卡密码忘了怎么办 资阳办健康证怎么办要预约吗 头发出油厉害怎么办民间小偏方 你帮助别人别人却想着害你怎么办 怀孕接触有辐射的东西回怎么办 苹果手机用久了有点卡怎么办 4s店把我车撞了怎么办 长安之星2代大灯高不聚光怎么办 被电动车撞了人跑了怎么办 车被电动车撞了对方跑了怎么办 房子卖了户口没地方迁怎么办 酷派大神f2开不开机怎么办 酷派手机玩游戏竖屏怎么办 身上起红疙瘩很痒怎么办越挠越多 苹果6s指纹解锁坏了怎么办 案子结了网上追逃的怎么办 贷款买的手机不还了会怎么办 支付宝手机号没用了登陆不了怎么办 支付宝绑定的手机号注销了怎么办 考勤机进水了不能识别指纹怎么办? 网商银行人脸识别失败怎么办 电脑网页上的字变小了怎么办 把光驱换成固态硬盘后不识别怎么办 相机内存卡电脑读不出来怎么办 sd卡在电脑上无法格式化怎么办 内存卡突然读不出来了怎么办 怀孕两个月胎儿死在腹中怎么办 香港公司在大陆卖地皮资金怎么办 结婚证上的身份证号码错了怎么办 身份证快过期了人在外地怎么办