PHP rsa加密解密使用方法


Posted in PHP onApril 27, 2015

php服务端与客户端交互、提供开放api时,通常需要对敏感的部分api数据传输进行数据加密,这时候rsa非对称加密就能派上用处了,下面通过一个例子来说明如何用php来实现数据的加密解密

1、加密解密的第一步是生成公钥、私钥对,私钥加密的内容能通过公钥解密(反过来亦可以)

下载开源RSA密钥生成工具openssl(通常Linux系统都自带该程序),解压缩至独立的文件夹,进入其中的bin目录,执行以下命令:

openssl genrsa -out rsa_private_key.pem 1024
openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

第一条命令生成原始 RSA私钥文件 rsa_private_key.pem,第二条命令将原始 RSA私钥转换为 pkcs8格式,第三条生成RSA公钥 rsa_public_key.pem
从上面看出通过私钥能生成对应的公钥,因此我们将私钥private_key.pem用在服务器端,公钥发放给android跟ios等前端

2、php中用生成的公钥、私钥进行加密解密,直接上代码

<?php
$private_key = '-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQC3//sR2tXw0wrC2DySx8vNGlqt3Y7ldU9+LBLI6e1KS5lfc5jl
TGF7KBTSkCHBM3ouEHWqp1ZJ85iJe59aF5gIB2klBd6h4wrbbHA2XE1sq21ykja/
Gqx7/IRia3zQfxGv/qEkyGOx+XALVoOlZqDwh76o2n1vP1D+tD3amHsK7QIDAQAB
AoGBAKH14bMitESqD4PYwODWmy7rrrvyFPEnJJTECLjvKB7IkrVxVDkp1XiJnGKH
2h5syHQ5qslPSGYJ1M/XkDnGINwaLVHVD3BoKKgKg1bZn7ao5pXT+herqxaVwWs6
ga63yVSIC8jcODxiuvxJnUMQRLaqoF6aUb/2VWc2T5MDmxLhAkEA3pwGpvXgLiWL
3h7QLYZLrLrbFRuRN4CYl4UYaAKokkAvZly04Glle8ycgOc2DzL4eiL4l/+x/gaq
deJU/cHLRQJBANOZY0mEoVkwhU4bScSdnfM6usQowYBEwHYYh/OTv1a3SqcCE1f+
qbAclCqeNiHajCcDmgYJ53LfIgyv0wCS54kCQAXaPkaHclRkQlAdqUV5IWYyJ25f
oiq+Y8SgCCs73qixrU1YpJy9yKA/meG9smsl4Oh9IOIGI+zUygh9YdSmEq0CQQC2
4G3IP2G3lNDRdZIm5NZ7PfnmyRabxk/UgVUWdk47IwTZHFkdhxKfC8QepUhBsAHL
QjifGXY4eJKUBm3FpDGJAkAFwUxYssiJjvrHwnHFbg0rFkvvY63OSmnRxiL4X6EY
yI9lblCsyfpl25l7l5zmJrAHn45zAiOoBrWqpM5edu7c
-----END RSA PRIVATE KEY-----';

$public_key = '-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3//sR2tXw0wrC2DySx8vNGlqt
3Y7ldU9+LBLI6e1KS5lfc5jlTGF7KBTSkCHBM3ouEHWqp1ZJ85iJe59aF5gIB2kl
Bd6h4wrbbHA2XE1sq21ykja/Gqx7/IRia3zQfxGv/qEkyGOx+XALVoOlZqDwh76o
2n1vP1D+tD3amHsK7QIDAQAB
-----END PUBLIC KEY-----';

//echo $private_key;
$pi_key = openssl_pkey_get_private($private_key);//这个函数可用来判断私钥是否是可用的,可用返回资源id Resource id
$pu_key = openssl_pkey_get_public($public_key);//这个函数可用来判断公钥是否是可用的
print_r($pi_key);echo "\n";
print_r($pu_key);echo "\n";


$data = "aassssasssddd";//原始数据
$encrypted = ""; 
$decrypted = ""; 

echo "source data:",$data,"\n";

echo "private key encrypt:\n";

openssl_private_encrypt($data,$encrypted,$pi_key);//私钥加密
$encrypted = base64_encode($encrypted);//加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的
echo $encrypted,"\n";

echo "public key decrypt:\n";

openssl_public_decrypt(base64_decode($encrypted),$decrypted,$pu_key);//私钥加密的内容通过公钥可用解密出来
echo $decrypted,"\n";

