在 Go 语言中,可以使用 github.com/tjfoc/gmsm/sm2 包来实现 SM2 加密和解密。
示例代码如下:
package main import ( "fmt" "crypto/rand" "encoding/hex" "github.com/tjfoc/gmsm/sm2" ) func main() { // 生成密钥对 priKey, err := sm2.GenerateKey(rand.Reader) if err != nil { fmt.Println(err) return } pubKey := &priKey.PublicKey // 明文消息 message := "Hello, world!" // 加密 cipher, err := pubKey.Encrypt([]byte(message), rand.Reader) if err != nil { fmt.Println(err) return } fmt.Printf("加密后的密文: %s\n", hex.EncodeToString(cipher)) // 解密 plain, err := priKey.Decrypt(cipher) if err != nil { fmt.Println(err) return } fmt.Printf("解密后的明文: %s\n", string(plain)) }
在这个示例中,我们首先使用 sm2.GenerateKey 函数生成一个密钥对,其中 rand.Reader 是一个随机数生成器。然后,我们使用公钥对明文消息进行加密,得到一个字节数组表示的密文。我们使用 hex.EncodeToString 函数将密文转换成十六进制字符串,并输出加密后的密文。
接着,我们使用私钥对密文进行解密,并输出解密后的明文。注意,解密操作需要使用私钥,而加密操作需要使用公钥。在解密时,我们使用 string 函数将字节数组转换成字符串。
需要注意的是,SM2 算法需要使用特定的密钥格式,即 PKCS#8 格式。因此,如果需要将密钥保存到文件或数据库中,需要使用 x509.MarshalPKCS8PrivateKey 和 x509.MarshalPKIXPublicKey 函数将密钥转换成字节数组。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论(0)