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安全配置
Dec 06 PHP
PHP的分页功能
Mar 21 PHP
php通用防注入程序 推荐
Feb 26 PHP
php将图片保存入mysql数据库失败的解决方法
Dec 27 PHP
php生成唯一的订单函数分享
Feb 02 PHP
php实现读取和写入tab分割的文件
Jun 01 PHP
WordPress中缩略图的使用以及相关技巧
Nov 24 PHP
PHP设计模式之观察者模式实例
Feb 22 PHP
PHP 生成微信红包代码简单
Mar 25 PHP
PHP实现的文件操作类及文件下载功能示例
Dec 24 PHP
PHP Laravel 上传图片、文件等类封装
Aug 16 PHP
php封装单文件上传到数据库(路径)
Oct 15 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
input file获得文件根目录简单实现
2013/04/26 PHP
实现在同一方法中获取当前方法中新赋值的session值解决方法
2014/06/26 PHP
浅析PHP程序设计中的MVC编程思想
2014/07/28 PHP
Extjs Ext.MessageBox.confirm 确认对话框详解
2010/04/02 Javascript
Js 时间间隔计算的函数(间隔天数)
2011/11/15 Javascript
关于图片的预加载过程中隐藏未知的
2012/12/19 Javascript
script不刷新页面的联动前后代码
2013/09/18 Javascript
了解了这些才能开始发挥jQuery的威力
2013/10/10 Javascript
JavaScript实现检查页面上的广告是否被AdBlock屏蔽了的方法
2014/11/03 Javascript
常常会用到的截取字符串substr()、substring()、slice()方法详解
2015/12/16 Javascript
jQuery表格插件datatables用法详解
2020/11/23 Javascript
js数组常用操作方法小结(增加,删除,合并,分割等)
2016/08/02 Javascript
使用vue制作FullPage页面滚动效果
2017/08/21 Javascript
vue实现长图垂直居上 vue实现短图垂直居中
2017/10/18 Javascript
浅谈vue的几种绑定变量的值 防止其改变的方法
2018/03/01 Javascript
JavaScript函数apply()和call()用法与异同分析
2018/08/10 Javascript
vue项目中使用eslint+prettier规范与检查代码的方法
2020/01/16 Javascript
D3.js 实现带伸缩时间轴拓扑图的示例代码
2020/01/20 Javascript
记一次用ts+vuecli4重构项目的实现
2020/05/21 Javascript
python中的代码编码格式转换问题
2015/06/10 Python
python如何实现excel数据添加到mongodb
2015/07/30 Python
python3实现名片管理系统
2020/11/29 Python
24式加速你的Python(小结)
2019/06/13 Python
Python获取一个用户名的组ID过程解析
2019/09/03 Python
Python中join()函数多种操作代码实例
2020/01/13 Python
tensorflow 环境变量设置方式
2020/02/06 Python
如何基于python把文字图片写入word文档
2020/07/31 Python
HTML5的Geolocation地理位置定位API使用教程
2016/05/12 HTML / CSS
Canvas与图片压缩的示例代码
2017/11/28 HTML / CSS
美国最大的户外装备和服装购物网站:Backcountry
2019/10/15 全球购物
质量承诺书范文
2014/03/27 职场文书
小学校园广播稿(3篇)
2014/09/19 职场文书
2015军训通讯稿大全
2015/07/18 职场文书
办公室管理规章制度
2015/08/04 职场文书
给校长的建议书作文500字
2015/09/14 职场文书
Nginx+Windows搭建域名访问环境的操作方法
2022/03/17 Servers