【转】RSA应用JS+PHP篇

在“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(十六进制)。

第四行便是结合n和e生成公钥,很多童鞋可能会有疑问,这样就能生成公钥?答案是肯定的,能,至于为什么小编也不清楚,其实也不需要深究,我们需要的只是应用,至于原理到我们需要做研究的时候在深入研究不迟,此时我们只需要知道,该函数通过n和e能够生产我们需要的公钥就行。第五行便是通过刚才生成的公钥对数据进行加密了,有一点需要注意的是,加密后的数据是十六进制,在进行私钥解密前需要对数据进行还原。
至此,我们就完成了前端的公钥加密,那么加密的数据是否真的能够被后端解密呢?

后端解密

通过前篇文章,相信对于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.前端加密的时候如果是中文,则解密后是乱码。
参考文章:
RSA应用PHP篇

此条目发表在JavaScript分类目录。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已用*标注