当前位置: 代码网 > it编程>前端脚本>Golang > 使用Golang实现Sm2加解密的代码详解

使用Golang实现Sm2加解密的代码详解

2024年05月18日 Golang 我要评论
golang实现国密sm2加解密sm2 椭圆曲线公钥密码算法,sm2曲线实现性能和golang sdk中的nist p256椭圆曲线原生实现(非boringcrypto)类似,也对amd64 和 ar

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语言的国密加解密问题。

到此这篇关于使用golang实现sm2加解密的代码详解的文章就介绍到这了,更多相关golang sm2加解密内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com