echo "---------------------------------------\n";
echo "public key encrypt:\n";

openssl_public_encrypt($data,$encrypted,$pu_key);//公钥加密
$encrypted = base64_encode($encrypted);
echo $encrypted,"\n";

echo "private key decrypt:\n";
openssl_private_decrypt(base64_decode($encrypted),$decrypted,$pi_key);//私钥解密
echo $decrypted,"\n";
PHP 相关文章推荐
PHP的面试题集
Nov 19 PHP
php下正则来匹配dede模板标签的代码
Aug 21 PHP
PHP中如何调用webservice的实例参考
Apr 25 PHP
Linux下PHP安装mcrypt扩展模块笔记
Sep 10 PHP
ThinkPHP入口文件设置及相关注意事项分析
Dec 05 PHP
[原创]ThinkPHP中SHOW_RUN_TIME不能正常显示运行时间的解决方法
Oct 10 PHP
Laravel SQL语句记录方式(推荐)
May 26 PHP
php使用preg_match()函数验证ip地址的方法
Jan 07 PHP
thinkphp 验证码 的使用小结
May 07 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
Aug 31 PHP
phpStudy配置多站点多域名方法及遇到的403错误解决方法
Oct 19 PHP
thinkPHP+mysql+ajax实现的仿百度一下即时搜索效果详解
Jul 15 PHP
PHP、Java des加密解密实例
Apr 27 #PHP
PHP永久登录、记住我功能实现方法和安全做法
Apr 27 #PHP
php curl 获取https请求的2种方法
Apr 27 #PHP
PHP curl伪造IP地址和header信息代码实例
Apr 27 #PHP
JavaScript实现滚动栏效果的方法
Apr 27 #PHP
php curl 上传文件代码实例
Apr 27 #PHP
php把大写命名转换成下划线分割命名
Apr 27 #PHP
You might like
PHP 高手之路(三)
2006/10/09 PHP
Windows Apache2.2.11及Php5.2.9-1的安装与配置方法
2009/06/08 PHP
PHP中nowdoc和heredoc使用需要注意的一点
2014/03/21 PHP
PHP魔术方法使用方法汇总
2016/02/14 PHP
php微信公众号开发(3)php实现简单微信文本通讯
2016/12/15 PHP
一文掌握PHP Xdebug 本地与远程调试(小结)
2019/04/23 PHP
jquery键盘事件介绍
2011/01/31 Javascript
纯JS实现五子棋游戏兼容各浏览器(附源码)
2013/04/24 Javascript
jQuery实现仿淘宝带有指示条的图片转动切换效果完整实例
2015/03/04 Javascript
js倒计时简单实现方法
2015/12/17 Javascript
js+html5实现的自由落体运动效果代码
2016/01/28 Javascript
javascript实现抽奖程序的简单实例
2016/06/07 Javascript
简单理解vue中track-by属性
2016/10/26 Javascript
jquery加载单文件vue组件的方法
2017/06/20 jQuery
web前端vue之CSS过渡效果示例
2018/01/10 Javascript
让webpack+vue-cil项目不再自动打开浏览器的方法
2018/09/27 Javascript
vue实现点击隐藏与显示实例分享
2019/02/13 Javascript
JS 自执行函数原理及用法
2019/08/05 Javascript
JavaScript制作3D旋转相册
2020/08/02 Javascript
ES6学习笔记之字符串、数组、对象、函数新增知识点实例分析
2020/01/22 Javascript
[05:05]第三天的dota2
2013/07/29 DOTA
[57:16]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第二场
2014/05/26 DOTA
python中bisect模块用法实例
2014/09/25 Python
使用Python进行目录的对比方法
2018/11/01 Python
Python线程池模块ThreadPoolExecutor用法分析
2018/12/28 Python
python 判断文件还是文件夹的简单实例
2019/06/10 Python
pandas中read_csv的缺失值处理方式
2019/12/19 Python
python如何删除列为空的行
2020/07/17 Python
CSS3实现任意图片lowpoly动画效果实例
2017/05/11 HTML / CSS
优质的学校老师推荐信
2013/10/28 职场文书
运动会通讯稿300字
2014/02/02 职场文书
文明美德伴我成长演讲稿
2014/05/12 职场文书
农业开发项目建议书
2014/05/16 职场文书
爱心捐助活动总结
2015/05/09 职场文书
奥巴马开学演讲观后感
2015/06/12 职场文书
Python数据分析之pandas读取数据
2021/06/02 Python