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中调用JAVA
Oct 09 PHP
初步介绍PHP扩展开发经验分享
Sep 06 PHP
zend optimizer在wamp的基础上安装图文教程
Oct 26 PHP
is_uploaded_file函数引发的不能上传文件问题
Oct 29 PHP
PHP定时任务延缓执行的实现
Oct 08 PHP
php json转换成数组形式代码分享
Nov 10 PHP
php利用scws实现mysql全文搜索功能的方法
Dec 25 PHP
smarty自定义函数用法示例
May 20 PHP
Yii2中SqlDataProvider用法示例
Sep 22 PHP
PHP页面跳转实现延时跳转的方法
Dec 10 PHP
php实现自定义中奖项数和概率的抽奖函数示例
May 26 PHP
php变量与字符串的增删改查操作示例
May 07 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
PHP4之真OO
2006/10/09 PHP
非常好的php目录导航文件代码
2006/10/09 PHP
PHP mkdir()定义和用法
2009/01/14 PHP
PHP 计算代码执行耗时的代码修正网上普遍错误
2011/05/14 PHP
php版阿里云OSS图片上传类详解
2016/12/01 PHP
php使用yield对性能提升的测试实例分析
2019/09/19 PHP
PHP实现获取文件mime类型多种方法解析
2020/05/28 PHP
js操作二级联动实现代码
2010/07/27 Javascript
表单JS弹出填写提示效果代码
2011/04/16 Javascript
js 实现在离开页面时提醒未保存的信息(减少用户重复操作)
2013/01/16 Javascript
多个datatable共存造成多个表格的checkbox都被选中
2013/07/11 Javascript
js实现字符串转日期格式的方法
2015/05/20 Javascript
javascript实现判断鼠标的状态
2015/07/10 Javascript
jQuery下拉美化搜索表单效果代码分享
2015/08/25 Javascript
一个超简单的jQuery回调函数例子(分享)
2016/08/08 Javascript
[原创]JavaScript语法高亮插件highlight.js用法详解【附highlight.js本站下载】
2016/11/01 Javascript
bootstrap table实现单击单元格可编辑功能
2017/03/28 Javascript
Vue项目中quill-editor带样式编辑器的使用方法
2017/08/08 Javascript
React-native桥接Android原生开发详解
2018/01/17 Javascript
JavaScript调用模式与this关键字绑定的关系
2018/04/21 Javascript
微信小程序中转义字符的处理方法
2019/03/28 Javascript
vue+Element实现搜索关键字高亮功能
2019/05/28 Javascript
vue-cli配置flexible过程详解
2019/07/04 Javascript
layui 富文本图片上传接口与普通按钮 文件上传接口的例子
2019/09/23 Javascript
jQuery实现提交表单时不提交隐藏div中input的方法
2019/10/08 jQuery
Vue 实现简易多行滚动&quot;弹幕&quot;效果
2020/01/02 Javascript
在python tkinter中Canvas实现进度条显示的方法
2019/06/14 Python
CSS3教程(10):CSS3 HSL声明设置颜色
2009/04/02 HTML / CSS
瑞典灯具和照明网上商店:Lamp24.se
2018/03/17 全球购物
Holiday Inn中国官网:IHG旗下假日酒店预订
2018/04/08 全球购物
美国领先的个性化礼品商城:Personalization Mall
2019/07/27 全球购物
城市轨道交通工程职业规划书范文
2014/01/18 职场文书
《威尼斯的小艇》教学反思
2014/02/17 职场文书
感恩寄语大全
2014/04/11 职场文书
2015年十一国庆节演讲稿
2015/03/20 职场文书
客户付款通知书
2015/04/23 职场文书