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手册及PHP编程标准
Dec 17 PHP
提高define性能的php扩展hidef的安装和使用
Jun 14 PHP
强烈声明: 不要使用(include/require)_once
Jun 06 PHP
PHP APC的安装与使用详解
Jun 13 PHP
PHP date()函数警告: It is not safe to rely on the system解决方法
Aug 20 PHP
PHP正则表达式之捕获组与非捕获组
Nov 06 PHP
PHP常用排序算法实例小结【基本排序,冒泡排序,快速排序,插入排序】
Feb 07 PHP
php数组指针操作详解
Feb 14 PHP
php读取本地json文件的实例
Mar 07 PHP
Smarty模板配置实例简析
Jul 20 PHP
PHP+Apache实现二级域名之间共享cookie的方法
Jul 24 PHP
Laravel登录失败次数限制的实现方法
Aug 26 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 大数据量及海量数据处理算法总结
2011/05/07 PHP
php中对2个数组相加的函数
2011/06/24 PHP
逆序二维数组插入一元素的php代码
2012/06/08 PHP
php获取从百度搜索进入网站的关键词的详细代码
2014/01/08 PHP
php中调用其他系统http接口的方法说明
2014/02/28 PHP
php生成随机数的三种方法
2014/09/10 PHP
php基于mcrypt的加密解密实例
2014/10/27 PHP
Laravel中Facade的加载过程与原理详解
2017/09/22 PHP
ExtJS 2.0实用简明教程 之Ext类库简介
2009/04/29 Javascript
javascript转换字符串为dom对象(字符串动态创建dom)
2010/05/10 Javascript
40款非常棒的jQuery 插件和制作教程(系列一)
2011/10/26 Javascript
JavaScript DOM 编程艺术(第2版)读书笔记(JavaScript的最佳实践)
2013/10/01 Javascript
AngularJS中的过滤器filter用法完全解析
2016/04/22 Javascript
jQuery 选择同时包含两个class的元素的实现方法
2016/06/01 Javascript
jQuery之动画ajax事件(实例讲解)
2017/07/18 jQuery
jQuery响应滚动条事件功能示例
2017/10/14 jQuery
微信小程序tabBar模板用法实例分析【附demo源码下载】
2017/11/28 Javascript
解决vue 表格table列求和的问题
2019/11/06 Javascript
js实现旋转木马轮播图效果
2020/01/10 Javascript
vue实现表单未编辑或未保存离开弹窗提示功能
2020/04/08 Javascript
python语音识别实践之百度语音API
2018/08/30 Python
解决python 无法加载downsample模型的问题
2018/10/25 Python
在Python中使用defaultdict初始化字典以及应用方法
2018/10/31 Python
PyCharm更改字体和界面样式的方法步骤
2019/09/27 Python
python与mysql数据库交互的实现
2020/01/06 Python
15行Python代码实现免费发送手机短信推送消息功能
2020/02/27 Python
使用Tensorflow-GPU禁用GPU设置(CPU与GPU速度对比)
2020/06/30 Python
浅析Python 责任链设计模式
2020/09/11 Python
澳大利亚购买健身器材网站:Gym Direct
2019/12/19 全球购物
大专生自我评价
2014/01/28 职场文书
会计核算科岗位职责
2014/03/19 职场文书
保护环境建议书400字
2014/05/13 职场文书
采购员岗位职责范本
2015/04/07 职场文书
合理缓解职场压力,让你随时保持最佳状态!
2019/06/21 职场文书
MySQL 不等于的三种使用及区别
2021/06/03 MySQL
学习nginx基础知识
2021/09/04 Servers