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使用JSONP实现跨域获取数据的三种方法详解
May 04 jQuery
jQuery复合事件结合toggle()方法的用法示例
Jun 10 jQuery
jQueryeasyui 中如何使用datetimebox 取两个日期间相隔的天数
Jun 13 jQuery
jQuery 循环遍历改变a标签的href(实例讲解)
Jul 12 jQuery
jQuery实现广告条滚动效果
Aug 22 jQuery
jQuery实现可兼容IE6的滚动监听功能
Sep 20 jQuery
jQuery实现打开网页自动弹出遮罩层或点击弹出遮罩层功能示例
Oct 19 jQuery
jQuery实现验证表单密码一致性及正则表达式验证邮箱、手机号的方法
Dec 05 jQuery
jQuery实现菜单的显示和隐藏功能示例
Jul 24 jQuery
jQuery实现的卷帘门滑入滑出效果【案例】
Feb 18 jQuery
JQuery特殊效果和链式调用操作示例
May 13 jQuery
jQuery 淡入/淡出效果函数用法分析
May 19 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
ThinkPHP CURD方法之limit方法详解
2014/06/18 PHP
PHP中上传多个文件的表单设计例子
2014/11/19 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
2018/06/16 PHP
JS实多级联动下拉菜单类,简单实现省市区联动菜单!
2007/05/03 Javascript
有一段有意思的代码-javascript现实多行信息
2007/08/26 Javascript
Javascript创建Silverlight Plugin以及自定义nonSilverlight和lowSilverlight样式
2010/06/28 Javascript
js判断样式className同时增加class或删除class
2013/01/30 Javascript
火狐下table中创建form导致两个table之间出现空白
2013/09/02 Javascript
利用JQuery制作符合Web标准的QQ弹出消息
2014/01/14 Javascript
表单验证正则表达式实例代码详解
2015/11/09 Javascript
jQuery 防止相同的事件快速重复触发方法
2018/02/08 jQuery
webpack配置proxyTable时pathRewrite无效的解决方法
2018/12/13 Javascript
js实现ATM机存取款功能
2020/10/27 Javascript
webpack-mvc 传统多页面组件化开发详解
2019/05/07 Javascript
el-table树形表格表单验证(列表生成序号)
2020/05/31 Javascript
微信小程序实现日历小功能
2020/11/18 Javascript
[03:14]DOTA2斧王 英雄基础教程
2013/11/26 DOTA
python时间日期函数与利用pandas进行时间序列处理详解
2018/03/13 Python
Python基于lxml模块解析html获取页面内所有叶子节点xpath路径功能示例
2018/05/16 Python
对python程序内存泄漏调试的记录
2018/06/11 Python
Python设计模式之观察者模式原理与用法详解
2019/01/16 Python
PyCharm中配置PySide2的图文教程
2020/06/18 Python
python实现跨年表白神器--你值得拥有
2021/01/04 Python
CSS3 滤镜 webkit-filter详细介绍及使用方法
2012/12/27 HTML / CSS
香港迪士尼乐园酒店预订:Hong Kong Disneyland Hotels
2017/05/02 全球购物
瑜伽服装品牌:露露柠檬(lululemon athletica)
2017/06/04 全球购物
尤妮佳moony海外旗舰店:日本殿堂级纸尿裤品牌
2018/02/23 全球购物
澳大利亚女士时装在线:Rockmans
2018/09/26 全球购物
信息学院毕业生自荐信范文
2014/03/04 职场文书
yy婚礼主持词
2014/03/14 职场文书
担保书格式及范文
2014/04/01 职场文书
2014年药店工作总结
2014/11/20 职场文书
思想道德自我评价2015
2015/03/09 职场文书
成品仓管员岗位职责
2015/04/01 职场文书
医疗纠纷调解协议书
2015/08/06 职场文书
详解CocosCreator项目结构机制
2021/04/14 Javascript