JavaScript到PHP使用RSA算法进行加密通讯

我们平时做用户登录表单提交,用户名密码都是明文直接POST到后端,这样很容易被别人从监听到。

在js上做rsa,感觉jsencrypt这个是封装的比较好的,但用起来还是遇到了些坑,所以踩进代码里填填坑~

项目在这里 https://github.com/travist/jsencrypt

关于jsencrypt和RSA我就不多介绍了,直接上代码

因为jsencrypt与最新的PHP不兼容所以折腾了好久,在js上做了些改动

可直接下载修改过的js:http://pan.baidu.com/s/1qYu0FA8

1,编辑jsencrypt.js,添加3个方法:

 1 function RSAEncryptLong(text) {
 2   var length = ((this.n.bitLength()+7)>>3) - 11;
 3   if (length <= 0) return false;
 4   var ret = "";
 5   var i = 0;
 6   while(i + length < text.length) {
 7     ret += this._short_encrypt(text.substring(i,i+length));
 8     i += length;
 9   }
10   ret += this._short_encrypt(text.substring(i,text.length));
11   return ret;
12 }
13
14 /**
15    * base64编码
16    * @param {Object} str
17    */
18   function base64encode(str){
19     var out, i, len;
20     var c1, c2, c3;
21     len = str.length;
22     i = 0;
23     out = "";
24     while (i < len) {
25       c1 = str.charCodeAt(i++) & 0xff;
26       if (i == len) {
27         out += base64EncodeChars.charAt(c1 >> 2);
28         out += base64EncodeChars.charAt((c1 & 0x3) << 4);
29         out += "==";
30         break;
31       }
32       c2 = str.charCodeAt(i++);
33       if (i == len) {
34         out += base64EncodeChars.charAt(c1 >> 2);
35         out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
36         out += base64EncodeChars.charAt((c2 & 0xF) << 2);
37         out += "=";
38         break;
39       }
40       c3 = str.charCodeAt(i++);
41       out += base64EncodeChars.charAt(c1 >> 2);
42       out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
43       out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));
44       out += base64EncodeChars.charAt(c3 & 0x3F);
45     }
46     return out;
47   }
48
49   /**
50    * base64解码
51    * @param {Object} str
52    */
53   function base64decode(str){
54     var c1, c2, c3, c4;
55     var i, len, out;
56     len = str.length;
57     i = 0;
58     out = "";
59     while (i < len) {
60       /* c1 */
61       do {
62         c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
63       }
64       while (i < len && c1 == -1);
65       if (c1 == -1)
66         break;
67       /* c2 */
68       do {
69         c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
70       }
71       while (i < len && c2 == -1);
72       if (c2 == -1)
73         break;
74       out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));
75       /* c3 */
76       do {
77         c3 = str.charCodeAt(i++) & 0xff;
78         if (c3 == 61)
79           return out;
80         c3 = base64DecodeChars[c3];
81       }
82       while (i < len && c3 == -1);
83       if (c3 == -1)
84         break;
85       out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2));
86       /* c4 */
87       do {
88         c4 = str.charCodeAt(i++) & 0xff;
89         if (c4 == 61)
90           return out;
91         c4 = base64DecodeChars[c4];
92       }
93       while (i < len && c4 == -1);
94       if (c4 == -1)
95         break;
96       out += String.fromCharCode(((c3 & 0x03) << 6) | c4);
97     }
98     return out;
99   }

2,找到这一行

RSAKey.prototype.encrypt = RSAEncrypt;

修改为:

RSAKey.prototype.encrypt = RSAEncryptLong;
RSAKey.prototype._short_encrypt = RSAEncrypt;

3,找到这一行代码

