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面向对象全攻略 (五) 封装性
Sep 30 PHP
PHP 创建文件(文件夹)以及目录操作代码
Mar 04 PHP
PHP中获取变量的变量名的一段代码的bug分析
Jul 07 PHP
用php实现百度网盘图片直链的代码分享
Nov 01 PHP
php出现web系统多域名登录失败的解决方法
Sep 30 PHP
ThinkPHP结合AjaxFileUploader实现无刷新文件上传的方法
Oct 29 PHP
php异常处理方法实例汇总
Jun 24 PHP
php连接oracle数据库的核心步骤
May 26 PHP
基于Swoole实现PHP与websocket聊天室
Aug 03 PHP
PHP 7安装使用体验之性能大提升,兼容性强,扩展支持不够(升级PHP要谨慎)
Jul 27 PHP
PHP基于Closure类创建匿名函数的方法详解
Aug 17 PHP
tp5.1 实现setInc字段自动加1
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
教你如何把一篇文章按要求分段
2006/10/09 PHP
PHP伪造referer实例代码
2008/09/20 PHP
解析左右值无限分类的实现算法
2013/06/20 PHP
Thinkphp搭建包括JS多语言的多语言项目实现方法
2014/11/24 PHP
php ajax异步读取rss文档数据
2016/03/29 PHP
PHP 将数组打乱 shuffle函数的用法及简单实例
2016/06/17 PHP
PHP创建多级目录的两种方法
2016/10/28 PHP
Javascript代码混淆综合解决方案-Javascript在线混淆器
2006/12/18 Javascript
探讨js字符串数组拼接的性能问题
2014/10/11 Javascript
jQuery实现鼠标划过展示大图的方法
2015/03/09 Javascript
jquery获取及设置outerhtml的方法
2015/03/09 Javascript
js实现的奥运倒计时时钟效果代码
2015/12/09 Javascript
jQuery实现的文字hover颜色渐变效果实例
2016/02/20 Javascript
Bootstrap table的使用方法
2016/11/02 Javascript
几种tab切换详解
2017/02/03 Javascript
详解如何为你的angular app构建一个第三方库
2018/12/07 Javascript
简单了解JavaScript异步
2019/05/23 Javascript
Python编程实现使用线性回归预测数据
2017/12/07 Python
Python实现随机生成手机号及正则验证手机号的方法
2018/04/25 Python
python http基本验证方法
2018/12/26 Python
Python3爬虫之urllib携带cookie爬取网页的方法
2018/12/28 Python
Python3实现计算两个数组的交集算法示例
2019/04/03 Python
利用Python库Scapy解析pcap文件的方法
2019/07/23 Python
关于python导入模块import与常见的模块详解
2019/08/28 Python
pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解
2020/01/02 Python
可视化pytorch 模型中不同BN层的running mean曲线实例
2020/06/24 Python
python中reload重载实例用法
2020/12/15 Python
使用CSS3的ruby-position固定注音位置的用法示例
2016/07/05 HTML / CSS
详解CSS3弹性伸缩盒
2020/09/21 HTML / CSS
新西兰第一的行李箱网站:luggage.co.nz
2019/07/22 全球购物
大四学年自我鉴定
2013/11/13 职场文书
教学实习自我评价
2014/01/28 职场文书
学习演讲稿范文
2014/05/10 职场文书
长征观后感
2015/06/09 职场文书
《索溪峪的野》教学反思
2016/02/19 职场文书
vue-cropper插件实现图片截取上传组件封装
2021/05/27 Vue.js