jQuery+C#实现参数RSA加密传输功能【附jsencrypt.js下载】


Posted in jQuery onJune 26, 2017

本文实例讲述了jQuery+C#实现参数RSA加密传输功能。分享给大家供大家参考,具体如下:

注意:

参数传递的+号处理,在传输时会把+变成空格,不处理后端就报错了。

1、前端代码

<!DOCTYPE html>
<html>
<head>
  <meta name="viewport" content="width=device-width" />
  <title>Login</title>
  <script src="jquery-1.10.2.min.js"></script>
  <script src="jsencrypt.min.js"></script>
  <script type="text/javascript">
    $(function () {
      var encrypt = new JSEncrypt();
      encrypt.setPublicKey($("#tra").val());
      var data = encrypt.encrypt("123456789");
      alert(data);
      $("#btn").click(function () {
        $.ajax({
          url: '@Url.Action("Login")',
          data: "pwd=" + encodeURI(data).replace(/\+/g, '%2B'), //+号的处理:因为数据在网络上传输时,非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,而base64编码在传输到后端的时候,+会变成空格,因此先替换掉。后端再替换回来
          type: 'post',
          success: function (msg) {
            alert(msg);
          }
        });
      });
    });
  </script>
</head>
<body>
  <div>
    <input type="button" id="btn" value="点我" />
    <textarea id="tra" rows="15" cols="65">
      MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCa4KHNwDX44gGmmIAtRu4gjVYt
GWZzcm4t+1wjUD4dn7fMLPvuK7ai4UrfDeEJE1RPwudJw+lJ6crql8wSIg7/DbTl
      G3ihsCT6dT9H5B9OoeR7K9VWUesaW/iyVL6HXiYOANabW14pvJATDmdq91Tfgp6P
      SQyvdfiRdV4r07crpQIDAQAB
    </textarea>
    <hr/>
    注意+号的处理
  </div>
</body>
</html>

2、后端代码

