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学习之PHP运算符
Oct 09 PHP
php下载远程文件类(支持断点续传)
Nov 14 PHP
php生成扇形比例图实例
Nov 06 PHP
深入解读php中关于抽象(abstract)类和抽象方法的问题分析
Jan 03 PHP
php实现生成验证码实例分享
Apr 10 PHP
PHP将页面中点击数量高的链接进行高亮显示的方法
May 30 PHP
yii2安装详细流程
May 23 PHP
PHP实现的超长文本分页显示功能示例
Jun 04 PHP
PHP实现函数内修改外部变量值的方法示例
Dec 28 PHP
PHP使用 Imagick 扩展实现图片合成,圆角处理功能示例
Sep 09 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
Feb 27 PHP
TP5框架实现自定义分页样式的方法示例
Apr 05 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
Zerg建筑一览
2020/03/14 星际争霸
Yii框架调试心得--在页面输出执行sql语句
2014/12/25 PHP
PHP变量赋值、代入给JavaScript中的变量
2015/06/29 PHP
PHP flush 函数使用注意事项
2016/08/26 PHP
Yii CFileCache 获取不到值的原因分析
2017/02/08 PHP
突发奇想的一个jquery插件
2010/11/19 Javascript
A标签触发onclick事件而不跳转的多种解决方法
2013/06/27 Javascript
jquery三个关闭弹出层的小示例
2013/11/05 Javascript
Enter转换为Tab的小例子(兼容IE,Firefox)
2013/11/14 Javascript
jquery常用特效方法使用示例
2014/04/25 Javascript
javascript删除一个html元素节点的方法
2014/12/20 Javascript
AngularJS基础学习笔记之表达式
2015/05/10 Javascript
jQuery实现瀑布流布局详解(PC和移动端)
2020/09/01 Javascript
jQuery+ajax简单实现文件上传的方法
2016/06/03 Javascript
表单元素值获取方式js及java方式的简单实例
2016/10/15 Javascript
Bootstrap缩略图与警告框学习使用
2017/02/08 Javascript
详解如何实现一个简单的Node.js脚手架
2017/12/04 Javascript
JavaScript实现百度搜索框效果
2020/03/26 Javascript
小程序按钮避免多次调用接口和点击方案实现(不用showLoading)
2020/04/15 Javascript
wxPython 入门教程
2008/10/07 Python
python批量生成本地ip地址的方法
2015/03/23 Python
python dataframe 输出结果整行显示的方法
2018/06/14 Python
django.db.utils.ProgrammingError: (1146, u“Table‘’ doesn’t exist”)问题的解决
2018/07/13 Python
pyqt5 tablewidget 利用线程动态刷新数据的方法
2019/06/17 Python
python处理自动化任务之同时批量修改word里面的内容的方法
2019/08/23 Python
找Python安装目录,设置环境路径以及在命令行运行python脚本实例
2020/03/09 Python
Python实现手绘图效果实例分享
2020/07/22 Python
matplotlib图例legend语法及设置的方法
2020/07/28 Python
Fossil美国官网:Fossil手表、手袋、珠宝及配件
2017/02/01 全球购物
C#面试题问题集
2016/04/02 面试题
学生党支部先进事迹
2014/02/04 职场文书
《中国的气候》教学反思
2014/02/23 职场文书
党的群众路线教育实践方案
2014/05/11 职场文书
广场舞大赛策划方案
2014/05/31 职场文书
2015年平安创建工作总结
2015/04/29 职场文书
2016年教师党员创先争优承诺书
2016/03/24 职场文书