Go语言中实现RSA加解密、签名验证算法

随着互联网的高速发展,人们对安全的要求也越来越高。密码学中两大经典算法,一个是对称加解密,另一个是非对称加解密,这里就来分享一下非对称加密算法的代表:RSA加解密。

在Go语言中实现RSA加解密还是比较简单的,网上很多教程都是基于Go原生标准库写的,代码量较多。这里分享一个好用的库:https://github.com/forgoer/openssl

安装

复制代码
go get https://github.com/forgoer/openssl

秘钥生成

秘钥可以生成在文件里,也是生成到Buffer里,只要实现了io.Writer即可。

go 复制代码
import (
	"io/ioutil"
	"os"

	"github.com/forgoer/openssl"
)

func main() {

	// 创建私钥文件
	priFile, err := os.Create("private.key") // 也可以使用buffer, priBuf := bytes.NewBuffer(nil)
	if err != nil {
		panic(err)
	}
	defer priFile.Close()
	// 生成私钥到文件
	_ = openssl.RSAGenerateKey(1024, priFile)

	// 创建公钥文件
	pubFile, err := os.Create("public.key")
	if err != nil {
		panic(err)
	}
	defer priFile.Close()

	// 通过私钥生成公钥到文件
	priByte, _ := ioutil.ReadFile("private.key")
	_ = openssl.RSAGeneratePublicKey(priByte, pubFile)
}

加解密

使用公钥加密,私钥解密。

go 复制代码
	src := []byte("123456")
	pubByte, _ := ioutil.ReadFile("public.key")
	// 公钥加密
	dst, _ := openssl.RSAEncrypt(src, pubByte)


	priByte, _ := ioutil.ReadFile("private.key")
	// 私钥解密
	res, _ := openssl.RSADecrypt(dst, priByte)


	fmt.Println(string(res)) // 123456

签名及验证

使用私钥签名,公钥验证。

go 复制代码
	// 私钥签名
	sign, err := openssl.RSASign([]byte("123456"), priByte, crypto.SHA256)
	if err != nil {
		panic(err)
	}

	// 公钥验证签名
	err = openssl.RSAVerify([]byte("123456"), sign, pubByte, crypto.SHA256)
	if err != nil {
		panic(err)
	}

这个加解密库:https://github.com/forgoer/openssl,它还支持AESDESRSAsha1Hmac-Sha1sha256Hmac-Sha256等常用算法。

原文地址:Go语言中实现RSA加解密、签名验证算法

相关推荐
onething3653 小时前
Spring Boot + Spring AI 从入门到实战:7天转型计划 Day 3 —— 消息表设计 + 级联删除 + 事务管理
人工智能·后端
其实防守也摸鱼3 小时前
软件安全与漏洞--软件安全编码与防御技术理论题库
开发语言·网络·安全·网络安全·软件安全·软件安全与漏洞
荣江3 小时前
Hermes Agent 代码仓库打包工具使用指南(repomix-rs 高性能版)
后端
x138702859573 小时前
c语言中srtlen(指针使用计算字符长度)、传值和传址调用
c语言·开发语言·算法·visual studio
王某某人3 小时前
LangChain4j 入门:Java 程序员的第一个 AI 对话程序
人工智能·后端
码农刚子3 小时前
从零开始:在 Windows 服务器上部署 Node.js 项目(小白实战教程)
后端·node.js
Cache技术分享3 小时前
435. Java 日期时间 API - Clock 灵活获取当前时间
前端·后端
iCxhust3 小时前
C#进程管理程序
开发语言·汇编·stm32·单片机·c#·微机原理
浩子coding3 小时前
通过 Spring AI Alibaba 源码,看如何玩转 ReAct 智能体范式
人工智能·后端
凡人叶枫3 小时前
Effective C++ 条款28:避免使用 handles 指向对象内部
linux·服务器·开发语言·c++·嵌入式开发