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+MYSQL的文章管理系统(一)
Oct 09 PHP
PHP简介
Oct 09 PHP
PHP Mysql编程之高级技巧
Aug 27 PHP
从php核心代码分析require和include的区别
Jan 02 PHP
php打开远程文件的方法和风险及解决方法
Nov 12 PHP
PHP安全的URL字符串base64编码和解码
Jun 19 PHP
PHP中让curl支持sock5的代码实例
Jan 21 PHP
PHP异常处理浅析
May 12 PHP
php根据日期或时间戳获取星座信息和生肖等信息
Oct 20 PHP
PHP递归实现汉诺塔问题的方法示例
Nov 25 PHP
PHP实现文字写入图片功能
Feb 18 PHP
thinkphp5 模型实例化获得数据对象的教程
Oct 18 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 MySQL与分页效率
2008/06/04 PHP
PHP在线生成二维码(google api)的实现代码详解
2013/06/04 PHP
PHP开发的微信现金红包功能示例
2017/06/29 PHP
laravel通过创建自定义artisan make命令来新建类文件详解
2017/08/17 PHP
php探针使用原理和技巧讲解
2019/09/17 PHP
理解Javascript_15_作用域分配与变量访问规则,再送个闭包
2010/10/20 Javascript
让人印象深刻的10个jQuery手风琴效果应用
2012/05/08 Javascript
jQuery列表拖动排列具体实现
2013/11/04 Javascript
JS实现的一个简单的Autocomplete自动完成例子
2014/04/16 Javascript
WEB前端设计师常用工具集锦
2014/12/09 Javascript
node.js中的buffer.write方法使用说明
2014/12/10 Javascript
JS实现霓虹灯文字效果的方法
2015/08/06 Javascript
javascript下拉列表菜单的实现方法
2015/11/18 Javascript
javascript设计简单的秒表计时器
2020/09/05 Javascript
理解Javascript文件动态加载
2016/01/29 Javascript
jQuery插件实现图片轮播特效
2016/06/16 Javascript
基于JavaScript实现Tab选项卡切换效果
2016/11/24 Javascript
基于vue实现多引擎搜索及关键字提示
2017/03/16 Javascript
vue-cli项目如何使用vue-resource获取本地的json数据(模拟服务端返回数据)
2017/08/04 Javascript
JS轮播图实现简单代码
2021/02/19 Javascript
学习python类方法与对象方法
2016/03/15 Python
一篇文章读懂Python赋值与拷贝
2018/04/19 Python
解决pandas使用read_csv()读取文件遇到的问题
2018/06/15 Python
Python之列表的插入&amp;替换修改方法
2018/06/28 Python
python写入文件自动换行问题的方法
2019/07/05 Python
django ManyToManyField多对多关系的实例详解
2019/08/09 Python
python解释器pycharm安装及环境变量配置教程图文详解
2020/02/26 Python
Python3实现个位数字和十位数字对调, 其乘积不变
2020/05/03 Python
selenium切换标签页解决get超时问题的完整代码
2020/08/30 Python
CSS3 text shadow字体阴影效果
2016/01/08 HTML / CSS
HTML5实现经典坦克大战坦克乱走还能发出一个子弹
2013/09/02 HTML / CSS
英国和爱尔兰的自炊式豪华度假小屋:Rural Retreats
2018/06/08 全球购物
乐观大学生的自我评价
2014/01/10 职场文书
航海技术专业毕业生推荐信
2014/07/09 职场文书
护理心得体会范文
2016/01/22 职场文书
MySQL基础快速入门知识总结(附思维导图)
2021/09/25 MySQL