Js参数RSA加密传输之jsencrypt.js的使用


Posted in Javascript onFebruary 07, 2020

注意几点:

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

1、前端代码

<!DOCTYPE html>

<html>
<head>
 <meta name="viewport" content="width=device-width" />
 <title>Login</title>
 <script src="~/Scripts/jquery-1.10.2.min.js"></script>
 <script src="http://passport.cnblogs.com/scripts/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;
  }
 }

总结

以上所述是小编给大家介绍的Js参数RSA加密传输之jsencrypt.js的使用,希望对大家有所帮助!

Javascript 相关文章推荐
js 操作css实现代码
Jun 11 Javascript
超级24小时弹窗代码 24小时退出弹窗代码 100%弹窗代码(IE only)
Jun 11 Javascript
一段批量给页面上的控件赋值js
Jun 19 Javascript
jquery自定义类似$.ajax()的方法实现代码
Aug 13 Javascript
Jquery跳到页面指定位置的方法
May 12 Javascript
深入理解vue.js双向绑定的实现原理
Dec 05 Javascript
React实现点击删除列表中对应项
Jan 10 Javascript
jquery实现图片轮播器
May 23 jQuery
vue-router 源码之实现一个简单的 vue-router
Jul 02 Javascript
Vue iview-admin框架二级菜单改为三级菜单的方法
Jul 03 Javascript
解决element-ui中下拉菜单子选项click事件不触发的问题
Aug 22 Javascript
微信小程序 函数防抖 解决重复点击消耗性能问题实现代码
Sep 12 Javascript
Vue使用JSEncrypt实现rsa加密及挂载方法
Feb 07 #Javascript
jQuery实现获取多选框的值示例
Feb 07 #jQuery
微信小程序canvas开发水果老虎机的思路详解
Feb 07 #Javascript
Node.js 在本地生成日志文件的方法
Feb 07 #Javascript
node.js 微信开发之定时获取access_token
Feb 07 #Javascript
jQuery操作选中select下拉框的值代码实例
Feb 07 #jQuery
webpack的 rquire.context用法实现工程自动化的方法
Feb 07 #Javascript
You might like
理解和运用PHP中的多态性[译]
2011/08/02 PHP
PHP 面向对象程序设计(oop)学习笔记 (二) - 静态变量的属性和方法及延迟绑定
2014/06/12 PHP
php字符串函数学习之substr()
2015/03/27 PHP
php简单计算页面加载时间的方法
2015/06/19 PHP
php阳历转农历优化版
2016/08/08 PHP
windows下的WAMP环境搭建图文教程(推荐)
2017/07/27 PHP
深入理解 PHP7 中全新的 zval 容器和引用计数机制
2018/10/15 PHP
自己的js工具 Cookie 封装
2009/08/21 Javascript
jQuery插件jQuery-JSONP开发ajax调用使用注意事项
2013/11/22 Javascript
jquery基础教程之deferred对象使用方法
2014/01/22 Javascript
js单独获取一个checkbox看其是否被选中
2014/09/22 Javascript
后台获取ZTREE选中节点的方法
2015/02/12 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之主动触发事件和模拟冒泡处理
2015/11/24 Javascript
理解javascript定时器中的setTimeout与setInterval
2016/02/23 Javascript
使用Vue.js开发微信小程序开源框架mpvue解析
2018/03/20 Javascript
vue父子组件的通信方法(实例详解)
2019/11/10 Javascript
js中关于Blob对象的介绍与使用
2019/11/29 Javascript
用Python编写一个国际象棋AI程序
2014/11/28 Python
Python对列表排序的方法实例分析
2015/05/16 Python
python 按照固定长度分割字符串的方法小结
2018/04/30 Python
Python OpenCV处理图像之图像直方图和反向投影
2018/07/10 Python
python 去除txt文本中的空格、数字、特定字母等方法
2018/07/24 Python
Python使用Pickle模块进行数据保存和读取的讲解
2019/04/09 Python
通过Django Admin+HttpRunner1.5.6实现简易接口测试平台
2020/11/11 Python
利用python绘制正态分布曲线
2021/01/04 Python
西海岸男士和男童服装:Johnnie-O
2018/03/15 全球购物
巴西购物网站:Onofre Agora
2020/06/08 全球购物
C语言编程题
2015/03/09 面试题
三月法制宣传月活动总结
2014/07/03 职场文书
未中标通知书
2015/04/17 职场文书
小学教师暑期培训心得体会
2016/01/09 职场文书
《最后一头战象》教学反思
2016/02/16 职场文书
《给予树》教学反思
2016/03/03 职场文书
人生感悟经典句子
2019/08/20 职场文书
Redis可视化客户端小结
2021/06/10 Redis
详解Spring Bean的配置方式与实例化
2022/06/10 Java/Android