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 相关文章推荐
php5 and xml示例
Nov 22 PHP
理解php原理的opcodes(操作码)
Oct 26 PHP
PHP-Fcgi下PHP的执行时间设置方法
Aug 02 PHP
php实现建立多层级目录的方法
Jul 19 PHP
php数组添加元素方法小结
Dec 20 PHP
php实现可运算的验证码
Nov 10 PHP
SAE实时日志接口SDK用法示例
Oct 09 PHP
PHP+mysql+ajax轻量级聊天室实现方法详解
Oct 17 PHP
PHP基于Redis消息队列实现发布微博的方法
May 03 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
Sep 17 PHP
详解php中生成标准uuid(guid)的方法
Apr 28 PHP
php+websocket 实现的聊天室功能详解
May 27 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 批量删除 sql语句
2009/06/05 PHP
Laravel中扩展Memcached缓存驱动实现使用阿里云OCS缓存
2015/02/10 PHP
php编写的抽奖程序中奖概率算法
2015/05/14 PHP
CI框架中$this-&gt;load-&gt;library()用法分析
2016/05/18 PHP
PHP 数组基本操作小结(推荐)
2016/06/13 PHP
PHP 扩展Memcached命令用法实例总结
2020/06/04 PHP
网页常用特效代码整理
2006/06/23 Javascript
JavaScript模板入门介绍
2012/09/26 Javascript
javascript实现焦点滚动图效果 具体方法
2013/06/24 Javascript
jquery mobile实现拨打电话功能的几种方法
2013/08/05 Javascript
node.js中的fs.lchmod方法使用说明
2014/12/16 Javascript
初识Node.js
2015/03/20 Javascript
基于jQuery实现一个marquee无缝滚动的插件
2017/03/09 Javascript
浅谈react 同构之样式直出
2017/11/07 Javascript
node.js的Express服务器基本使用教程
2019/01/09 Javascript
js+html实现点名系统功能
2019/11/05 Javascript
PHP读取远程txt文档到数组并实现遍历
2020/08/25 Javascript
Python生成指定数量的优惠码实操内容
2019/06/18 Python
matplotlib自定义鼠标光标坐标格式的实现
2021/01/08 Python
浅谈cookie和localStorage那些事
2019/08/27 HTML / CSS
AmazeUI 网格的实现示例
2020/08/13 HTML / CSS
法国综合购物网站:RueDuCommerce
2016/09/12 全球购物
新锐科技Java程序员面试题
2016/07/25 面试题
什么是ESB?请介绍一下ESB?
2015/05/27 面试题
详解如何解决使用JSON.stringify时遇到的循环引用问题
2021/03/23 Javascript
学院领导推荐信
2013/10/30 职场文书
应用数学自荐书范文
2013/11/24 职场文书
2014婚礼司仪主持词
2014/03/14 职场文书
党的群众路线教育实践活动动员会主持词
2014/03/20 职场文书
服装设计师求职信
2014/06/04 职场文书
在职证明书范本(2014新版)
2014/09/25 职场文书
2014年音乐教师工作总结
2014/12/03 职场文书
2015新学期家长寄语
2015/02/26 职场文书
高三教师工作总结2015
2015/07/21 职场文书
Nginx服务器如何设置url链接
2021/03/31 Servers
uniapp引入支付宝原生扫码插件步骤详解
2022/07/23 Javascript