欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

php的RSA加密解密算法原理与用法分析

程序员文章站 2022-03-10 14:25:55
本文实例讲述了php的rsa加密解密算法原理与用法。分享给大家供大家参考,具体如下:最近因为工作的需要,要倒腾支付宝支付相关的知识,因为支付宝应用了rsa加密机制,个人对此并不了解,所以在这里写下一篇...

本文实例讲述了php的rsa加密解密算法原理与用法。分享给大家供大家参考,具体如下:

最近因为工作的需要,要倒腾支付宝支付相关的知识,因为支付宝应用了rsa加密机制,个人对此并不了解,所以在这里写下一篇总结。

1、生成公钥和私钥

要应用rsa算法,必须先生成公钥和私钥,公钥和私钥的生成可以借助openssl工具。

本次测验是在windows下进行的,可以到以下的地址下载windows安装包:,安装过程不再赘述。

安装过后,进入到安装目录的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()函数进行查看。

通常情况下,有以下两种情形:

①通过公钥加密,通过私钥解密;

②通过私钥加密,通过公钥解密;

支付宝的业务场景属于第二种情形:

  1. 业务方支付宝发送支付请求,将sign参数通过自己的私钥加密过后发送到支付宝的接口;
  2. 支付宝方向业务方发送支付结果,将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函数进行校验。

ps:关于加密解密感兴趣的朋友还可以参考本站在线工具:

在线rsa加密/解密工具:

文字在线加密解密工具(包含aes、des、rc4等):

在线散列/哈希算法加密工具:

在线md5/hash/sha-1/sha-2/sha-256/sha-512/sha-3/ripemd-160加密工具:

在线sha1/sha224/sha256/sha384/sha512加密工具: