国密算法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

}

相关推荐
码哥DFS22 分钟前
二叉树的直径
开发语言·javascript·算法
mldong27 分钟前
jeeflow:98KB 的工作流引擎长什么样
后端
paopaokaka_luck1 小时前
基于springboot3+vue3的企业考勤管理系统(部门树递归、Echarts图形化分析)
开发语言·spring boot·学习·echarts·mybatis·需求分析·代码规范
梦雨生生2 小时前
java开发工具(学习第一天)
java·开发语言·学习
程序员cxuan3 小时前
速度太快了!本地可以跑 DeepSeek-V4-Flash 了
人工智能·后端·程序员
啊啊啊啊啊!!!!4 小时前
【c++】stack和queue的接口使用以及底层实现
开发语言·c++
阿祖zu4 小时前
芝士就是力量!开源私有化部署与 GitHub 双向同步的个人知识笔记 App
前端·后端·ios
松仔log5 小时前
Java中级——组合和继承
android·java·开发语言
不才不才不不才5 小时前
Spring 源码系列(16): doDispatch 全流程——一次请求的主干链路
java·后端·spring
IT_陈寒5 小时前
SpringBoot自动配置失效?这个隐藏配置坑了我一整晚
前端·人工智能·后端