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的宝库目录--PEAR
Oct 09 PHP
PHP 缓存实现代码及详细注释
May 16 PHP
深入探讨<br />和 \r\n两者有什么区别??
Jun 05 PHP
PHP中使用Imagick操作PSD文件实例
Jan 26 PHP
Yii学习总结之数据访问对象 (DAO)
Feb 22 PHP
PHP文件读取功能的应用实例
May 08 PHP
PHP生成器简单实例
May 13 PHP
discuz图片顺序混乱解决方案
Jul 29 PHP
php微信开发之上传临时素材
Jun 24 PHP
php双层循环(九九乘法表)
Oct 23 PHP
PHP实现链表的定义与反转功能示例
Jun 09 PHP
php微信公众号开发之欢迎老朋友
Oct 20 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
php中去除所有js,html,css代码
2010/10/12 PHP
兼容ie6浏览器的php下载文件代码分享
2014/07/14 PHP
新浪SAE搭建PHP项目教程
2015/01/28 PHP
PHP函数func_num_args用法实例分析
2015/12/07 PHP
数组任意位置插入元素,删除特定元素的实例
2017/03/02 PHP
PHP实现无限极分类的两种方式示例【递归和引用方式】
2019/03/25 PHP
javascript之typeof、instanceof操作符使用探讨
2013/05/19 Javascript
js显示当前日期时间和星期几
2015/10/22 Javascript
正则表达式(语法篇推荐)
2016/06/24 Javascript
AngularJS指令详解及示例代码
2016/08/16 Javascript
js自制图片放大镜功能
2017/01/24 Javascript
基于JS实现翻书效果的页面切换样式
2017/02/16 Javascript
jQuery实现的弹幕效果完整实例
2017/09/06 jQuery
详解vue开发中调用微信jssdk的问题
2019/04/16 Javascript
微信小程序按顺序同步执行的两种方式
2019/12/20 Javascript
在Vue中使用Echarts实例图的方法实例
2020/10/10 Javascript
[01:39:42]Fnatic vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
对于Python异常处理慎用“except:pass”建议
2015/04/02 Python
使用70行Python代码实现一个递归下降解析器的教程
2015/04/17 Python
Python学习笔记之视频人脸检测识别实例教程
2019/03/06 Python
TensorFlow MNIST手写数据集的实现方法
2020/02/05 Python
Python socket连接中的粘包、精确传输问题实例分析
2020/03/24 Python
NYX Professional Makeup俄罗斯官网:世界知名的化妆品品牌
2019/12/26 全球购物
编写类String的构造函数、析构函数和赋值函数
2012/05/29 面试题
什么是规则表达式
2012/05/03 面试题
纺织工程专业个人求职信范文
2014/01/27 职场文书
模具专业毕业生自荐书范文
2014/02/19 职场文书
中文教师求职信
2014/02/22 职场文书
群众路线批评与自我批评发言稿
2014/10/16 职场文书
运动会闭幕式致辞
2015/07/29 职场文书
2019最新企业员工考勤管理制度(通用版)!
2019/07/02 职场文书
Python WSGI 规范简介
2021/04/11 Python
Dashboard管理Kubernetes集群与API访问配置
2022/04/01 Servers
SQL语句多表联合查询的方法示例
2022/04/18 MySQL
python中pd.cut()与pd.qcut()的对比及示例
2022/06/16 Python