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

注意几点:

  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的使用,希望对大家有所帮助!

(0)

相关推荐

  • 在Vue项目中使用jsencrypt.js对数据进行加密传输的方法

    项目需求中需要对用户登录时的密码进行加密,在网上查询些许文章后,最终与后端协商使用jsencrypt.js. jsencrypt.js的github地址: https://github.com/travist/js... 使用yarn安装至Vue项目 yarn add jsencrypt --dep 或者使用npm npm install jsencrypt --dep 引入jsencrypt import { JSEncrypt } from 'jsencrypt' 可封装为全局混合,便于调用

  • 原生js的RSA和AES加密解密算法

    本文实例为大家分享了js中RSA和AES加密解密详细代码,供大家参考,具体内容如下 <!doctype html> <html> <head> <meta charset='UTF-8'> </head> <body> <div class='test'></div> <script type="text/javascript"> function encrypt(data, k

  • 同时兼容JS和C#的RSA加密解密算法详解(对web提交的数据加密传输)

    前言 我们在Web应用中往往涉及到敏感的数据,由于HTTP协议以明文的形式与服务器进行交互,因此可以通过截获请求的数据包进行分析来盗取有用的信息.虽然https可以对传输的数据进行加密,但是必须要申请证书(一般都是收费的),成本较高.那么问题来了,如果对web提交的敏感数据进行加密呢?web应用中,前端的数据处理和交互基本上都是靠javascript来完成,后台的逻辑处理可以C#(java)等进行处理. 微软的C#中虽然有RSA算法,但是格式和OpenSSL生成的公钥/私钥文件格式并不兼容.这个

  • jQuery+C#实现参数RSA加密传输功能【附jsencrypt.js下载】

    本文实例讲述了jQuery+C#实现参数RSA加密传输功能.分享给大家供大家参考,具体如下: 注意: 参数传递的+号处理,在传输时会把+变成空格,不处理后端就报错了. 1.前端代码 <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Login</title> <

  • Vue使用JSEncrypt实现rsa加密及挂载方法

    挂载全局方法 使用jsencrypt进行rsa加密 原文链接:Js参数RSA加密传输,jsencrypt.js的使用 * https://www.jb51.net/article/179813.htm (原文处有一个地方不对,不需要转换+,rsa已经做过base64转码了) 1.安装依赖 npm install jsencrypt 2.在main.js引入 import { JSEncrypt } from 'jsencrypt' 3.挂载全局方法 //JSEncrypt加密方法 Vue.pro

  • PHP+JS+rsa数据加密传输实现代码

    JS端代码: 复制代码 代码如下: //文件base64.js: var b64map="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; var b64pad="="; function hex2b64(h) { var i; var c; var ret = ""; for(i = 0; i+3 <= h.length; i+=3) { c = pars

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

    注意几点: 1.参数传递的+号处理,在传输时会把+变成空格,不处理后端就报错了. 1.前端代码 <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Login</title> <script src="~/Scripts/jquery-1.10.2.m

  • 详解c#与js的rsa加密互通

    ASN.1 抽象语法表示(标记)ASN.1(Abstract Syntax Notation One )一种数据定义语言,描述了对数据进行表示.编码.传输和解码的数据格式.网络管理系统中的管理信息库(MIB).应用程序的数据结构.协议数据单元(PDU)都是用ASN.1定义的. 可以理解为ASN.1是对密钥结构定义的一种规范 密钥结构类型 PKCS#1 RSAPublicKey ::= SEQUENCE { modulus INTEGER, -- n publicExponent INTEGER

  • security.js实现的RSA加密功能示例

    本文实例讲述了security.js实现的RSA加密功能.分享给大家供大家参考,具体如下: 在项目中遇到要对用户输入的密码进行RSA加密的需求,总结一下实现过程: <html> <head> <meta charset="utf-8" /> <title>www.jb51.net JS rsa加密</title> </head> <body> <div> <input type=&qu

  • JS实现AES加密并与PHP互通的方法分析

    本文实例讲述了JS实现AES加密并与PHP互通的方法.分享给大家供大家参考,具体如下: 有关数据加密解密问题,有很多钟加密方式: 这里我讲述下js和php实现AES互通 js加密: 首先引入这几个js文件 本站下载地址. <script type="text/JavaScript" src="/CryptoJS/aes.js"></script> <script type="text/javascript" src=

  • jQuery md5加密插件jQuery.md5.js用法示例

    本文实例讲述了jQuery md5加密插件jQuery.md5.js用法.分享给大家供大家参考,具体如下: 使用方法: $.(md5("你想要加密的字符串")); jquery.md5.js插件代码: /** * jQuery MD5 hash algorithm function * * <code> * Calculate the md5 hash of a String * String $.md5 ( String str ) * </code> * *

随机推荐