php的RSA加密解密算法原理与用法分析
作者:dongxie548 发布时间:2023-07-13 11:27:14
本文实例讲述了php的RSA加密解密算法原理与用法。分享给大家供大家参考,具体如下:
最近因为工作的需要,要倒腾支付宝支付相关的知识,因为支付宝应用了RSA加密机制,个人对此并不了解,所以在这里写下一篇总结。
1、生成公钥和私钥
要应用RSA算法,必须先生成公钥和私钥,公钥和私钥的生成可以借助openssl工具。
本次测验是在windows下进行的,可以到以下的地址下载windows安装包:http://gnuwin32.sourceforge.net/packages/openssl.htm,安装过程不再赘述。
安装过后,进入到安装目录的bin目录下,执行如下命令:
openssl.exe // 进入OpenSSL程序
genrsa -out rsa_private_key.pem 1024 //生成私钥,执行成功后可以在当前目录下看到生成了rsa_private_key.pem文件
pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt //如果你使用的java,需要将私钥转换成PKCS8格式
rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem //生成公钥,执行成功后可以在当前目录下看到生成rsa_public_key.pem文件
公钥rsa_public_key.pem的内容:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDc5nSC6mHl9bmM6L8n7Sq1+Ft6
VF8LcU3jst8RIy7WqXXd5XZomc0cJLxVz3Vc0vgUKKJyP6q2ozDOCFgCp7Q9InFg
ngtNVLEJ1+Nm0+snUDbYbnrfW8wwSPG0jPQ73CgMxOdv+IGhir6mEITbdEh+ZsVc
GRd0OvKYIg+Itgk3/QIDAQAB
-----END PUBLIC KEY-----
私钥rsa_private_key.pem的内容:
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDD4KA0yU7EG7ZA32OAVDHlwXf9LYywXGn7Ma9LffnFL57cpYoQ
Wf0Oz8FE9/UnjFOeHs2XjDrhe+uqVtYX/9Vi/znJgP9D7hpTo2NJHM/AUykD+itl
cie2Tu+sjJQi0JFVcpc3D0ooTBhng35406CucRaOn/a52mxQnGtA4AmsSwIDAQAB
AoGAG25nwTy39SrUWT1vl9cyrbRsc15fp4sppG4O2Imp4v2KR+g+749KqzpZHKmF
AabbRveVXzXaQR2zoUVL8kx3u4hqY4M/S1AcOxNPIJKB703XxA1yf2Ta2CvLsWTm
tsDWRW1WudF18yOZf3q7aoyMhpBUMlmhH4mvIYWOPFj0zaECQQD4A11Q8sfpOcIK
fMz5jJymLMZ9P8gxNbafwjxTdTXht/MUprEAePslP3AeyKBMJNYGs04/lOQzksp+
ZG6j7/XzAkEAyi9zj8EaPlleAil8mB5wDWiibQ/Z92nMLSUmH5FoO013dvumBI8c
CcP1/go2sj3H4RQEWycr360yTubNkkHOSQJAcRRPos3fOkZ8Y329k3Z6IgY+RfMj
2tQLvVG5YbAKbi0J5vuNrpJ6p+QBwfdlpvIQp6NvZOwFFEK0kuZFz/dj4wJBALyc
cZCMUoARfEpGC24ZDuzjTIqzO+G7d3Yx7pOKYRLZXHXJogEkw8I0ZXmca5PxYFIP
C1VBgINEHedPFjy3WMkCQEh3FG0xDpUFXETct5L1whT8lsN0EK3ZmcfDePcbKuHW
iE5pbNn7ytpVT+jiT3+FVEZVSZCiW0lDnyd86Ppos5g=
-----END RSA PRIVATE KEY-----
公钥和私钥生成好了之后,私钥自己保存,将公钥交给第三方即可。
2、php的RSA加密解密
在做加密解密之前,首先要确保php已经开启了openssl拓展,可以通过phpinfo()函数进行查看。
通常情况下,有以下两种情形:
①通过公钥加密,通过私钥解密;
②通过私钥加密,通过公钥解密;
支付宝的业务场景属于第二种情形:
业务方支付宝发送支付请求,将sign参数通过自己的私钥加密过后发送到支付宝的接口;
支付宝方向业务方发送支付结果,将sign参数通过自己的私钥加密过后发送到业务方的notify接口;
下面就以支付宝的业务逻辑为例,实现以下第二种加解密:
加密:
$data = "我是待加密的字符串";
echo sign($data, 'rsa_private_key.pem');
/* 签名 */
function sign($data, $rsaPrivateKey) {
/* 获取私钥PEM文件内容,$rsaPrivateKey是指向私钥PEM文件的路径 */
$priKey = file_get_contents($rsaPrivateKey);
/* 从PEM文件中提取私钥 */
$res = openssl_get_privatekey($priKey);
/* 对数据进行签名 */
//openssl_sign($data, $sign, $res);
openssl_private_encrypt($data, $sign, $res);
/* 释放资源 */
openssl_free_key($res);
/* 对签名进行Base64编码,变为可读的字符串 */
$sign = base64_encode($sign);
return $sign;
}
执行后得到如下字符串:
geNTbwabOYT1l2TIkaxgxnCZDop8pynyNtMNbYATtmyyOlxgJhm363ufeHbNboIhc3Pzi7kVrWPPkFsNUiGnS4mATzAcf0woJVC+26g5j19yQqb00Fr+XVipEVyN0sn9/uhlot6m6qj7h5adaREvsY/30jTld6kDkkQF8k3Eg+Y=
解密:
$data = "geNTbwabOYT1l2TIkaxgxnCZDop8pynyNtMNbYATtmyyOlxgJhm363ufeHbNboIhc3Pzi7kVrWPPkFsNUiGnS4mATzAcf0woJVC+26g5j19yQqb00Fr+XVipEVyN0sn9/uhlot6m6qj7h5adaREvsY/30jTld6kDkkQF8k3Eg+Y=";
echo decrypt($data, 'rsa_public_key.pem');
function decrypt($data, $rsaPublicKey) {
/* 获取公钥PEM文件内容,$rsaPublicKey是指向公钥PEM文件的路径 */
$pubKey = file_get_contents($rsaPublicKey);
/* 从PEM文件中提取公钥 */
$res = openssl_get_publickey($pubKey);
/* 对数据进行解密 */
openssl_public_decrypt(base64_decode($data), $decrypted, $res);
/* 释放资源 */
openssl_free_key($res);
return $decrypted;
}
第一种情形与第二种情形类似,在此不在赘述。
注:支付宝使用的加密函数是openssl_sign,之后的校验可以使用openssl_verify函数进行校验。
希望本文所述对大家PHP程序设计有所帮助。
来源:https://blog.csdn.net/u011250882/article/details/48947969
猜你喜欢
- 先看看效果图:简单的分页js代码:1、效果描述: 不用分页即可显示的jQuery插件 jQuery分页插件——jQu
- 我们可以用Python来将一个网页保存为本地的HTML文件,这需要用到urllib库。比如我们要下载山东大学新闻网的一个页面,该网页如下:实
- LRU缓存算法,指的是近期最少使用算法,大体逻辑就是淘汰最长时间没有用的那个缓存,这里我们使用有序字典,来实现自己的LRU缓存算法,并将其包
- 函数名称:CheckForm_JS(frmName,errStr)功能:用ASP的方法动态写出JavaScript的表单验证的函数check
- 前言本文主要给大家介绍了关于python指定时间调用函数的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍:在前面的一
- Flask-Admin是Flask框架的一个扩展,用它能够快速创建Web管理界面,它实现了比如用户、文件的增删改查等常用的管理功能;如果对它
- Plotly Express是对 Plotly.py 的高级封装,内置了大量实用、现代的绘图模板,用户只需调用简单的API函数,即可快速生成
- 本文实例讲述了Python wxPython库Core组件BoxSizer用法。分享给大家供大家参考,具体如下:wx.BoxSizer:bo
- 如果想读取用 open() 函数打开的文件中的内容,除了可以使用 read() 函数,还可以使用 readline() 和 readline
- 本文实例讲述了Golang正整数指定规则排序算法问题。分享给大家供大家参考,具体如下:给定字符串内有很多正整数,要求对这些正整数进行排序,然
- 有以下两种方式启用警告框的可取消(dismissal)功能:1、通过 data 属性:通过数据 API(Data API)添加可取消功能,只
- 纵观各大编程语言在 2017 年的发展情况,我们会发现涌现出诸如 Go、Swift 这类后起之秀,而其中最为耀眼的当属 Python。之所以
- 多线程-共享全局变量#coding=utf-8from threading import Threadimport timeg_num =
- 实例如下所示:import osos.chdir("G:\Python1\Lib\site-packages\pytesser&q
- Oracle shutdown的时候突然断电,导致使用sql/plus启动时无法连接到数据库,具体描述为:connection can no
- <!--#include file="conn/conn.asp"--> <% set Newslis
- 前言之前学python时在网上找了好多小程序,由于年代久远,已经忘记出自哪里了,给代码加了点注释,再稍微修改了一下,让代码的可读性更好,如有
- 写了一个小巧的jquery拾色工具,代码简单得不得了,只有这么几行:(function($){ $.fn.pickColor=fu
- 引言:在机器学习还有深度学习中,经常会用到这几个函数,为了便于以后熟练使用,现在对这几个函数进行总结。(一)np.random.rand()
- 本文介绍了tensorflow中next_batch的具体使用,分享给大家,具体如下:此处给出了几种不同的next_batch方法,该文章只