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 Ajax使用FormData上传文件和其他数据后端web.py获取
Jun 11 jQuery
jQueryUI Sortable 应用Demo(分享)
Sep 07 jQuery
jQuery获取复选框选中的当前行的某个字段的值
Sep 15 jQuery
jQuery 开发之EasyUI 添加数据的实例
Sep 26 jQuery
jquery之基本选择器practice(实例讲解)
Sep 30 jQuery
CSS3结合jQuery实现动画效果及回调函数的实例
Dec 27 jQuery
基于jQuery.i18n实现web前端的国际化
May 04 jQuery
jQuery实现的简单手风琴效果示例
Aug 29 jQuery
jQuery实现模拟搜索引擎的智能提示功能简单示例
Jan 27 jQuery
JS/jQuery实现获取时间的方法及常用类完整示例
Mar 07 jQuery
基于jQuery的时间戳与日期间的转化
Jun 21 jQuery
jQuery实现获取多选框的值示例
Feb 07 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获取客户端IP及URL的方法示例
2017/02/03 PHP
php文件上传类的分享
2017/07/06 PHP
doctype后如何获得body.clientHeight的方法
2007/07/11 Javascript
jQuery弹出层始终垂直居中相对于屏幕或当前窗口
2013/04/01 Javascript
JS小游戏之极速快跑源码详解
2014/09/25 Javascript
在HTML中插入JavaScript代码的示例
2015/06/03 Javascript
使用jquery+CSS3实现仿windows10开始菜单的下拉导航菜单特效
2015/09/24 Javascript
javascript中异常处理案例(推荐)
2016/10/03 Javascript
jquery获取easyui日期控件的值实现方法
2016/11/09 Javascript
概述如何实现一个简单的浏览器端js模块加载器
2016/12/07 Javascript
深入理解node.js之path模块
2017/05/03 Javascript
JS中使用textPath实现线条上的文字
2017/12/25 Javascript
微信小程序实现长按删除图片的示例
2018/05/18 Javascript
分享5个顶级的JavaScript Ajax组件库
2018/09/16 Javascript
小程序scroll-view安卓机隐藏横向滚动条的实现详解
2019/05/16 Javascript
Vue.js计算机属性computed和methods方法详解
2019/10/12 Javascript
JavaScript如何实现图片处理与合成
2020/05/29 Javascript
[06:06]2018DOTA2亚洲邀请赛主赛事第四日战况回顾 全明星赛欢乐上演
2018/04/07 DOTA
Python pyinotify模块实现对文档的实时监控功能方法
2018/10/13 Python
python 遍历列表提取下标和值的实例
2018/12/25 Python
对django中foreignkey的简单使用详解
2019/07/28 Python
python rsa实现数据加密和解密、签名加密和验签功能
2019/09/18 Python
python 模拟创建seafile 目录操作示例
2019/09/26 Python
Python Tornado之跨域请求与Options请求方式
2020/03/28 Python
python 还原梯度下降算法实现一维线性回归
2020/10/22 Python
哥伦比亚最大的网上商店:Linio哥伦比亚
2016/09/25 全球购物
澳洲国民品牌乡村路折扣店:Country Road & Trenery Outlet
2018/04/19 全球购物
法律工作求职自荐信
2013/10/31 职场文书
电子商务专业自荐信
2014/06/02 职场文书
社区矫正工作方案
2014/06/04 职场文书
教师工作态度自我评价
2015/03/05 职场文书
产品调价通知函
2015/04/20 职场文书
幼儿园安全工作总结2015
2015/04/20 职场文书
中学生国庆节演讲稿2015
2015/07/30 职场文书
宝宝满月祝酒词
2015/08/10 职场文书
成功的商业计划书这样写才最靠谱
2019/07/12 职场文书