使用Golang實(shí)現(xiàn)Sm2加解密的代碼詳解
Golang實(shí)現(xiàn)國(guó)密Sm2加解密
- SM2 橢圓曲線(xiàn)公鑰密碼算法,SM2曲線(xiàn)實(shí)現(xiàn)性能和Golang SDK中的NIST P256橢圓曲線(xiàn)原生實(shí)現(xiàn)(非BoringCrypto)類(lèi)似,也對(duì)amd64 和 arm64架構(gòu)做了專(zhuān)門(mén)匯編優(yōu)化實(shí)現(xiàn),SM2包實(shí)現(xiàn)了SM2橢圓曲線(xiàn)公鑰密碼算法的數(shù)字簽名算法、公鑰加密算法、密鑰交換算法,中的密鑰對(duì)保護(hù)數(shù)據(jù)格式。
- SM2 公私鑰對(duì)的話(huà),要么是自己產(chǎn)生,要么是別的系統(tǒng)產(chǎn)生后通過(guò)某種方式傳輸給您的。
- SM2公鑰加密算法支持的密文編碼格式有兩種
- 簡(jiǎn)單串接方式: C1C3C2,曾經(jīng)老的標(biāo)準(zhǔn)為 C1C2C3
- ASN.1格式
安裝
- go get github.com/emmansun/gmsm
以下Dome自行添加err
實(shí)例:Sm2加密Dome
- 如果您需要普通拼接編碼輸出,您可以調(diào)用sm2.Encrypt方法,其中EncrypterOpts類(lèi)型參數(shù)可以傳入nil,表示默認(rèn)C1C3C2。
func Dome() { //需要加密的參數(shù) dataArray := []interface{}{"object1", "object2"} //序列化為JSON字符串 dataBytes, _ := json.Marshal(dataArray) // 假設(shè)這是你的SM2公鑰的十六進(jìn)制字符串表示 publicKeyHex := "" //DecodeString返回由十六進(jìn)制字符串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) }
實(shí)例:Sm2解密Dome
- 這個(gè)SM2私鑰的解密方法Decrypt,通常情況下,對(duì)crypto.DecrypterOpts類(lèi)型參數(shù),您只需傳入nil,系統(tǒng)會(huì)自己檢測(cè)輸入密文是ASN.1還是普通拼接,但是,如果密文是老舊的C1||C2||C3拼接,請(qǐng)傳入相應(yīng)的crypto.DecrypterOpts類(lèi)型參數(shù),或者您可以先通過(guò)上面介紹的輔助函數(shù)轉(zhuǎn)換一下。
func Dome() { //私鑰 privateKey := `` //解密 ciphertext, _ := hex.DecodeString(`加密出來(lái)字符串`) 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)生成的公鑰、密鑰和第三方庫(kù)可以解決Golang語(yǔ)言的國(guó)密加解密問(wèn)題。
到此這篇關(guān)于使用Golang實(shí)現(xiàn)Sm2加解密的代碼詳解的文章就介紹到這了,更多相關(guān)Golang SM2加解密內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入探究Golang中flag標(biāo)準(zhǔn)庫(kù)的使用
在本文中,我們將深入探討 flag 標(biāo)準(zhǔn)庫(kù)的實(shí)現(xiàn)原理和使用技巧,以幫助讀者更好地理解和掌握該庫(kù)的使用方法,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2023-04-04GoLang string與strings.Builder使用對(duì)比詳解
這篇文章主要介紹了GoLang string與strings.Builder使用對(duì)比,Builder 用于使用 Write 方法有效地構(gòu)建字符串。它最大限度地減少了內(nèi)存復(fù)制。零值可以使用了。不要復(fù)制非零生成器2023-03-03Golang正則表達(dá)式判斷手機(jī)號(hào)或身份證方法實(shí)例
日常使用一些軟件時(shí)會(huì)通過(guò)手機(jī)號(hào)碼來(lái)注冊(cè),這就會(huì)用到正則表達(dá)式來(lái)判斷號(hào)碼是否正確,下面這篇文章主要給大家介紹了關(guān)于Golang正則表達(dá)式判斷手機(jī)號(hào)或身份證的相關(guān)資料,需要的朋友可以參考下2022-07-07Go語(yǔ)言利用heap實(shí)現(xiàn)優(yōu)先級(jí)隊(duì)列
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中heap的使用以及如何利用heap實(shí)現(xiàn)優(yōu)先級(jí)隊(duì)列的相關(guān)資料,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-05-05Go并發(fā)編程結(jié)構(gòu)體多字段原子操作示例詳解
這篇文章主要為大家介紹了Go并發(fā)編程結(jié)構(gòu)體多字段原子操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12解讀unsafe.Pointer和uintptr的區(qū)別
這篇文章主要介紹了解讀unsafe.Pointer和uintptr的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02Nunu快速構(gòu)建高效可靠Go應(yīng)用腳手架使用詳解
這篇文章主要為大家介紹了如何使用Nunu快速構(gòu)建高效可靠Go應(yīng)用腳手架詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06詳解Go語(yǔ)言中切片的長(zhǎng)度與容量的區(qū)別
切片可以看成是數(shù)組的引用,切片的長(zhǎng)度是它所包含的元素個(gè)數(shù)。切片的容量是從它的第一個(gè)元素到其底層數(shù)組元素末尾的個(gè)數(shù)。本文將通過(guò)示例詳細(xì)講講Go語(yǔ)言中切片的長(zhǎng)度與容量的區(qū)別,需要的可以參考一下2022-11-11