RSA非對稱加密,在網絡鑑權中使用不少。本人也是在PHP與C++交互鑑權時出現問題,在解決問題過程當中發現,網上對相關問題的描述不多,所在這裏記錄下,但願對遇到類似問題的朋友有所幫助。php
問題情景:安全
因爲項目需求,須要PHP寫接口提供給C++調用,在接口返回數據以前,須要對訪問者進行鑑權已增長數據訪問安全性。網絡
針對需求,咱們採用的是兩次握手完成鑑權。函數
第一次訪問接口不帶參數,接口返回token和RSA公鑰(公鑰用base64加密,方便傳輸)。post
第二次訪問接口,客戶端需使用返回公鑰加密訪問參數,以後將加密後的參數和token一塊兒發送給服務端進行驗證。服務端收到訪問數據後,對加密參數用私鑰解密,檢查參數是否符合要求,完成鑑權過程。編碼
咱們的問題出如今第二次訪問時,發送過來的加密參數,沒法經過私鑰解密。加密
注:公鑰和私鑰有PHP生成,使用這對公鑰私鑰能夠在PHP端完成加解密,使用相同的公鑰私鑰也能夠在C++端完成加解密,但二者互通就會出現問題。.net
解決過程:blog
直接上正確思路,咱們使用相同公鑰對相同參數進行加密後發現,二者長度相差很大,因而斷定應該是加密後二者的編碼方式不一樣,據我瞭解RSA加密後C++端應該是輸出十六進制的密文,而PHP使用openssl_public_encrypt 公鑰加密後的密文應該是ASCII碼字符串,二者長度相差很大。token
根據以上判斷,C++發送給PHP的是十六進制密文,而使用openssl_private_decrypt解密須要的是ASCII碼字符串,固然解不出來了。既然知道問題所在,那咱們把十六進制的密文轉換成ASCII碼字符串不就能夠解決問題了,因而在PHP端使用**pack("H*", param) **轉碼密文,以後果真順利解密。
關於pack函數的詳細介紹能夠看OSC上一位朋友的博客,連接在此
簡單總結:
1.用pack(「H*」)
2.php base64加密公鑰傳遞給C++
3.C++ 用公鑰加密信息 post傳遞給PHP解密