Golang实现Sm2加解密

Golang实现国密Sm2加解密

本文仅供个人学习研究,如果涉及侵权,敬请告知!
  • SM2 椭圆曲线公钥密码算法,SM2曲线实现性能和Golang SDK中的NIST P256椭圆曲线原生实现(非BoringCrypto)类似,也对amd64 和 arm64架构做了专门汇编优化实现,SM2包实现了SM2椭圆曲线公钥密码算法的数字签名算法、公钥加密算法、密钥交换算法,中的密钥对保护数据格式。
  • SM2 公私钥对的话,要么是自己产生,要么是别的系统产生后通过某种方式传输给您的。
  • SM2公钥加密算法支持的密文编码格式有两种
  • 简单串接方式: C1C3C2,曾经老的标准为 C1C2C3
  • ASN.1格式
安装
  • go get github.com/emmansun/gmsm
以下Dome自行添加err
实例:Sm2加密Dome
  • 如果您需要普通拼接编码输出,您可以调用sm2.Encrypt方法,其中EncrypterOpts类型参数可以传入nil,表示默认C1C3C2。
func Dome() {
	//需要加密的参数
	dataArray := []interface{}{"object1", "object2"}
	//序列化为JSON字符串
	dataBytes, _ := json.Marshal(dataArray)

	// 假设这是你的SM2公钥的十六进制字符串表示
	publicKeyHex := ""
	
	//DecodeString返回由十六进制字符串s表示的字节
	keypoints, _ := hex.DecodeString(publicKeyHex)

	//检查是否有效并返回PublicKey
	testkey, err := sm2.NewPublicKey(keypoints)
	if err != nil {
		fmt.Printf("fail to new public key %v \n", err)
	}

	//两种加密方式
	//ciphertext, err := sm2.EncryptASN1(rand.Reader, testkey, dataBytes)
	ciphertext, err := sm2.Encrypt(rand.Reader, testkey, dataBytes, nil)
	if err != nil {
		fmt.Fprintf(os.Stderr, "Error from encryption: %s\n", err)
		return
	}
	fmt.Printf("Ciphertext: %x \n", ciphertext)
}
实例:Sm2解密Dome
  • 这个SM2私钥的解密方法Decrypt,通常情况下,对crypto.DecrypterOpts类型参数,您只需传入nil,系统会自己检测输入密文是ASN.1还是普通拼接,但是,如果密文是老旧的C1||C2||C3拼接,请传入相应的crypto.DecrypterOpts类型参数,或者您可以先通过上面介绍的辅助函数转换一下。
func Dome() {
	//私钥
	privateKey := ``
	
	//解密
	ciphertext, _ := hex.DecodeString(`加密出来字符串`)
	
	privKey, _ := hex.DecodeString(privateKey)
	
	testkey, err := sm2.NewPrivateKey(privKey)
	if err != nil {
		fmt.Printf("fail to new private key %v \n", err)
	}

	plaintext, err := testkey.Decrypt(nil, ciphertext, nil)
	if err != nil {
		fmt.Fprintf(os.Stderr, "Error1 from decryption: %s \n", err)
		return
	}
	fmt.Printf("Plaintext: %s \n", string(plaintext))
}
总结:用已经生成的公钥、密钥和第三方库可以解决Golang语言的国密加解密问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值