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

 更新时间:2024年03月15日 09:46:43   作者:ZhongYuxuanG  
本文主要介绍了Go语言实现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语言的国密加解密问题。

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

相关文章

  • Go语言操作redis数据库的方法

    Go语言操作redis数据库的方法

    这篇文章主要介绍了Go语言操作redis数据库的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • Go结构体指针引发的值传递思考分析

    Go结构体指针引发的值传递思考分析

    这篇文章主要为大家介绍了Go结构体指针引发的值传递思考分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Go语言中Seeker接口的用法详解

    Go语言中Seeker接口的用法详解

    Go语言标准库中的io包提供了一系列接口,用于处理各种I/O操作,其中Seeker接口在处理大文件或需要随机访问的场景中非常有用,本文将结合具体案例,详细介绍Go语言中io包的Seeker接口的用法,需要的朋友可以参考下
    2024-10-10
  • Golang断言判断值类型的实现方法

    Golang断言判断值类型的实现方法

    这篇文章主要介绍了Golang断言判断值类型的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Go语言中结构体方法副本传参与指针传参的区别介绍

    Go语言中结构体方法副本传参与指针传参的区别介绍

    这篇文章主要给大家介绍了关于Go语言中结构体方法副本传参与指针传参的区别的相关资料,文中先对GO语言结构体方法跟结构体指针方法的区别进行了一些简单的介绍,来帮助大家理解学习,需要的朋友可以参考下。
    2017-12-12
  • Ruby序列化和持久化存储(Marshal、Pstore)操作方法详解

    Ruby序列化和持久化存储(Marshal、Pstore)操作方法详解

    这篇文章主要介绍了Ruby序列化和持久化存储(Marshal、Pstore)操作方法详解,包括Ruby Marshal序列化,Ruby Pstore存储,需要的朋友可以参考下
    2022-04-04
  • 使用Golang调用摄像头并进行图像处理

    使用Golang调用摄像头并进行图像处理

    近年来,摄像头成为了我们生活中不可或缺的设备之一,从智能手机到安全监控系统,无处不在的摄像头给我们带来了便利和安全,在开发摄像头相关的应用程序时,选择一种高效和易用的编程语言是非常重要的,本文将介绍如何使用Golang调用摄像头并进行图像处理
    2023-11-11
  • Golang内存模型教科书级讲解

    Golang内存模型教科书级讲解

    go官方介绍go内存模型的时候说:探究在什么条件下,goroutine 在读取一个变量的值的时,能够看到其它 goroutine 对这个变量进行的写的结果,Go内存模型规定了一些条件,在这些条件下,在一个goroutine中读取变量返回的值能够确保是另一个goroutine中对该变量写入的值
    2023-03-03
  • golang基于websocket实现的简易聊天室程序

    golang基于websocket实现的简易聊天室程序

    这篇文章主要介绍了golang基于websocket实现的简易聊天室,分析了websocket的下载、安装及使用实现聊天室功能的相关技巧,需要的朋友可以参考下
    2016-07-07
  • 使用Go语言编写HTTP中间件的示例详解

    使用Go语言编写HTTP中间件的示例详解

    在Go语言中,HTTP中间件是一种处理HTTP请求和响应的函数,它可以拦截到请求并对其进行处理,然后再将请求传递给下一个中间件或目标处理程序,本文给大家介绍了使用Go语言编写HTTP中间件的示例,文中有相关的代码示例供大家参考,需要的朋友可以参考下
    2024-01-01

最新评论