本文實(shí)例講述了php的RSA加密解密算法原理與用法。分享給大家供大家參考,具體如下:
最近因?yàn)楣ぷ鞯男枰?,要倒騰支付寶支付相關(guān)的知識(shí),因?yàn)橹Ц秾殤?yīng)用了RSA加密機(jī)制,個(gè)人對(duì)此并不了解,所以在這里寫下一篇總結(jié)。
1、生成公鑰和私鑰
要應(yīng)用RSA算法,必須先生成公鑰和私鑰,公鑰和私鑰的生成可以借助openssl工具。
本次測(cè)驗(yàn)是在windows下進(jìn)行的,可以到以下的地址下載windows安裝包:http://gnuwin32.sourceforge.net/packages/openssl.htm,安裝過(guò)程不再贅述。
安裝過(guò)后,進(jìn)入到安裝目錄的bin目錄下,執(zhí)行如下命令:
openssl.exe // 進(jìn)入OpenSSL程序
genrsa -out rsa_private_key.pem 1024 //生成私鑰,執(zhí)行成功后可以在當(dāng)前目錄下看到生成了rsa_private_key.pem文件
pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt //如果你使用的java,需要將私鑰轉(zhuǎn)換成PKCS8格式
rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem //生成公鑰,執(zhí)行成功后可以在當(dāng)前目錄下看到生成rsa_public_key.pem文件
公鑰rsa_public_key.pem的內(nèi)容:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDc5nSC6mHl9bmM6L8n7Sq1+Ft6
VF8LcU3jst8RIy7WqXXd5XZomc0cJLxVz3Vc0vgUKKJyP6q2ozDOCFgCp7Q9InFg
ngtNVLEJ1+Nm0+snUDbYbnrfW8wwSPG0jPQ73CgMxOdv+IGhir6mEITbdEh+ZsVc
GRd0OvKYIg+Itgk3/QIDAQAB
-----END PUBLIC KEY-----
私鑰rsa_private_key.pem的內(nèi)容:
-----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已經(jīng)開啟了openssl拓展,可以通過(guò)phpinfo()函數(shù)進(jìn)行查看。
通常情況下,有以下兩種情形:
①通過(guò)公鑰加密,通過(guò)私鑰解密;
②通過(guò)私鑰加密,通過(guò)公鑰解密;
支付寶的業(yè)務(wù)場(chǎng)景屬于第二種情形:
- 業(yè)務(wù)方支付寶發(fā)送支付請(qǐng)求,將sign參數(shù)通過(guò)自己的私鑰加密過(guò)后發(fā)送到支付寶的接口;
- 支付寶方向業(yè)務(wù)方發(fā)送支付結(jié)果,將sign參數(shù)通過(guò)自己的私鑰加密過(guò)后發(fā)送到業(yè)務(wù)方的notify接口;
下面就以支付寶的業(yè)務(wù)邏輯為例,實(shí)現(xiàn)以下第二種加解密:
加密:
$data = "我是待加密的字符串";
echo sign($data, 'rsa_private_key.pem');
/* 簽名 */
function sign($data, $rsaPrivateKey) {
/* 獲取私鑰PEM文件內(nèi)容,$rsaPrivateKey是指向私鑰PEM文件的路徑 */
$priKey = file_get_contents($rsaPrivateKey);
/* 從PEM文件中提取私鑰 */
$res = openssl_get_privatekey($priKey);
/* 對(duì)數(shù)據(jù)進(jìn)行簽名 */
//openssl_sign($data, $sign, $res);
openssl_private_encrypt($data, $sign, $res);
/* 釋放資源 */
openssl_free_key($res);
/* 對(duì)簽名進(jìn)行Base64編碼,變?yōu)榭勺x的字符串 */
$sign = base64_encode($sign);
return $sign;
}
執(zhí)行后得到如下字符串:
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文件內(nèi)容,$rsaPublicKey是指向公鑰PEM文件的路徑 */
$pubKey = file_get_contents($rsaPublicKey);
/* 從PEM文件中提取公鑰 */
$res = openssl_get_publickey($pubKey);
/* 對(duì)數(shù)據(jù)進(jìn)行解密 */
openssl_public_decrypt(base64_decode($data), $decrypted, $res);
/* 釋放資源 */
openssl_free_key($res);
return $decrypted;
}
第一種情形與第二種情形類似,在此不在贅述。
注:支付寶使用的加密函數(shù)是openssl_sign,之后的校驗(yàn)可以使用openssl_verify函數(shù)進(jìn)行校驗(yàn)。
PS:關(guān)于加密解密感興趣的朋友還可以參考本站在線工具:
在線RSA加密/解密工具:
http://tools.jb51.net/password/rsa_encode
文字在線加密解密工具(包含AES、DES、RC4等):
http://tools.jb51.net/password/txt_encode
在線散列/哈希算法加密工具:
http://tools.jb51.net/password/hash_encrypt
在線MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具:
http://tools.jb51.net/password/hash_md5_sha
在線sha1/sha224/sha256/sha384/sha512加密工具:
http://tools.jb51.net/password/sha_encode
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php加密方法總結(jié)》、《PHP編碼與轉(zhuǎn)碼操作技巧匯總》、《PHP數(shù)學(xué)運(yùn)算技巧總結(jié)》、《PHP數(shù)組(Array)操作技巧大全》、《php字符串(string)用法總結(jié)》、《PHP數(shù)據(jù)結(jié)構(gòu)與算法教程》、《php程序設(shè)計(jì)算法總結(jié)》及《php正則表達(dá)式用法總結(jié)》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
您可能感興趣的文章:- 六種php加密解密方法實(shí)例講解
- PHP rsa加密解密算法原理解析
- 基于PHP實(shí)現(xiàn)解密或加密Cloudflar郵箱保護(hù)
- php中加密解密DES類的簡(jiǎn)單使用方法示例
- RSA實(shí)現(xiàn)JS前端加密與PHP后端解密功能示例
- Js通過(guò)AES加密后PHP用Openssl解密的方法
- PHP實(shí)現(xiàn)的AES雙向加密解密功能示例【128位】
- PHP實(shí)現(xiàn)的XXTEA加密解密算法示例
- PHP實(shí)現(xiàn)基于3DES算法加密解密字符串示例
- PHP實(shí)現(xiàn)的AES加密、解密封裝類與用法示例
- PHP實(shí)現(xiàn)的DES加密解密類定義與用法示例
- 基于PHP RSA密文過(guò)長(zhǎng)加密解密 越過(guò)1024的解決方法
- PHP的RSA加密解密方法以及開發(fā)接口使用
- PHP使用自定義key實(shí)現(xiàn)對(duì)數(shù)據(jù)加密解密的方法
- php實(shí)現(xiàn)的三個(gè)常用加密解密功能函數(shù)示例
- PHP代碼加密和擴(kuò)展解密實(shí)戰(zhàn)