JSEncrypt.prototype.encrypt = function (string) {
  // Return the encrypted string.
  try {
    return hex2b64(this.getKey().encrypt(string));
  }

修改为:

JSEncrypt.prototype.encrypt = function (string) {
  // Return the encrypted string.
  try {
    return base64encode(this.getKey().encrypt(string));
  }

4,页面js加密代码

1 <script type="text/javascript" src="jsencrypt.js"></script>
2 <script>
3 function encrypt(msg) {
4     var rsa = new JSEncrypt();
5     rsa.setPublic(‘8a5f4d4fa7dd78ca8539ba8b9581b30c9ce04e1998cd881d5279221984bc606e2c7d3368dc184b357507966a0f20930ba665cd9e914d6b0b67c8636ffe8cacfd‘, ‘10001‘);
6     return rsa.encrypt(msg);
7 }
8 </script>

PHP解密代码

 1 require_once(‘Crypt/RSA.php‘);
 2 define("KEY_PRIVATE", "-----BEGIN RSA PRIVATE KEY-----
 3 MIIBOQIBAAJBAIpfTU+n3XjKhTm6i5WBswyc4E4ZmM2IHVJ5IhmEvGBuLH0zaNwYSzV1B5ZqDyCT
 4 C6ZlzZ6RTWsLZ8hjb/6MrP0CAwEAAQJAAlK9TTln9No5nbwtvHHesWHaO5V0b6b5ubkXmHlrtuwR
 5 nnNLGT9wqtIyP830/njo3qMFSIFKYGIErt+bSxEgBQIhAK5LTM2u2AudTUb6l1pi8qypXf7UHGUQ
 6 bTxqPZaeh4gHAiEAyz0Wt0emBEieUDw7D4g3IXCb36cJcqDJ0OOz9rAwedsCIEV7QzzjrMDEjp/z
 7 Gg8wTunCAvSpfkBT0hg5ih/XRtRVAiAQXVnf5iADBknhEgh7Zq9xvNyANLX5CeNWM4+BFIzCswIg
 8 dGr1KW1fmIGJXoJ8qbFUbY7Bgk+cEc0kf2GvudfGQ5k=
 9 -----END RSA PRIVATE KEY-----");
10
11 function decrypt(msg) {
12     $rsa = new Crypt_RSA();
13     $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
14     $rsa->loadKey(KEY_PRIVATE, CRYPT_RSA_PRIVATE_FORMAT_PKCS1);
15     $s = new Math_BigInteger(base64_decode(msg), 16);
16     retrun $rsa->decrypt($s->toBytes());
17 }

最后 我希望这个解决方案能帮助你们中的一些人。如果我的文章有什么问题,请随时联系帮助我纠正它。

参考:

http://travistidwell.com/jsencrypt/

http://bestmike007.com/2011/08/secure-data-transmission-between-pure-php-and-javascript-using-rsa/

时间: 2024-10-10 14:20:39

JavaScript到PHP使用RSA算法进行加密通讯的相关文章

&lt;密码学入门&gt;关于RSA算法的加密解密及代码实现

RSA算法 是一种公钥加密算法,RSA算法相比别的算法思路非常清晰,但是想要破解的难度非常大.RSA算法基于一个非常简单的数论事实:两个素数相乘得到一个大数很容易,但是由一个大数分解为两个素数相乘却非常难.这种算法是在1978年首次亮相,它是第一个既能用于数据加密也可以用于数字签名的算法,而且理解起来简单容易.早在1973,就有密码学家发现了类似的算法,但是一直被列为绝密直到1998年才被正式公开出来. RSA算法是一种非对称的算法,该算法需要一对密钥使用其中一个加密另一个就可以进行解密.首先我

RSA算法 JS加密 JAVA解密

有这样一个需求,前端登录的用户名密码,密码必需加密,但不可使用MD5,因为后台要检测密码的复杂度,那么在保证安全的前提下将密码传到后台呢,答案就是使用RSA非对称加密算法解决 . java代码 需要依赖 commons-codec 包 RSACoder.java import org.apache.commons.codec.binary.Base64; import javax.crypto.Cipher; import java.security.*; import java.securit

springmvc使用RSA算法加密表单

今天被吐槽在客户端用js对密码进行md5加密其实也不见得安全.这种做法其实不见得有什么作用,学过计算机网络都知道,在网上抓一个包是很简单的事,就算别人抓包抓不到你原始密码,用这个md5后的密码一样可以模拟登录系统.这样做无非就是直接通过登录页没法直接输入用户名密码,但用个程序模拟登陆也不是什么太难的事情.以前一直写那么多,一直没有注意,直到今天被吐槽,才发现以前自己的做法是多么的幼稚. 加密数据的方式当然不止一种,也可以通过https加密数据,但是对于一般应用来说,还需要花钱拿去给那些认证机构签

RSA算法加密解密,数据传输,前台与后台数据交互

1.RSA算法加密解密思路. java后台随机生成公钥.私钥.存储于session中,告知前台js获取公钥.通过jsencrypt.min.js进行加密.传输回后台,后台通过私钥解密. 2.RSA常见异常分解. 问题一 Cannot find any provider supporting RSA 出现此问题,属于JDK版本bug问题,笔者1.8.0_171遇到此问题,更换1.8.0_211之后即可解决. 问题二 DER input, Integer tag error 出现此问题,主要是公钥,

ios下使用RSA算法加密与java后台解密配合demo

首先了解一下几个相关概念,以方便后面遇到的问题的解决: 原网址:http://blog.csdn.net/jinglijun/article/details/7770315RSA算法:1977年由Ron Rivest.Adi Shamirh和LenAdleman发明的,RSA就是取自他们三个人的名字.算法基于一个数论:将两个大素数相乘非常容易,但要对这个乘积的结果进行因式分解却非常困难,因此可以把乘积公开作为公钥.该算法能够抵抗目前已知的所有密码攻击.RSA算法是一种非对称算法,算法需要一对密钥

基于私钥加密公钥解密的RSA算法C#实现

RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作. RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一.RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价.    RSA的安全性依赖于大数分解.公钥和私钥都是两个大素数( 大于 100个十进制位)的函数.据猜测,从一个密钥和密文推断出明文的难度等同于分解两个大素数的积.     密钥对的产生.选择两个大素数,p

浅谈IM软件业务知识——非对称加密,RSA算法,数字签名,公钥,私钥

概述 首先了解一下相关概念:RSA算法:1977年由Ron Rivest.Adi Shamirh和LenAdleman发明的.RSA就是取自他们三个人的名字. 算法基于一个数论:将两个大素数相乘很easy,但要对这个乘积的结果进行 因式分解却很困难,因此可以把乘积公开作为公钥.该算法可以抵抗眼下已知的全部password攻击. RSA算法是一种非对称算法,算法须要一对密钥.使用当中一个 加密.须要使用另外一个才干解密.我们在进行RSA加密通讯时.就把公钥放在client,私钥留在server.

基于私钥加密公钥解密的RSA算法C#实现方法

本文实例讲述了基于私钥加密公钥解密的RSA算法C#实现方法,是一种应用十分广泛的算法.分享给大家供大家参考之用.具体方法如下: 一.概述 RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作. RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一.RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价. RSA的安全性依赖于大数分解.公钥和私钥都是两个大素数( 大于 1

非对称加密技术- RSA算法数学原理分析

非对称加密技术,在现在网络中,有非常广泛应用.加密技术更是数字货币的基础. 所谓非对称,就是指该算法需要一对密钥,使用其中一个(公钥)加密,则需要用另一个(私钥)才能解密.但是对于其原理大部分同学应该都是一知半解,今天就来分析下经典的非对称加密算法 - RSA算法.通过本文的分析,可以更好的理解非对称加密原理,可以让我们更好的使用非对称加密技术. 题外话: 本博客一直有打算写一系列文章通俗的密码学,昨天给站点上https, 因其中使用了RSA算法,就查了一下,发现现在网上介绍RSA算法的文章都写