golang 私鑰"加密"公鑰"解密"


  之前工作主要使用C/C++與銀行/第三方支付對接,但C/C++無法滿足客戶”當天給協議明天實盤上載“的開發速度以及現公司一些特殊情況,所以決定用go來嘗試實現。基本的框架已經按照原來C/C++非阻塞框架實現一次,內部涉及加密方式也用go重新實現一遍,但一個數字證書加密的方式着實坑爹了一把,同時這個問題,也看到了openssl的命名混亂。

  關於這個加密方式的描述是:發送方用私鑰進行rsa加密,接受方使用公鑰進行rsa解密。看到這樣的加密方式描述,感覺和自己的理解是有點不一樣,不知道是不是自己對這方面了解不夠深入,自己的理解是(之前使用過的加密方式):公鑰是公開的,私鑰是自己保存的,用私鑰對數據進行簽名,用公鑰驗證簽名。感覺畫風不一樣,翻查一下openssl,的確也是存在這樣的函數:
RSA_private_encryptRSA_public_decrypt參考文檔。用openssl很容易就實現這樣一個加密解密。但用純go語言實現,不可能再用cgo來調用c函數,翻查一下go的文檔,存在在類似的函數(crypt/rsa):
func DecryptPKCS1v15(rand io.Reader, priv *PrivateKey, ciphertext []byte) ([]byte, error)func EncryptPKCS1v15(rand io.Reader, pub *PublicKey, msg []byte) ([]byte, error) 。但仔細看,這里是使用公鑰進行加密,使用私鑰進行解密,和描述剛好相反。除了這兩個涉及公私鑰加密的函數外,似乎在go里面找不到其他類似的函數了。

  在google(科學上網lanttern)里面,能夠搜索到的答案似乎不多,最后在stackoverflow找到結果:Encrypt message with RSA private key (as in OpenSSL's RSA_private_encrypt。一哥們手工搞定,其代碼放在goplaygound。看了一下代碼,如果不是對go內部的數據結構非常熟悉,而且對rsa機制非常清楚,很難寫出正常代碼。難道go就沒有現成的代碼完成這個功能?后面,有人就說,這是什么狗屁加密,壓根就是一rsa簽名,就用crypt/rsa里面,func SignPKCS1v15(rand io.Reader, priv *PrivateKey, hash crypto.Hash, hashed []byte) ([]byte, error)實現的。尼瑪的,測試結果還真是一樣。后來,回頭看一下openssl里面的參考文檔說明,These functions handle RSA signatures at a low level.,這就是簽名啊,既然是簽名,為何命名encrypt/decrypt?是不是因為命名問題,廣為傳播為私鑰"加密"公鑰"解密"呢?

  go不知道是不是受不了這樣私鑰"加密"公鑰"解密"這種混亂的說法,不像其他語言一樣提供類似的函數呢?至於公鑰"解密",網上搜索不到滿意答案,不過,既然私鑰"加密"是rsa簽名,那么公鑰"解密"那么應該就是驗證簽名了。既然網上找不到滿意的答案,那么只能修改一下go的func VerifyPKCS1v15(pub *PublicKey, hash crypto.Hash, hashed []byte, sig []byte) error函數。證實,這個想法是可行的。用openssl加密的數據,可以解密,加密的數據同時可以被openssl解密。

  相關代碼:https://github.com/buf1024/golib/tree/master/crypt 只簡單導出PrivateEncryptPublicDecrypt兩個函數。

  最后,openssl的確存在一些非常混亂的命名方式,而其他語言/庫,妥協這種混亂情況,那么混亂看起來即變為普遍。如不是非常熟悉,那么到一個不再妥協這種混亂時,那么及其容易使自己混亂啊。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM