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 $_SERVER详解
Jan 16 PHP
PHP的范围解析操作符(::)的含义分析说明
Jul 03 PHP
PHP 中关于ord($str)&amp;gt;0x80的详细说明
Sep 23 PHP
解析左右值无限分类的实现算法
Jun 20 PHP
让CodeIgniter数据库缓存自动过期的处理的方法
Jun 12 PHP
Linux下手动编译安装PHP扩展的例子分享
Jul 15 PHP
php中error与exception的区别及应用
Jul 28 PHP
PHP中数据库单例模式的实现代码分享
Aug 21 PHP
php学习笔记之基础知识
Nov 08 PHP
php生成唯一的订单函数分享
Feb 02 PHP
PHP封装的完整分页类示例
Aug 21 PHP
PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】
Jun 14 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
wordpress之wp-settings.php
2007/08/17 PHP
php str_pad 函数用法简介
2009/07/11 PHP
php读取EXCEL文件 php excelreader读取excel文件
2012/12/06 PHP
PHP实现的简单分页类及用法示例
2016/05/06 PHP
jquery中dom操作和事件的实例学习-表单验证
2011/11/30 Javascript
chrome原生方法之数组
2011/11/30 Javascript
js字符串转成JSON
2013/11/07 Javascript
jQuery学习之DOM节点的插入方法总结
2017/01/22 Javascript
详解angular中通过$location获取路径(参数)的写法
2017/03/21 Javascript
jQuery复合事件结合toggle()方法的用法示例
2017/06/10 jQuery
基于mpvue的小程序项目搭建的步骤
2018/05/22 Javascript
javascript数组的定义及操作实例
2019/11/10 Javascript
浅析JS中NEW的实现原理及重写
2020/02/20 Javascript
微信小程序实现手指拖动选项排序
2020/04/22 Javascript
浅析vue cli3 封装Svgicon组件正确姿势(推荐)
2020/04/27 Javascript
Python新手实现2048小游戏
2015/03/31 Python
Windows下python2.7.8安装图文教程
2016/05/26 Python
Python中的日期时间处理详解
2016/11/17 Python
python中sys.argv函数精简概括
2018/07/08 Python
Python3使用TCP编写一个简易的文件下载器功能
2019/05/08 Python
python利用tkinter实现屏保
2019/07/30 Python
python批量处理txt文件的实例代码
2020/01/13 Python
Python 使用 environs 库定义环境变量的方法
2020/02/25 Python
Pytest单元测试框架如何实现参数化
2020/09/05 Python
Python Pivot table透视表使用方法解析
2020/09/11 Python
浅析图片上传及canvas压缩的流程
2020/06/10 HTML / CSS
英国翻新电子产品购物网站:Tech Trade
2017/12/25 全球购物
美国折扣地毯销售网站:Rugs.com
2020/03/27 全球购物
制药工程专业应届生求职信
2013/09/24 职场文书
大学生职业生涯规划范文——找准自我,定位人生
2014/01/23 职场文书
爱心活动计划书
2014/04/26 职场文书
庆祝教师节标语
2014/10/09 职场文书
法制工作总结2015
2015/07/23 职场文书
2016高考寄语集锦
2015/12/04 职场文书
基于Python实现射击小游戏的制作
2022/04/06 Python
使用Django框架创建项目
2022/06/10 Python