PHP rsa加密解密算法原理解析


Posted in PHP onDecember 09, 2020

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数组函数序列之krsort()- 对数组的元素键名进行降序排序,保持索引关系
Nov 02 PHP
学习使用curl采集curl使用方法
Jan 11 PHP
PHP5中Cookie与 Session使用详解
Apr 30 PHP
php判断类是否存在函数class_exists用法分析
Nov 14 PHP
WampServer下安装多个版本的PHP、mysql、apache图文教程
Jan 07 PHP
php控制文件下载速度的方法
Mar 24 PHP
PHP的Yii框架的常用日志操作总结
Dec 08 PHP
Symfony2安装的方法(2种方法)
Feb 04 PHP
PHP 二维关联数组根据其中一个字段排序(推荐)
Apr 04 PHP
PHP设计模式(七)组合模式Composite实例详解【结构型】
May 02 PHP
PHP接入支付宝接口失效流程详解
Nov 10 PHP
PHP中的输出echo、print、printf、sprintf、print_r和var_dump的示例代码
Dec 01 PHP
PHP如何解决微信文章图片防盗链
Dec 09 #PHP
PHP sdk文档处理常用代码示例解析
Dec 09 #PHP
PHP sdk实现在线打包代码示例
Dec 09 #PHP
基于PHP实现生成随机水印图片
Dec 09 #PHP
PHP实现腾讯短网址生成api接口实例
Dec 08 #PHP
win10下 php安装seaslog扩展的详细步骤
Dec 04 #PHP
深入理解PHP+Mysql分布式事务与解决方案
Dec 03 #PHP
You might like
用PHP生成自己的LOG文件
2006/10/09 PHP
5款JavaScript代码压缩工具推荐
2014/07/07 Javascript
JavaScript获取当前网页标题(title)的方法
2015/04/03 Javascript
JavaScript实现拖拽网页内元素的方法
2015/04/15 Javascript
jQuery实现对象转为url参数的方法
2017/01/11 Javascript
jQuery模拟窗口抖动效果
2017/03/15 Javascript
JQuery实现图片轮播效果
2017/05/08 jQuery
ES6入门教程之let和const命令详解
2017/05/17 Javascript
JS基于正则实现数字千分位用逗号分隔的方法
2017/06/16 Javascript
微信小程序登录session的使用
2019/03/17 Javascript
对node通过fs模块判断文件是否是文件夹的实例讲解
2019/06/10 Javascript
layui 表格操作列按钮动态显示的实现方法
2019/09/06 Javascript
vue表单中遍历表单操作按钮的显示隐藏示例
2019/10/30 Javascript
js实现数据导出为EXCEL(支持大量数据导出)
2020/03/31 Javascript
Tensorflow的可视化工具Tensorboard的初步使用详解
2018/02/11 Python
使用sklearn进行对数据标准化、归一化以及将数据还原的方法
2018/07/11 Python
利用pyuic5将ui文件转换为py文件的方法
2019/06/19 Python
基于Python中的yield表达式介绍
2019/11/19 Python
Pytorch自己加载单通道图片用作数据集训练的实例
2020/01/18 Python
Python函数默认参数常见问题及解决方案
2020/03/26 Python
解决jupyter notebook打不开无反应 浏览器未启动的问题
2020/04/10 Python
Python django框架 web端视频加密的实例详解
2020/11/20 Python
阿姆斯特丹城市卡:Amsterdam Pass
2019/12/01 全球购物
Traffic People官网:女式花裙、上衣和连身裤
2020/10/12 全球购物
环保倡议书400字
2014/05/15 职场文书
历史学专业求职信
2014/06/19 职场文书
我是一名护士演讲稿
2014/08/28 职场文书
大学本科生职业生涯规划书范文
2014/09/14 职场文书
副乡长民主生活会个人对照检查材料思想汇报
2014/10/01 职场文书
2014教师年度工作总结
2014/11/10 职场文书
北京英语导游词
2015/02/12 职场文书
金正昆讲礼仪观后感
2015/06/11 职场文书
幼儿园小班开学寄语(2016秋季)
2015/12/03 职场文书
CSS极坐标的实例代码
2021/06/03 HTML / CSS
golang实现一个简单的websocket聊天室功能
2021/10/05 Golang
Java实现贪吃蛇游戏的示例代码
2022/09/23 Java/Android