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图片验证码制作实现分享(全)
May 10 PHP
php实现用于计算执行时间的类实例
Apr 18 PHP
PHP获取当前相对于域名目录的方法
Jun 26 PHP
php邮件发送的两种方式
Apr 28 PHP
学习php设计模式 php实现策略模式(strategy)
Dec 07 PHP
PHP编写RESTful接口
Feb 23 PHP
PHP getallheaders无法获取自定义头(headers)的问题
Mar 23 PHP
php微信公众号开发(4)php实现自定义关键字回复
Dec 15 PHP
PHP实现接收二进制流转换成图片的方法
Jan 10 PHP
PHP实现函数内修改外部变量值的方法示例
Dec 28 PHP
PDO::quote讲解
Jan 29 PHP
PHP基于ip2long实现IP转换整形
Dec 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木马webshell扫描器代码
2012/01/25 PHP
自定义session存储机制避免会话保持问题
2014/10/08 PHP
php以post形式发送xml的方法
2014/11/04 PHP
php resizeimage 部分jpg文件 生成缩略图失败的原因分析及解决办法
2016/03/23 PHP
CodeIgniter分页类pagination使用方法示例
2016/03/28 PHP
Thinkphp5.0自动生成模块及目录的方法详解
2017/04/17 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
2017/11/14 PHP
postman的安装与使用方法(模拟Get和Post请求)
2018/08/06 PHP
JavaScript 常见对象类创建代码与优缺点分析
2009/12/07 Javascript
JS模拟面向对象全解(二、类型与赋值)
2011/07/13 Javascript
JQuery.Ajax之错误调试帮助信息介绍
2013/07/04 Javascript
JS实现模仿微博发布效果实例代码
2013/12/16 Javascript
js上传图片及预览功能实例分析
2015/04/24 Javascript
禁用backspace网页回退功能的实现代码
2016/11/15 Javascript
JS绘制微信小程序画布时钟
2016/12/24 Javascript
js实现横向拖拽导航条功能
2017/02/17 Javascript
利用Three.js如何实现阴影效果实例代码
2017/09/26 Javascript
JS实现带阴历的日历功能详解
2019/01/24 Javascript
Vue项目中使用jquery的简单方法
2019/05/16 jQuery
微信小程序实现按字母排列选择城市功能
2019/11/25 Javascript
在vue中动态修改css其中一个属性值操作
2020/12/07 Vue.js
[03:03]DOTA2校园争霸赛 济南城市决赛欢乐发奖活动
2013/10/21 DOTA
Python实现图片尺寸缩放脚本
2018/03/10 Python
详解Django+Uwsgi+Nginx的生产环境部署
2018/06/25 Python
使用Python pip怎么升级pip
2020/08/11 Python
天猫国际进口超市直营:官方直采,一站购齐
2017/12/11 全球购物
递归实现回文判断(如:abcdedbca就是回文,判断一个面试者对递归理解的简单程序)
2013/04/28 面试题
升职自荐书范文
2013/11/28 职场文书
幼儿园教师演讲稿
2014/05/06 职场文书
校园绿化美化方案
2014/06/08 职场文书
应届生面试求职信
2014/07/02 职场文书
乡镇三严三实学习心得体会
2014/10/13 职场文书
教师培训学习心得体会
2016/01/21 职场文书
世界各国短波电台对东亚播送时间频率表(SW)
2021/06/28 无线电
SQL基础的查询语句
2021/11/11 MySQL
springboot用户数据修改的详细实现
2022/04/06 Java/Android