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 相关文章推荐
jquery api参考 visualjquery 中国线路 速度快
Nov 30 Javascript
js与jquery获取父级元素,子级元素,兄弟元素的实现方法
Jan 09 Javascript
js实现动态加载脚本的方法实例汇总
Nov 02 Javascript
JS 实现倒计时数字时钟效果【附实例代码】
Mar 30 Javascript
Web安全测试之XSS实例讲解
Aug 15 Javascript
jQuery查找节点并获取节点属性的方法
Sep 09 Javascript
Bootstrap基本插件学习笔记之按钮(21)
Dec 08 Javascript
基于twbsPagination.js分页插件使用心得(分享)
Oct 21 Javascript
vue项目中使用lib-flexible解决移动端适配的问题解决
Aug 23 Javascript
如何去除富文本中的html标签及vue、react、微信小程序中的过滤器
Nov 21 Javascript
vue 基于element-ui 分页组件封装的实例代码
Dec 10 Javascript
Java无向树分析 实现最小高度树
Apr 09 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
windows下升级PHP到5.3.3的过程及注意事项
2010/10/12 PHP
php xml常用函数的集合(比较详细)
2013/06/06 PHP
PHP的switch判断语句的“高级”用法详解
2014/10/01 PHP
php过滤所有的空白字符(空格、全角空格、换行等)
2015/10/27 PHP
详解 PHP加密解密字符串函数附源码下载
2015/12/18 PHP
JavaScript打字小游戏代码
2011/12/26 Javascript
创建、调用JavaScript对象的方法集锦
2014/12/24 Javascript
javascript实现随机读取数组的方法
2015/08/03 Javascript
Seajs 简易文档 提供简单、极致的模块化开发体验
2016/04/13 Javascript
Bootstrap4一次重大更新 几乎涉及每行代码
2016/05/16 Javascript
AngularJS 依赖注入详解及示例代码
2016/08/17 Javascript
JS原型链 详解及示例代码
2016/09/06 Javascript
Angular4项目中添加i18n国际化插件ngx-translate的步骤详解
2017/07/02 Javascript
vue-cli结合Element-ui基于cropper.js封装vue实现图片裁剪组件功能
2018/03/01 Javascript
node后端服务保活的实现
2019/11/10 Javascript
vant 中van-list的用法说明
2020/11/11 Javascript
js实现头像上传并且可预览提交
2020/12/25 Javascript
[04:49]2014DOTA2国际邀请赛 Newbee顺利挺进总决赛 ImbaTV独家专访
2014/07/19 DOTA
[52:52]完美世界DOTA2联赛PWL S3 LBZS vs access 第一场 12.10
2020/12/13 DOTA
python回调函数的使用方法
2014/01/23 Python
Python检测QQ在线状态的方法
2015/05/09 Python
利用Python自动监控网站并发送邮件告警的方法
2016/08/24 Python
pycharm 实现显示project 选项卡的方法
2019/01/17 Python
python 表格打印代码实例解析
2019/10/12 Python
python新手学习使用库
2020/06/11 Python
兰蔻加拿大官方网站:Lancome加拿大
2016/08/05 全球购物
三星美国官网:Samsung美国
2017/02/06 全球购物
以设计师精品品质提供快速时尚:PopJulia
2018/01/09 全球购物
写出二分查找算法的两种实现
2013/05/13 面试题
轻金属冶金专业毕业生自荐信
2013/11/02 职场文书
欢送退休感言
2014/02/08 职场文书
市场策划求职信
2014/08/07 职场文书
2014年党员自我评议总结
2014/09/23 职场文书
上市公司财务总监岗位职责
2015/04/03 职场文书
任命书格式范文
2015/09/22 职场文书
Go 语言中 20 个占位符的整理
2021/10/16 Golang