PHP项目中RSA加密解密的原理是什么,怎么应用
Admin 2022-05-30 群英技术资讯 285 次浏览
最近因为工作的需要,要倒腾支付宝支付相关的知识,因为支付宝应用了RSA加密机制,个人对此并不了解,所以在这里写下一篇总结。
要应用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-----
公钥和私钥生成好了之后,私钥自己保存,将公钥交给第三方即可。
在做加密解密之前,首先要确保php已经开启了openssl拓展,可以通过phpinfo()函数进行查看。
通常情况下,有以下两种情形:
①通过公钥加密,通过私钥解密;
②通过私钥加密,通过公钥解密;
支付宝的业务场景属于第二种情形:
下面就以支付宝的业务逻辑为例,实现以下第二种加解密:
加密:
$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函数进行校验。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
PHP中array_chunk函数:1、将一个数组分割成多个数组,其中每个数组的单元数目由 size 决定。最后一个数组的单元数目可能会少几个;2、得到的数组是一个多维数组中的单元,其索引从零开始。
今天小编就为大家分享一篇laravel 使用事件系统统计浏览量的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
特殊的NULL值表示一个变量没有值。NULL类型唯一可能的值就是NULL。在下列情况下一个变量被认为是NULL:被赋值为NULL。尚未被赋值。被unset()。语法NU...
在本篇文章里小编给大家带来了一篇关于strpos() 函数判断字符串中是否包含某字符串的方法,有兴趣的朋友们学习下。
在之前的文章中给大家带来了《怎么拿捏PHP数组的类型》,这篇文章中详细的介绍了PHP数组的基本定义和数组的基本类型,今天继续来看一下一个比较简单的知识点,PHP数组的排序。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008