php RSA 加密解密详解
2022-05-31PHP
当php服务端与客户端交互、提供开放api、api接口对接时,通常需要对敏感的部分api数据传输进行数据加密,这样做的好处是可以增加安全性,其中RSA非对称加密就能派上用处了,
如企鹅微信公众号的企业付款到银行卡API中就有用到该技术
今天被企鹅的企业付款到银行卡API中,银行卡号和用户名需要用到的RSA 加密坑到了,一顿被狂虐后,记下此文

Linux系统都自带RSA密钥生成工具openssl,下面命令操作是CentOS下执行
当php服务端与客户端交互、提供开放api、api接口对接时,通常需要对敏感的部分api数据传输进行数据加密,这样做的好处是可以增加安全性,其中RSA非对称加密就能派上用处了,
如企鹅微信公众号的企业付款到银行卡API中就有用到该技术,文档地址:
一、生成私钥
openssl genrsa -out rsa_private_key.pem 1024 # 第一条命令生成原始 RSA私钥文件 rsa_private_key.pem
二、生成公钥
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem # 第二条生成RSA公钥文件 rsa_public_key.pem
从上面看出通过私钥能生成对应的公钥,因此我们将私钥private_key.pem用在服务器端,公钥发放给android、ios等前端,或让其对接接口
运行以上两条命令后的效果图

三、php中用生成的公钥、私钥进行加密解密
私钥加密的内容能通过公钥解密(反过来亦可以)
<?php
$private_file='./rsa_private_key.pem';//rsa_private_key.pem文件目录位置
$public_file ='./rsa_public_key.pem';//rsa_public_key.pem文件目录位置
//这个函数可用来判断私钥是否是可用的
$private_key = openssl_pkey_get_private(file_get_contents($private_file));
//这个函数可用来判断公钥是否是可用的
$public_key = openssl_pkey_get_public(file_get_contents($public_file));
if(!$private_key){
exit('私钥不可用!');
}
if(!$public_key){
exit('公钥不可用!');
}
$data = "我是原始数据"; //原始数据
$encrypted = ""; // 加密后的数据.用于网络中的传输.提前定义为空字符串
$decrypted = ""; // 解密后的数据,提前定义为空字符串
$is_success = openssl_private_encrypt($data,$encrypted,$private_key); //私钥加密
if($is_success){
//加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的,base64_encode后方便在网址中传输或者打印,否则打印为乱码
$encrypted = base64_encode($encrypted);
echo '私钥加密的数据:';
var_dump($encrypted);
}else{
exit('加密失败');
}
openssl_public_decrypt(base64_decode($encrypted),$decrypted,$public_key);//私钥加密的内容通过公钥可用解密出来
echo '公钥解密的数据';
var_dump($decrypted);
echo "<br/>---------------------------------------<br/>";
$is_success = openssl_public_encrypt($data,$encrypted,$public_key);//公钥加密
if($is_success){
$encrypted = base64_encode($encrypted);
echo '公钥加密的数据';
var_dump($encrypted);
}else{
exit('加密失败');
}
openssl_private_decrypt(base64_decode($encrypted),$decrypted,$private_key);//私钥解密
echo '私钥解密的数据';
var_dump($decrypted);
运行后效果图如下:

很赞哦! ()
