使用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架構(gòu)做了專門匯編優(yōu)化實現(xiàn),SM2包實現(xiàn)了SM2橢圓曲線公鑰密碼算法的數(shù)字簽名算法、公鑰加密算法、密鑰交換算法,中的密鑰對保護數(shù)據(jù)格式。
- SM2 公私鑰對的話,要么是自己產(chǎn)生,要么是別的系統(tǒng)產(chǎn)生后通過某種方式傳輸給您的。
- SM2公鑰加密算法支持的密文編碼格式有兩種
- 簡單串接方式: C1C3C2,曾經(jīng)老的標準為 C1C2C3
- ASN.1格式
安裝
- go get github.com/emmansun/gmsm
以下Dome自行添加err
實例:Sm2加密Dome
- 如果您需要普通拼接編碼輸出,您可以調(diào)用sm2.Encrypt方法,其中EncrypterOpts類型參數(shù)可以傳入nil,表示默認C1C3C2。
func Dome() { //需要加密的參數(shù) dataArray := []interface{}{"object1", "object2"} //序列化為JSON字符串 dataBytes, _ := json.Marshal(dataArray) // 假設(shè)這是你的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拼接,請傳入相應(yīng)的crypto.DecrypterOpts類型參數(shù),或者您可以先通過上面介紹的輔助函數(shù)轉(zhuǎn)換一下。
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)) }
總結(jié):用已經(jīng)生成的公鑰、密鑰和第三方庫可以解決Golang語言的國密加解密問題。
到此這篇關(guān)于使用Golang實現(xiàn)Sm2加解密的代碼詳解的文章就介紹到這了,更多相關(guān)Golang SM2加解密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
GoLang string與strings.Builder使用對比詳解
這篇文章主要介紹了GoLang string與strings.Builder使用對比,Builder 用于使用 Write 方法有效地構(gòu)建字符串。它最大限度地減少了內(nèi)存復制。零值可以使用了。不要復制非零生成器2023-03-03Go并發(fā)編程結(jié)構(gòu)體多字段原子操作示例詳解
這篇文章主要為大家介紹了Go并發(fā)編程結(jié)構(gòu)體多字段原子操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12解讀unsafe.Pointer和uintptr的區(qū)別
這篇文章主要介紹了解讀unsafe.Pointer和uintptr的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02Nunu快速構(gòu)建高效可靠Go應(yīng)用腳手架使用詳解
這篇文章主要為大家介紹了如何使用Nunu快速構(gòu)建高效可靠Go應(yīng)用腳手架詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06