使用Golang實現(xiàn)Sm2加解密的代碼詳解
更新時間:2024年03月15日 09:46:43 作者:ZhongYuxuanG
本文主要介紹了Go語言實現(xiàn)Sm2加解密的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
Golang實現(xiàn)國密Sm2加解密
- SM2 橢圓曲線公鑰密碼算法,SM2曲線實現(xiàn)性能和Golang SDK中的NIST P256橢圓曲線原生實現(xiàn)(非BoringCrypto)類似,也對amd64 和 arm64架構做了專門匯編優(yōu)化實現(xiàn),SM2包實現(xiàn)了SM2橢圓曲線公鑰密碼算法的數(shù)字簽名算法、公鑰加密算法、密鑰交換算法,中的密鑰對保護數(shù)據(jù)格式。
- SM2 公私鑰對的話,要么是自己產生,要么是別的系統(tǒng)產生后通過某種方式傳輸給您的。
- SM2公鑰加密算法支持的密文編碼格式有兩種
- 簡單串接方式: C1C3C2,曾經(jīng)老的標準為 C1C2C3
- ASN.1格式
安裝
- go get github.com/emmansun/gmsm
以下Dome自行添加err
實例:Sm2加密Dome
- 如果您需要普通拼接編碼輸出,您可以調用sm2.Encrypt方法,其中EncrypterOpts類型參數(shù)可以傳入nil,表示默認C1C3C2。
func Dome() {
//需要加密的參數(shù)
dataArray := []interface{}{"object1", "object2"}
//序列化為JSON字符串
dataBytes, _ := json.Marshal(dataArray)
// 假設這是你的SM2公鑰的十六進制字符串表示
publicKeyHex := ""
//DecodeString返回由十六進制字符串s表示的字節(jié)
keypoints, _ := hex.DecodeString(publicKeyHex)
//檢查是否有效并返回PublicKey
testkey, err := sm2.NewPublicKey(keypoints)
if err != nil {
fmt.Printf("fail to new public key %v \n", err)
}
//兩種加密方式
//ciphertext, err := sm2.EncryptASN1(rand.Reader, testkey, dataBytes)
ciphertext, err := sm2.Encrypt(rand.Reader, testkey, dataBytes, nil)
if err != nil {
fmt.Fprintf(os.Stderr, "Error from encryption: %s\n", err)
return
}
fmt.Printf("Ciphertext: %x \n", ciphertext)
}
實例:Sm2解密Dome
- 這個SM2私鑰的解密方法Decrypt,通常情況下,對crypto.DecrypterOpts類型參數(shù),您只需傳入nil,系統(tǒng)會自己檢測輸入密文是ASN.1還是普通拼接,但是,如果密文是老舊的C1||C2||C3拼接,請傳入相應的crypto.DecrypterOpts類型參數(shù),或者您可以先通過上面介紹的輔助函數(shù)轉換一下。
func Dome() {
//私鑰
privateKey := ``
//解密
ciphertext, _ := hex.DecodeString(`加密出來字符串`)
privKey, _ := hex.DecodeString(privateKey)
testkey, err := sm2.NewPrivateKey(privKey)
if err != nil {
fmt.Printf("fail to new private key %v \n", err)
}
plaintext, err := testkey.Decrypt(nil, ciphertext, nil)
if err != nil {
fmt.Fprintf(os.Stderr, "Error1 from decryption: %s \n", err)
return
}
fmt.Printf("Plaintext: %s \n", string(plaintext))
}
總結:用已經(jīng)生成的公鑰、密鑰和第三方庫可以解決Golang語言的國密加解密問題。
到此這篇關于使用Golang實現(xiàn)Sm2加解密的代碼詳解的文章就介紹到這了,更多相關Golang SM2加解密內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
GoLang string與strings.Builder使用對比詳解
這篇文章主要介紹了GoLang string與strings.Builder使用對比,Builder 用于使用 Write 方法有效地構建字符串。它最大限度地減少了內存復制。零值可以使用了。不要復制非零生成器2023-03-03
解讀unsafe.Pointer和uintptr的區(qū)別
這篇文章主要介紹了解讀unsafe.Pointer和uintptr的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02

