溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2021-10-18 17:35:35 來源:億速云 閱讀:154 作者:柒染 欄目:編程語言

這篇文章給大家介紹php的RSA加密解密算法原理與用法的分析,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

最近因?yàn)楣ぷ鞯男枰跪v支付寶支付相關(guān)的知識(shí),因?yàn)橹Ц秾殤?yīng)用了RSA加密機(jī)制,個(gè)人對(duì)此并不了解,所以在這里寫下一篇總結(jié)。

1、生成公鑰和私鑰

要應(yīng)用RSA算法,必須先生成公鑰和私鑰,公鑰和私鑰的生成可以借助openssl工具。

本次測驗(yàn)是在windows下進(jìn)行的,可以到以下的地址下載windows安裝包:http://gnuwin32.sourceforge.net/packages/openssl.htm,安裝過程不再贅述。

安裝過后,進(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+Ft6VF8LcU3jst8RIy7WqXXd5XZomc0cJLxVz3Vc0vgUKKJyP6q2ozDOCFgCp7Q9InFgngtNVLEJ1+Nm0+snUDbYbnrfW8wwSPG0jPQ73CgMxOdv+IGhir6mEITbdEh+ZsVcGRd0OvKYIg+Itgk3/QIDAQAB-----END PUBLIC KEY-----

私鑰rsa_private_key.pem的內(nèi)容:

-----BEGIN RSA PRIVATE KEY-----MIICXAIBAAKBgQDD4KA0yU7EG7ZA32OAVDHlwXf9LYywXGn7Ma9LffnFL57cpYoQWf0Oz8FE9/UnjFOeHs2XjDrhe+uqVtYX/9Vi/znJgP9D7hpTo2NJHM/AUykD+itlcie2Tu+sjJQi0JFVcpc3D0ooTBhng35406CucRaOn/a52mxQnGtA4AmsSwIDAQABAoGAG25nwTy39SrUWT1vl9cyrbRsc15fp4sppG4O2Imp4v2KR+g+749KqzpZHKmFAabbRveVXzXaQR2zoUVL8kx3u4hqY4M/S1AcOxNPIJKB703XxA1yf2Ta2CvLsWTmtsDWRW1WudF18yOZf3q7aoyMhpBUMlmhH4mvIYWOPFj0zaECQQD4A11Q8sfpOcIKfMz5jJymLMZ9P8gxNbafwjxTdTXht/MUprEAePslP3AeyKBMJNYGs04/lOQzksp+ZG6j7/XzAkEAyi9zj8EaPlleAil8mB5wDWiibQ/Z92nMLSUmH5FoO013dvumBI8cCcP1/go2sj3H4RQEWycr360yTubNkkHOSQJAcRRPos3fOkZ8Y329k3Z6IgY+RfMj2tQLvVG5YbAKbi0J5vuNrpJ6p+QBwfdlpvIQp6NvZOwFFEK0kuZFz/dj4wJBALyccZCMUoARfEpGC24ZDuzjTIqzO+G7d3Yx7pOKYRLZXHXJogEkw8I0ZXmca5PxYFIPC1VBgINEHedPFjy3WMkCQEh4FG0xDpUFXETct5L1whT8lsN0EK3ZmcfDePcbKuHWiE5pbNn7ytpVT+jiT3+FVEZVSZCiW0lDnyd86Ppos5g=-----END RSA PRIVATE KEY-----

公鑰和私鑰生成好了之后,私鑰自己保存,將公鑰交給第三方即可。

2、php的RSA加密解密

在做加密解密之前,首先要確保php已經(jīng)開啟了openssl拓展,可以通過phpinfo()函數(shù)進(jìn)行查看。

通常情況下,有以下兩種情形:

①通過公鑰加密,通過私鑰解密;

②通過私鑰加密,通過公鑰解密;

支付寶的業(yè)務(wù)場景屬于第二種情形:

  1. 業(yè)務(wù)方支付寶發(fā)送支付請(qǐng)求,將sign參數(shù)通過自己的私鑰加密過后發(fā)送到支付寶的接口;支付寶方向業(yè)務(wù)方發(fā)送支付結(jié)果,將sign參數(shù)通過自己的私鑰加密過后發(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/uhlot6m6qj7h6adaREvsY/30jTld6kDkkQF8k3Eg+Y=

解密:

$data = "geNTbwabOYT1l2TIkaxgxnCZDop8pynyNtMNbYATtmyyOlxgJhm363ufeHbNboIhc3Pzi7kVrWPPkFsNUiGnS4mATzAcf0woJVC+26g5j19yQqb00Fr+XVipEVyN0sn9/uhlot6m6qj7h6adaREvsY/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)。

關(guān)于php的RSA加密解密算法原理與用法的分析就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI