下面是使用 github.com/tjfoc/gmsm/sm2
库在 Golang 中实现数字签名的示例代码:
package main
import (
"crypto/rand"
"crypto/x509"
"encoding/pem"
"fmt"
"github.com/tjfoc/gmsm/sm2"
)
func main() {
privateKey, err := generatePrivateKey()
if err != nil {
panic(err)
}
publicKey := privateKey.Public().(*sm2.PublicKey)
message := []byte("Hello, world!")
signature, err := sm2.Sign(privateKey, message)
if err != nil {
panic(err)
}
isValid := sm2.Verify(publicKey, message, signature)
fmt.Println("Signature is valid:", isValid)
}
// 生成 SM2 私钥
func generatePrivateKey() (*sm2.PrivateKey, error) {
privateKey, err := sm2.GenerateKey(rand.Reader)
if err != nil {
return nil, err
}
privateKeyBytes, err := x509.MarshalECPrivateKey(privateKey)
if err != nil {
return nil, err
}
pemBlock := &pem.Block{
Type: "PRIVATE KEY",
Bytes: privateKeyBytes,
}
pemEncoded := pem.EncodeToMemory(pemBlock)
fmt.Println("Generated Private Key:")
fmt.Println(string(pemEncoded))
return privateKey, nil
}
上述代码中,我们首先使用 generatePrivateKey
函数生成一个随机的 SM2 私钥,并打印出私钥的 PEM 编码形式。接着,我们使用该私钥对消息进行签名,并验证签名的有效性。
注意:在运行上述代码之前,请确保你已经正确安装了 github.com/tjfoc/gmsm/sm2
包,并使用 go mod init
初始化了项目的模块。
内容由零声教学AI助手提供,问题来源于学员提问