php如何使用RSA加密或解密数据?
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
大家已经会使用jsencrypt
对数据进行加密解密了,苏南大叔也说了,在前端角度上来看的话,更常用的就是加密了。所以,从后端角度上来说,解密就是重要的工作了。那么,在本篇文章中,苏南大叔将要讲述:如何利用php
的RSA
算法对数据进行加密解密。
本文测试环境:mac
/php72
。
前言
在php
版本的RSA
加密解密中,掺杂着base64
加解密的过程,而且公钥和私钥都不是可以直接使用字符串的,需要使用函数先处理一下。这个加密解密过程,和js
版RSA
,是可以相互处理数据的。前提就是两者的公钥和私钥保持一致。
如何获得一对RSA
公钥私钥呢?
另外,php
需要开启libssl.so
扩展,可以参考下面的这篇文章:
前端javascript
使用rsa
算法的例子,如下:
密钥对处理
获得的公钥和密钥在php
里面使用的时候,可以直接使用,不用像js
一样,再去除一下回车换行。这是因为php
本身的语言特性所决定的。
例如,在php
里面定义个公钥(公钥内容并不完整,由于篇幅限制,下面仅为示意),可以这样定义:
define('RSA_PUBLIC', '-----BEGIN PUBLIC KEY-----
UVlVw+rQnYYyVuiLAgMBAAE=
-----END PUBLIC KEY-----');
或者也可以这样定义:
$rsa_public = "-----BEGIN PUBLIC KEY-----
UVlVw+rQnYYyVuiLAgMBAAE=
-----END PUBLIC KEY-----";
公钥加密,私钥解密(推荐)
公钥加密
下面的是个RSA
公钥加密的范例:
function encode($data){
$key = openssl_pkey_get_public(RSA_PUBLIC);
if (!$key) {
return('公钥不可用');
}
$_ret = openssl_public_encrypt($data, $crypted, $key);
if (!$_ret) {
return('加密失败,请检查RSA秘钥');
}
return base64_encode($crypted);
}
私钥解密
下面的是个RSA
私钥解密的范例:
function decode($data){
$private_key = openssl_pkey_get_private(RSA_PRIVATE);
if (!$private_key) {
return('私钥不可用');
}
$_ret = openssl_private_decrypt(base64_decode($data), $decrypted, $private_key);
if (!$_ret) {
return('解密失败,请检查RSA秘钥');
}
return $decrypted;
}
私钥加密,公钥解密
私钥加密
下面的是个RSA
私钥加密的范例:
function encode($data){
$key = openssl_pkey_get_private(RSA_PRIVATE);
if (!$key) {
return('私钥不可用');
}
$_ret = openssl_private_encrypt($data, $crypted, $key);
if (!$_ret) {
return('加密失败,请检查RSA秘钥');
}
return base64_encode($crypted);
}
公钥解密
下面的是个RSA
公钥解密的范例:
function decode($data){
$key = openssl_pkey_get_public(RSA_PUBLIC);
if (!$key) {
return('公钥不可用');
}
$_ret = openssl_public_decrypt(base64_decode($data), $decrypted, $key);
if (!$_ret) {
return('解密失败,请检查RSA秘钥');
}
return $decrypted;
}
注意事项
- 这里要特别强调一下,上述系列加密解密函数里面的第二个参数和返回值。所有的第二个参数都是引用类型的,而他们的返回值,只是用于显示加密或者解密的成果。那么,这个
openssl_*_*
系列函数,就是显得那么的沙雕。大家所希望的他们的返回值,并不出现在等式的左侧,而是在右侧的第二个引用参数里面。这个和大家的习惯是非常不一致的。 - 虽然,大家一般都是使用公钥加密,然后再使用私钥解密的。但是事实上,
RSA
作为一个非对称加密。也是可以使用私钥加密,然后使用公钥解密的。这个虽然不常见,但是事实上是可以运行的。
总结
在实际应用过程中,可以前端js
加密,后端php
解密。这样,就可以形成功能上的闭环了。唯一需要注意的地方,就是两者的密钥对要保持一致。更多rsa
相关博客文章,请参见苏南大叔的博客:
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。