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实现返回顶部按钮和scroll滚动功能[带动画效果]
Jul 05 jQuery
jQuery修改DOM结构_动力节点Java学院整理
Jul 05 jQuery
jQuery Layer弹出层传值到父页面的实现代码
Aug 17 jQuery
jQuery中.attr()和.data()的区别分析
Sep 03 jQuery
jQuery 利用ztree实现树形表格的实例代码
Sep 27 jQuery
jQuery实现的鼠标滚轮控制图片缩放功能实例
Oct 14 jQuery
jQuery中的类名选择器(.class)用法简单示例
May 14 jQuery
jQuery实现监听下拉框选中内容发生改变操作示例
Jul 13 jQuery
jquery获取file表单选择文件的路径、名字、大小、类型
Jan 18 jQuery
jQuery实现表格的增、删、改操作示例
Jan 27 jQuery
jQuery实现的导航条点击后高亮显示功能示例
Mar 04 jQuery
jQuery Datatables 动态列+跨列合并实现代码
Jan 30 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做的端口嗅探器--可以指定网站和端口
2006/10/09 PHP
让CodeIgniter数据库缓存自动过期的处理的方法
2014/06/12 PHP
mac环境中使用brew安装php5.5.15
2014/08/18 PHP
PHP远程调试之XDEBUG
2015/12/29 PHP
彻底搞懂PHP 变量结构体
2017/10/11 PHP
小程序微信支付功能配置方法示例详解【基于thinkPHP】
2019/05/05 PHP
php使用mysqli和pdo扩展,测试对比mysql数据库的执行效率完整示例
2019/05/09 PHP
用JQuery 实现的自定义对话框
2007/03/24 Javascript
js 图片轮播(5张图片)
2008/12/30 Javascript
动态载入js提高网页打开速度的方法
2014/07/04 Javascript
javascript结合Canvas 实现简易的圆形时钟
2015/03/11 Javascript
javascript电商网站抢购倒计时效果实现
2015/11/19 Javascript
1秒50万字!js实现关键词匹配
2016/08/01 Javascript
angular实现IM聊天图片发送实例
2017/05/08 Javascript
Angular2关于@angular/cli默认端口号配置的问题
2017/07/15 Javascript
JS实现匀加速与匀减速运动的方法示例
2017/09/04 Javascript
Js中async/await的执行顺序详解
2017/09/22 Javascript
jQuery实现表单动态加减、ajax表单提交功能
2018/06/08 jQuery
JS实现Cookie读、写、删除操作工具类示例
2018/08/28 Javascript
[07:25]DOTA2-DPC中国联赛2月5日Recap集锦
2021/03/11 DOTA
布同 统计英文单词的个数的python代码
2011/03/13 Python
用python 制作图片转pdf工具
2015/01/30 Python
Python二分法搜索算法实例分析
2015/05/11 Python
Python列表切片用法示例
2017/04/19 Python
Python3实现将本地JSON大数据文件写入MySQL数据库的方法
2018/06/13 Python
python处理csv中的空值方法
2018/06/22 Python
Python异常原理及异常捕捉实现过程解析
2020/03/25 Python
opencv-python的RGB与BGR互转方式
2020/06/02 Python
用python批量下载apk
2020/12/29 Python
关于前端上传文件全面基础扫盲贴(入门)
2019/08/01 HTML / CSS
iHerb中文官网:维生素、保健品和健康产品
2018/11/01 全球购物
JAVA高级程序员面试题
2013/09/06 面试题
报告会主持词
2014/04/02 职场文书
三月学雷锋月活动总结
2014/04/28 职场文书
余世维讲座观后感
2015/06/11 职场文书
Windows 11上手初体验:任务栏和开始菜单等迎来大改
2021/11/21 数码科技