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 相关文章推荐
smtp邮件发送一例
Oct 09 PHP
一个数据采集类
Feb 14 PHP
php+mysql开源XNA 聚合程序发布 下载
Jul 13 PHP
Ajax+PHP 边学边练之四 表单
Nov 27 PHP
PHP函数常用用法小结
Feb 08 PHP
php 格式化数字的时候注意数字的范围
Apr 13 PHP
php中记录用户访问过的产品,在cookie记录产品id,id取得产品信息
May 04 PHP
如何用phpmyadmin设置mysql数据库用户的权限
Jan 09 PHP
php之curl设置超时实例
Nov 03 PHP
php判断当前操作系统类型
Oct 28 PHP
yii2使用ajax返回json的实现方法
May 14 PHP
PHP获取数据库表中的数据插入新的表再原删除数据方法
Oct 12 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
使用array mutisort 实现按某字段对数据排序
2013/06/18 PHP
解析左右值无限分类的实现算法
2013/06/20 PHP
C#静态方法与非静态方法实例分析
2014/09/22 PHP
php利用fsockopen GET/POST提交表单及上传文件
2017/05/22 PHP
用js实现的仿sohu博客更换页面风格(简单版)
2007/03/22 Javascript
js 效率组装字符串 StringBuffer
2009/12/23 Javascript
js弹窗代码 可以指定弹出间隔
2010/07/03 Javascript
22点关于jquery性能优化的建议
2014/05/28 Javascript
jQuery简单操作cookie的插件实例
2016/01/13 Javascript
node.js + socket.io 实现点对点随机匹配聊天
2017/06/30 Javascript
jQuery Autocomplete简介_动力节点Java学院整理
2017/07/17 jQuery
vue2.0中vue-cli实现全选、单选计算总价格的实例代码
2017/07/18 Javascript
JS中的事件委托实例浅析
2018/03/22 Javascript
JS实现简单获取最近7天和最近3天日期的方法
2018/04/18 Javascript
10行代码实现微信小程序滑动tab切换
2018/12/28 Javascript
微信小程序webSocket的使用方法
2020/02/20 Javascript
Python urllib模块urlopen()与urlretrieve()详解
2013/11/01 Python
pygame学习笔记(5):游戏精灵
2015/04/15 Python
python实现windows下文件备份脚本
2018/05/27 Python
在Mac上删除自己安装的Python方法
2018/10/29 Python
Python数据报表之Excel操作模块用法分析
2019/03/11 Python
opencv导入头文件时报错#include的解决方法
2019/07/31 Python
解决torch.autograd.backward中的参数问题
2020/01/07 Python
Python面向对象程序设计之静态方法、类方法、属性方法原理与用法分析
2020/03/23 Python
python实现读取类别频数数据画水平条形图案例
2020/04/24 Python
python 制作简单的音乐播放器
2020/11/25 Python
家得宝墨西哥官网:The Home Depot墨西哥
2019/11/18 全球购物
经济管理专业毕业生推荐信
2013/11/11 职场文书
终止劳动合同协议书
2014/04/14 职场文书
竞选副班长演讲稿
2014/04/24 职场文书
优秀的应届生自荐信
2014/05/23 职场文书
邀请函怎么写
2015/01/30 职场文书
小学生暑假生活总结
2015/07/13 职场文书
新入职员工工作总结
2015/10/15 职场文书
Python序列化模块JSON与Pickle
2022/06/05 Python
css清除浮动clearfix:after的用法详解(附完整代码)
2023/05/21 HTML / CSS