在“RSA应用PHP篇”中我们了解到了RSA在PHP中的如何使用,但是实际的数据传输是“前端提交数据”——>“HTTP传输”——>“后端接收数据”,我们需要在数据进行HTTP传输前对数据进行加密,才能确保数据在传输过程中的安全性,因此我们需要借助于JavaScript,下面我们就来看下前后端结合的RSA的应用吧。
前端加密
虽然JavaScript没有默认的函数可以处理RSA,但是也无需我们手动书写,因为有大神们已经帮我们写好了,我们只需要下载应用就行,点此下载。我们需要下载的文件至少有四个,jsbn.js、prng4.js、rng.js和rsa.js,虽然主要使用的js是rsa,js,但是它们之间有依赖关系,所以需要下载四个,这些文件在下载页面都找的到。引入4个js之后,我们再书写以下代码:
var rsa = new RSAKey();
var n = "Modulus";
var e = "exponent";
rsa.setPublic(n,e);
var res = rsa.encrypt('encrypt test');
代码十分简单,只有短短的5行,但是每行代码代表什么意思相信很多初学者都不是很明白,其实也很简单,第一行,自然是先new一个RSAKey对象,这个相信大家都容易理解,但是第二行和第三行的n和e又代表了什么呢?我们先来看n,这里的n指的是Modulus(模数),我们可以根据私钥计算出来该值,具体指令如下
rsa -in private_key.pem -noout -modulus
这里的n需要的就是Modulus=后面的值了。
n知道了,那么e呢?还记得我们当初生成私钥的时候展示的那些信息了吗,其中有一行便有其中我们需要的e值。一般情况下e的取值是一个定值10001(十六进制)。
至此,我们就完成了前端的公钥加密,那么加密的数据是否真的能够被后端解密呢?
后端解密
通过前篇文章,相信对于PHP处理RSA都不会陌生了,PHP处理RSA还是十分简单的,当然如果接收来自前端的数据,还需要做些调整。
$private_key="私钥";
$hex_encrypt_data="前端加密数据";//十六进制数据
$encrypt_data = pack("H*",$hex_encrypt_data);//对十六进制数据进行转换
openssl_private_decrypt($encrypt_data,$decrypt_data,$private_key);
echo '解密后的数据'.$decrypt_data;
经过小编测试,由JavaScript加密的数据能够正确的被PHP解密。
注意事项
1.由上述js加密后的数据是十六进制,在后端进行私钥解密前需要对数据进行转换。
2.前端加密的时候如果是中文,则解密后是乱码。