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 相关文章推荐
不用数据库的多用户文件自由上传投票系统(1)
Oct 09 PHP
php mysql数据库操作类
Jun 04 PHP
php xml文件操作实现代码(二)
Mar 20 PHP
PHP5 面向对象(学习记录)
Dec 02 PHP
PHP gbk环境下json_dencode传送来的汉字
Nov 13 PHP
php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
Sep 28 PHP
php中利用explode函数分割字符串到数组
Feb 08 PHP
php操作xml入门之xml基本介绍及xml标签元素
Jan 23 PHP
php实现兼容2038年后Unix时间戳转换函数
Mar 18 PHP
PHP环境搭建(php+Apache+mysql)
Nov 14 PHP
thinkphp5 加载静态资源路径与常量的方法
Dec 24 PHP
Ajax+Jpgraph实现的动态折线图功能示例
Feb 11 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字符串按照单词进行反转的方法
2015/03/14 PHP
PHP中trait使用方法详细介绍
2017/05/21 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
thinkPHP框架实现多表查询的方法
2018/06/14 PHP
在Laravel的Model层做数据缓存的实现
2019/09/26 PHP
Jquery截取中文字符串的实现代码
2010/12/22 Javascript
浅谈JavaScript字符集
2014/05/22 Javascript
jQuery和AngularJS的区别浅析
2015/01/29 Javascript
JS实现跟随鼠标闪烁转动色块的方法
2015/02/26 Javascript
JavaScript中setter和getter方法介绍
2016/07/11 Javascript
百度多文件异步上传控件webuploader基本用法解析
2016/11/07 Javascript
Angular工具方法学习
2016/12/26 Javascript
浅谈Javascript事件对象
2017/02/05 Javascript
利用yarn代替npm管理前端项目模块依赖的方法详解
2017/09/04 Javascript
Angular搜索场景中使用rxjs的操作符处理思路
2018/05/30 Javascript
react-native使用leanclound消息推送的方法
2018/08/06 Javascript
Ant Design Pro 下实现文件下载的实现代码
2019/12/03 Javascript
9种方法优化jQuery代码详解
2020/02/04 jQuery
Python处理字符串之isspace()方法的使用
2015/05/19 Python
Python之批量创建文件的实例讲解
2018/05/10 Python
PYTHON如何读取和写入EXCEL里面的数据
2019/10/28 Python
超级实用的8个Python列表技巧
2020/08/24 Python
利用css3 translate完美实现表头固定效果
2017/02/28 HTML / CSS
HTML5调用手机发短信和打电话功能
2020/04/29 HTML / CSS
Interhome丹麦:在线预订度假屋和公寓
2019/07/18 全球购物
师范毕业生自荐信
2013/10/17 职场文书
幼儿园教师国培感言
2014/02/02 职场文书
勾股定理课后反思
2014/04/26 职场文书
班级课外活动总结
2014/07/09 职场文书
写给老婆的保证书
2015/02/27 职场文书
毕业论文答辩开场白
2015/05/27 职场文书
入党积极分子半年考察意见
2015/06/02 职场文书
妇产科护理心得体会
2016/01/22 职场文书
Go语言使用select{}阻塞main函数介绍
2021/04/25 Golang
安装pytorch时报sslerror错误的解决方案
2021/05/17 Python
详解python的异常捕获
2022/03/03 Python