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 相关文章推荐
在线增减.htpasswd内的用户
Oct 09 PHP
PHP 字符串分割和比较
Oct 06 PHP
php empty,isset,is_null判断比较(差异与异同)
Oct 19 PHP
浅谈php扩展imagick
Jun 02 PHP
PHP的fsockopen、pfsockopen函数被主机商禁用的解决办法
Jul 08 PHP
ThinkPHP实例化模型的四种方法概述
Aug 22 PHP
Yii2使用dropdownlist实现地区三级联动功能的方法
Jul 18 PHP
记录一次排查PHP脚本执行卡住的问题
Dec 27 PHP
PHP基于DOM创建xml文档的方法示例
Feb 08 PHP
PHP大文件分割上传 PHP分片上传
Aug 28 PHP
Laravel学习教程之model validation的使用示例
Oct 23 PHP
PHP中echo与print区别点整理
Mar 09 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 magic_quotes_gpc的一点认识与分析
2008/08/18 PHP
php使HTML标签自动补全闭合函数代码
2012/10/04 PHP
PHP中shuffle数组值随便排序函数用法
2014/11/21 PHP
PHP计算指定日期所在周的开始和结束日期的方法
2015/03/24 PHP
PHP随机生成唯一HASH值自定义函数
2015/04/20 PHP
PHP 对象接口简单实现方法示例
2020/04/13 PHP
javascript attachEvent和addEventListener使用方法
2009/03/19 Javascript
一些常用的JavaScript函数(json)附详细说明
2011/05/25 Javascript
javascript 实现字符串反转的三种方法
2013/11/23 Javascript
js浏览器本地存储store.js介绍及应用
2014/05/13 Javascript
JS显示下拉列表框内全部元素的方法
2015/03/31 Javascript
浅谈javascript获取元素transform参数
2015/07/24 Javascript
javascript中类的定义方式详解(四种方式)
2015/12/22 Javascript
jQuery 如何给Carousel插件添加新的功能
2016/04/18 Javascript
ECHO.js 纯javascript轻量级延迟加载的实例代码
2016/05/24 Javascript
NodeJs的优势和适合开发的程序
2016/08/14 NodeJs
AngularJS入门教程之与服务器(Ajax)交互操作示例【附完整demo源码下载】
2016/11/02 Javascript
基于vue的短信验证码倒计时demo
2017/09/13 Javascript
Node.js搭建WEB服务器的示例代码
2018/08/15 Javascript
vue实现的请求服务器端API接口示例
2019/05/25 Javascript
DatePickerDialog 自定义样式及使用全解
2019/07/09 Javascript
微信小程序基于movable-view实现滑动删除效果
2020/01/08 Javascript
ng-alain的sf如何自定义部件的流程
2020/06/12 Javascript
Python2.7简单连接与操作MySQL的方法
2016/04/27 Python
解析Python中的生成器及其与迭代器的差异
2016/06/20 Python
基于Python数据可视化利器Matplotlib,绘图入门篇,Pyplot详解
2017/10/13 Python
对Python中range()函数和list的比较
2018/04/19 Python
利用python如何处理nc数据详解
2018/05/23 Python
Python多线程threading模块用法实例分析
2019/05/22 Python
TensorFlow 读取CSV数据的实例
2020/02/05 Python
关于Java String的一道面试题
2013/09/29 面试题
机电工程学生自荐信范文
2013/12/07 职场文书
2014年销售工作总结与计划
2014/12/01 职场文书
银行保安拾金不昧表扬稿
2015/05/05 职场文书
2015年度内部审计工作总结
2015/05/20 职场文书
草系十大最强宝可梦,纸片人上榜,榜首大家最熟悉
2022/03/18 日漫