public class IndexController : Controller
{
    public ActionResult Login()
    {
      return View();
    }
    [HttpPost]
    public ActionResult Login(string pwd)
    {
      //密钥格式要生成pkcs#1格式的  而不是pkcs#8格式的
      string privateKey = @"MIICWwIBAAKBgQCa4KHNwDX44gGmmIAtRu4gjVYtGWZzcm4t+1wjUD4dn7fMLPvuK7ai4UrfDeEJE1RPwudJw+lJ6crql8wSIg7/DbTlG3ihsCT6dT9H5B9OoeR7K9VW
UesaW/iyVL6HXiYOANabW14pvJATDmdq91Tfgp6PSQyvdfiRdV4r07crpQIDAQAB
AoGABb+3gdb+qeG0b1CogVsT/7//UOaTzPk/FGneKQQTf4SsN+H7lVhTYTG9ARFC
JyoWg8IXqmn2ljhywHPTWWD2RCZIn2sYT1sVkGb70EgHGQLBraFHElmw+DsVJ+nD
fBCfMrJ1TYXlwigjRkaueaoGgG8LdR8XD+Xs5LersPLjZgECQQCguSB7C4wF6oSw
EDmwNF8ffT5cQc1U2OIq6NBG8rafrjb7LsjhOd03pmY7i4LbW3Vvq4AhQpJEdF1C
vd+Sk/BBAkEA9rBhqnyumV09zFEomSX3zZu+bdhTzM4bJDfEa95swp1gANCVvF/t
DCnlBf51EhCWdeGSpARPUkQnXrYfFUDiZQJAAZEshuaa6+fYeVr/JP+tucHf3Mhr
dxtSQTbZ6QcuzqnFMXfIT6HfzU4bCxOWKAthPsB+VFSw1mgIDMGLL4OvwQJAJlVy
V9PYLezXVZCnBmVoBINXLCqZmxHMFey0kS6XKAbcjEPdgNBHPcSk2jGYb540Q00y
RFqHGPmORKF4Yw0aIQJAd5JRtD3z2MgP/vPoKHJNHqY8bboVcmwqVAm6xCZoTCZz
jNV1Cnsdf4wBV3LCDzYBy+xR4qYNUy5CFXN+8WzzAA==";
      try
      {
        RSACryptoServiceProvider rsaCryptoServiceProvider = CreateRsaProviderFromPrivateKey(privateKey);
        //把+号,再替换回来
        byte[] res = rsaCryptoServiceProvider.Decrypt(Convert.FromBase64String(pwd.Replace("%2B","+")), false);
        return Content(Encoding.UTF8.GetString(res));
      }
      catch (Exception exception)
      {
      }
      return Content("");
    }
    private RSACryptoServiceProvider CreateRsaProviderFromPrivateKey(string privateKey)
    {
      var privateKeyBits = System.Convert.FromBase64String(privateKey);
      var RSA = new RSACryptoServiceProvider();
      var RSAparams = new RSAParameters();
      using (BinaryReader binr = new BinaryReader(new MemoryStream(privateKeyBits)))
      {
        byte bt = 0;
        ushort twobytes = 0;
        twobytes = binr.ReadUInt16();
        if (twobytes == 0x8130)
          binr.ReadByte();
        else if (twobytes == 0x8230)
          binr.ReadInt16();
        else
          throw new Exception("Unexpected value read binr.ReadUInt16()");
        twobytes = binr.ReadUInt16();
        if (twobytes != 0x0102)
          throw new Exception("Unexpected version");
        bt = binr.ReadByte();
        if (bt != 0x00)
          throw new Exception("Unexpected value read binr.ReadByte()");
        RSAparams.Modulus = binr.ReadBytes(GetIntegerSize(binr));
        RSAparams.Exponent = binr.ReadBytes(GetIntegerSize(binr));
        RSAparams.D = binr.ReadBytes(GetIntegerSize(binr));
        RSAparams.P = binr.ReadBytes(GetIntegerSize(binr));
        RSAparams.Q = binr.ReadBytes(GetIntegerSize(binr));
        RSAparams.DP = binr.ReadBytes(GetIntegerSize(binr));
        RSAparams.DQ = binr.ReadBytes(GetIntegerSize(binr));
        RSAparams.InverseQ = binr.ReadBytes(GetIntegerSize(binr));
      }
      RSA.ImportParameters(RSAparams);
      return RSA;
    }
    private int GetIntegerSize(BinaryReader binr)
    {
      byte bt = 0;
      byte lowbyte = 0x00;
      byte highbyte = 0x00;
      int count = 0;
      bt = binr.ReadByte();
      if (bt != 0x02)
        return 0;
      bt = binr.ReadByte();
      if (bt == 0x81)
        count = binr.ReadByte();
      else
        if (bt == 0x82)
        {
          highbyte = binr.ReadByte();
          lowbyte = binr.ReadByte();
          byte[] modint = { lowbyte, highbyte, 0x00, 0x00 };
          count = BitConverter.ToInt32(modint, 0);
        }
        else
        {
          count = bt;
        }
      while (binr.ReadByte() == 0x00)
      {
        count -= 1;
      }
      binr.BaseStream.Seek(-1, SeekOrigin.Current);
      return count;
    }
}
jQuery 相关文章推荐
jquery实现图片平滑滚动详解
Mar 22 jQuery
jQuery实现在HTML文档加载完毕后自动执行某个事件的方法
May 08 jQuery
jQuery正则验证注册页面经典实例
Jun 10 jQuery
jquery+css实现侧边导航栏效果
Jun 12 jQuery
jQuery开源组件BootstrapValidator使用详解
Jun 29 jQuery
jQuery选择器中的特殊符号处理方法
Sep 08 jQuery
jQuery中extend函数简单用法示例
Oct 11 jQuery
基于jQuery Ajax实现下拉框无刷新联动
Dec 06 jQuery
jQuery动态添加元素无法触发绑定事件的解决方法分析
Jan 02 jQuery
jQuery实现的上传图片本地预览效果简单示例
Mar 29 jQuery
jQuery.parseJSON()函数详解
Feb 28 jQuery
jquery实现动态创建form并提交的方法示例
May 27 jQuery
jQuery实现frame之间互通的方法
Jun 26 #jQuery
jQuery回调方法使用示例
Jun 26 #jQuery
jQuery实现拖动效果的实例代码
Jun 25 #jQuery
jQuery validata插件实现方法
Jun 25 #jQuery
jQuery鼠标移动图片上实现放大效果
Jun 25 #jQuery
jquery图片放大镜效果
Jun 23 #jQuery
jquery单击文字或图片内容放大并居中显示
Jun 23 #jQuery
You might like
PHP mb_convert_encoding 获取字符串编码类型实现代码
2009/04/26 PHP
PHP基于DOM创建xml文档的方法示例
2017/02/08 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
2017/11/14 PHP
datePicker——日期选择控件(with jquery)
2007/02/20 Javascript
jQuery使用手册之二 DOM操作
2007/03/24 Javascript
javascript 打印页面代码
2009/03/24 Javascript
javascript判断ie浏览器6/7版本加载不同样式表的实现代码
2011/12/26 Javascript
点弹代码 点击页面任何位置都可以弹出页面效果代码
2012/09/17 Javascript
21个值得收藏的Javascript技巧
2014/02/04 Javascript
Node.js中如何合并两个复杂对象详解
2016/12/31 Javascript
原生js更改css样式的两种方式
2017/03/15 Javascript
js a标签点击事件
2017/03/30 Javascript
promise处理多个相互依赖的异步请求(实例讲解)
2017/08/03 Javascript
[01:20]2018DOTA2亚洲邀请赛总决赛战队Mineski晋级之路
2018/04/07 DOTA
python self,cls,decorator的理解
2009/07/13 Python
python连接oracle数据库实例
2014/10/17 Python
Python中处理unchecked未捕获异常实例
2015/01/17 Python
利用python 更新ssh 远程代码 操作远程服务器的实现代码
2018/02/08 Python
Python面向对象之类的定义与继承用法示例
2019/01/14 Python
Python3之手动创建迭代器的实例代码
2019/05/22 Python
Django REST framework 分页的实现代码
2019/06/19 Python
pandas通过字典生成dataframe的方法步骤
2019/07/23 Python
python误差棒图errorbar()函数实例解析
2020/02/11 Python
python中numpy.empty()函数实例讲解
2021/02/05 Python
自动化专业本科毕业生求职信
2013/10/20 职场文书
中专毕业生自我鉴定
2014/02/02 职场文书
房地产财务管理制度
2014/02/02 职场文书
大学理论知识学习自我鉴定
2014/04/28 职场文书
2014年秋季开学演讲稿
2014/05/24 职场文书
舞蹈兴趣小组活动总结
2014/07/07 职场文书
学校四风对照检查材料
2014/08/28 职场文书
开展党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
2014年机关党建工作总结
2014/11/11 职场文书
商务宴请邀请函范文
2015/02/02 职场文书
工会积极分子个人总结
2015/03/03 职场文书
个人工作决心书
2015/09/22 职场文书