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 相关文章推荐
一个从别的网站抓取信息的例子(域名查询)
Oct 09 PHP
PHP $_FILES函数详解
Mar 09 PHP
使用php+apc实现上传进度条且在IE7下不显示的问题解决方法
Apr 25 PHP
php环境下利用session防止页面重复刷新的具体实现
Jan 09 PHP
php获取文章上一页与下一页的方法
Dec 01 PHP
PHP实现对png图像进行缩放的方法(支持透明背景)
Jul 15 PHP
PHP7新增运算符用法实例分析
Sep 26 PHP
深入解析PHP中SESSION反序列化机制
Mar 01 PHP
PHP基于ORM方式操作MySQL数据库实例
Jun 21 PHP
PHP运用foreach神奇的转换数组(实例讲解)
Feb 01 PHP
ThinkPHP框架实现的邮箱激活功能示例
Jun 15 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
Nov 19 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 数组入门教程小结
2009/05/20 PHP
thinkphp实现like模糊查询实例
2014/10/29 PHP
thinkphp的URL路由规则与配置实例
2014/11/26 PHP
Django 标签筛选的实现代码(一对多、多对多)
2018/09/05 PHP
javascript 强制刷新页面的实现代码
2009/12/13 Javascript
javascript 文章截取部分无损html显示实现代码
2010/05/04 Javascript
JavaScript高级程序设计阅读笔记(五) ECMAScript中的运算符(一)
2012/02/27 Javascript
用Jquery重写windows.alert方法实现思路
2013/04/03 Javascript
js校验表单后提交表单的三种方法总结
2014/02/28 Javascript
浅谈javascript的Array.prototype.slice.call
2015/08/31 Javascript
vue中用动态组件实现选项卡切换效果
2017/03/25 Javascript
Javascript 严格模式use strict详解
2017/09/16 Javascript
原生js实现仿window10系统日历效果的实例
2017/10/31 Javascript
js实现网页同时进行多个倒计时功能
2019/02/25 Javascript
vue实践---根据不同环境,自动转换请求的url地址操作
2020/09/21 Javascript
详解JavaScript 中的批处理和缓存
2020/11/19 Javascript
python从网络读取图片并直接进行处理的方法
2015/05/22 Python
Python的Django框架中URLconf相关的一些技巧整理
2015/07/18 Python
利用Python的Django框架生成PDF文件的教程
2015/07/22 Python
教你用Type Hint提高Python程序开发效率
2016/08/08 Python
利用python获取Ping结果示例代码
2017/07/06 Python
Python2和Python3.6环境解决共存问题
2018/11/09 Python
浅谈pycharm下找不到sqlalchemy的问题
2018/12/03 Python
基于Python的PIL库学习详解
2019/05/10 Python
Pandas实现dataframe和np.array的相互转换
2019/11/30 Python
简单了解python元组tuple相关原理
2019/12/02 Python
python 使用递归回溯完美解决八皇后的问题
2020/02/26 Python
Python IDE环境之 新版Pycharm安装详细教程
2020/03/05 Python
Python可以用来做什么
2020/11/23 Python
Python 排序最长英文单词链(列表中前一个单词末字母是下一个单词的首字母)
2020/12/14 Python
python 日志模块logging的使用场景及示例
2021/01/04 Python
html5 div布局与table布局详解
2016/11/16 HTML / CSS
碧欧泉Biotherm加拿大官方网站:法国高端护肤品牌
2019/10/18 全球购物
大学生上课迟到检讨书
2014/10/15 职场文书
JavaScript实现复选框全选功能
2021/04/11 Javascript
VMware虚拟机安装 Windows Server 2022的详细图文教程
2022/09/23 Servers