当前位置: 首页 > news >正文

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

}

相关文章:

  • Windows逆向工程入门之MASM编程深度解析
  • Spring MVC视图解析器的定制与应用
  • 【强化学习笔记1】从强化学习的基本概念到近端策略优化(PPO)
  • Parquet 编码
  • SQL Server 中遇到的常见问题集
  • 2025学年安徽省职业院校技能大赛 “信息安全管理与评估”赛项 比赛样题任务书
  • docker-compose部署onlyoffice8.3.0并支持ssl,且支持通过nginx代理,关闭JWT配置
  • RabbitMQ系列(四)基本概念之Exchange
  • 线上服务器的文件下载到本地Windows电脑
  • hackmyvm-hero
  • Python学习第十八天之深度学习之Tensorboard
  • 网络安全和爬虫的关系
  • 网络协议 HTTP、HTTPS、HTTP/1.1、HTTP/2 对比分析
  • 算法——分治
  • Java从根上理解 ConcurrentHashMap:缓存机制与性能优化
  • 欧几里得算法
  • 计算机视觉 |解锁视频理解三剑客——SlowFast
  • 基于云函数的自习室预约微信小程序+LW示例参考
  • 服务器为什么会禁止 Ping?服务器禁止 Ping 的好处
  • 【项目管理工具推荐二】【信息化系统需求管理工具万字指南:从需求收集到落地全链路拆解】
  • 建立双城双向科创项目孵化机制,2025沪港创新项目评选启动
  • 夜驾遇东北虎隔窗对视?延吉林业局:村里有牛被咬死,保险公司会理赔
  • 巴基斯坦外长访华是否与印巴局势有关?外交部:此访体现巴方高度重视中巴关系
  • 荷兰外交大臣费尔德坎普将访华
  • 上海徐汇 “家 + 书屋”,创新服务广大家庭
  • 西浦国际教育创新论坛举行,聚焦AI时代教育本质的前沿探讨