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 相关文章推荐
ftp类(myftp.php)
Oct 09 PHP
一个数据采集类
Feb 14 PHP
PHP入门学习笔记之一
Oct 12 PHP
destoon找回管理员密码的方法
Jun 21 PHP
使用PHPMailer实现邮件发送代码分享
Oct 23 PHP
php从完整文件路径中分离文件目录和文件名的方法
Mar 13 PHP
wampserver改变默认网站目录的办法
Aug 05 PHP
php实现scws中文分词搜索的方法
Dec 25 PHP
YII动态模型(动态表名)支持分析
Mar 29 PHP
Zend Framework入门教程之Zend_Mail用法示例
Dec 08 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
Feb 07 PHP
PHP实现微信红包金额拆分试玩的算法示例
Apr 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
php的大小写敏感问题整理
2011/12/29 PHP
PHP字符串的递增和递减示例介绍
2014/02/11 PHP
destoon首页调用求购供应信息的地区名称的方法
2014/08/21 PHP
php实现对两个数组进行减法操作的方法
2015/04/17 PHP
PHP7 新增常量
2021/03/09 PHP
js left,right,mid函数
2008/06/10 Javascript
js 表格隔行颜色
2009/12/02 Javascript
jQuery 美元符冲突的解决方法
2010/03/28 Javascript
超简单的jquery的AJAX用法
2010/05/10 Javascript
JS高级拖动技术 setCapture,releaseCapture
2011/07/31 Javascript
JQuery表单验证插件EasyValidator用法分析
2014/11/15 Javascript
jQuery实现给页面换肤的方法
2015/05/30 Javascript
jQuery ajax时间差导致的变量赋值问题分析
2016/01/22 Javascript
jQuery表单事件实例代码分享
2016/08/18 Javascript
详解AngularJs中$resource和restfu服务端数据交互
2016/09/21 Javascript
移动端点击态处理的三种实现方式
2017/01/12 Javascript
js实现城市级联菜单的2种方法
2017/06/23 Javascript
前端主流框架vue学习笔记第二篇
2017/07/26 Javascript
vue基于element的区间选择组件
2018/09/07 Javascript
JS数组方法slice()用法实例分析
2020/01/18 Javascript
原生js实现滑块区间组件
2021/01/20 Javascript
新手该如何学python怎么学好python?
2008/10/07 Python
用实例说明python的*args和**kwargs用法
2013/11/01 Python
python实现中文输出的两种方法
2015/05/09 Python
Numpy数组的保存与读取方法
2018/04/04 Python
如何分离django中的媒体、静态文件和网页
2019/11/12 Python
django框架cookie和session用法实例详解
2019/12/10 Python
Django关于admin的使用技巧和知识点
2020/02/10 Python
伊利莎白雅顿官网:Elizabeth Arden
2016/10/10 全球购物
碧欧泉Biotherm加拿大官方网站:法国高端护肤品牌
2019/10/18 全球购物
大学生党课思想汇报
2013/12/29 职场文书
教育英语专业毕业生的求职信
2014/03/13 职场文书
销售总经理岗位职责
2014/03/15 职场文书
公务员年度考核评语
2014/12/31 职场文书
蓬莱阁导游词
2015/02/04 职场文书
简单的辞职信范文(2016最新版)
2015/05/12 职场文书