国密算法Sm2工具类--golang实现版

package main

import (

"crypto/rand"

复制代码
"encoding/base64"
"fmt"
"github.com/tjfoc/gmsm/sm2"
"github.com/tjfoc/gmsm/x509"

)

type SM2SignatureService struct{}

func (s *SM2SignatureService) Verify(content, charset, publicKey, sign string) (bool, error) {

data := []byte(content)

pubbytes, err := base64.StdEncoding.DecodeString(publicKey)

pubKey, err := x509.ParseSm2PublicKey(pubbytes)

if err != nil {

return false, fmt.Errorf("failed to parse public key: %v", err)

}

复制代码
// 解码签名
signBytes, err := base64.StdEncoding.DecodeString(sign)
if err != nil {
	return false, fmt.Errorf("failed to decode signature: %v", err)
}

// 验证签名
return pubKey.Verify(data, signBytes), nil

}

func (s *SM2SignatureService) AlgorithmName() string {

return "SM2"

}

func (s *SM2SignatureService) GenerateKey() (string, string, error) {

// 生成密钥对

privKey, err := sm2.GenerateKey(rand.Reader)

if err != nil {

return "", "", fmt.Errorf("failed to generate key pair: %v", err)

}

复制代码
// 序列化私钥(PKCS#8)
privateKeyBytes, err := x509.MarshalSm2PrivateKey(privKey, nil)
if err != nil {
	return "", "", fmt.Errorf("failed to marshal private key: %v", err)
}

privKey, err = x509.ParsePKCS8PrivateKey(privateKeyBytes, nil)
if err != nil {
	return "", "", fmt.Errorf("failed to parse private key: %v", err)
}

// 序列化公钥
publicKeyBytes, err := x509.MarshalSm2PublicKey(&privKey.PublicKey)
if err != nil {
	return "", "", fmt.Errorf("failed to marshal public key: %v", err)
}

return base64.StdEncoding.EncodeToString(publicKeyBytes),
	base64.StdEncoding.EncodeToString(privateKeyBytes), nil

}

func (s *SM2SignatureService) Sign(content, charset, privateKey string) (string, error) {

data := []byte(content)

复制代码
// 解码私钥
privateKeyBytes, err := base64.StdEncoding.DecodeString(privateKey)
if err != nil {
	return "", fmt.Errorf("failed to decode private key: %v", err)
}

privKey, err := x509.ParsePKCS8UnecryptedPrivateKey(privateKeyBytes)
if err != nil {
	return "", fmt.Errorf("failed to parse private key: %v", err)
}

// 生成签名
signature, err := privKey.Sign(rand.Reader, data, nil)
if err != nil {
	return "", fmt.Errorf("failed to sign data: %v", err)
}

return base64.StdEncoding.EncodeToString(signature), nil

}

相关推荐
学c真好玩8 分钟前
4.3python操作ppt
开发语言·python·powerpoint
数小模.8 分钟前
MATLAB中plot函数的详细参数表
开发语言·matlab
穿林鸟27 分钟前
Spring Boot项目信创国产化适配指南
java·spring boot·后端
褚翾澜28 分钟前
Haskell语言的NoSQL
开发语言·后端·golang
伏游35 分钟前
【BUG】生产环境死锁问题定位排查解决全过程
服务器·数据库·spring boot·后端·postgresql·bug
zh_xuan40 分钟前
LeeCode 57. 插入区间
c语言·开发语言·数据结构·算法
2401_853448231 小时前
C嘎嘎类里面的额函数
c语言·开发语言·c++
巷北夜未央1 小时前
数据结构之二叉树Python版
开发语言·数据结构·python
草海桐1 小时前
golang 的github.com/dgrijalva/jwt-go包
golang·jwt·jwt-go
旧识君1 小时前
移动端1px终极解决方案:Sass混合宏工程化实践
开发语言·前端·javascript·前端框架·less·sass·scss