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

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

  關於這個加密方式的描述是:發送方用私鑰進行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裏面找不到其餘相似的函數了。git

  在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**?是否是由於命名問題,廣爲傳播爲私鑰"加密"公鑰"解密"呢?github

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

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

  最後,openssl的確存在一些很是混亂的命名方式,而其餘語言/庫,妥協這種混亂狀況,那麼混亂看起來即變爲廣泛。如不是很是熟悉,那麼到一個再也不妥協這種混亂時,那麼及其容易使本身混亂啊。框架

相關文章
相關標籤/搜索