it编程 > 前端脚本 > Golang

golang使用RSA加密和解密的实现示例

4人参与 2025-04-24 Golang

前提

本文章我们是先读取的rsa文件,所以需要先生成rsa,并且保存在文件中,再进行加密

生成rsa公钥和密钥

如果没有公钥和密钥,可以先看看我上一篇文章

生成rsa公钥和密钥

读取文件

在加密前,我们需要读取rsa文件内容,关于读取文件内容,我封装了一个"获取文件内容"的方法:

// getfilecontent 获取文件内容
func getfilecontent(filepath string) (string, error) {
	file, err := os.open(filepath)
	if err != nil {
		return "", err
	}
	defer file.close()
	inputreader := bufio.newreader(file)
	s := ""
	for {
		inputstring, readererror := inputreader.readstring('\n')
		s = fmt.sprintf("%s%s", s, inputstring)
		if readererror == io.eof {
			break
		}
	}
	return s, nil
}

因为我们要读取 公钥 和 密钥 两个文件,所以避免重复的代码,我们封装了这么个方法,避免重复的代码。

加密

package main

import (
	"crypto/rand"
	"crypto/rsa"
	"crypto/sha256"
	"crypto/x509"
	"demo-mall-api-user/internal/utils"
	"encoding/base64"
	"encoding/pem"
	"fmt"
)

func main() {
	// 定义目录和文件
	dirpath := "/app/rsa"
	filename := "public.pem"
	filepath := fmt.sprintf("%s/%s", dirpath, filename)  // 拼接成完整的文件地址

	publiccontent, err := utils.getfilecontent(filepath) // 读取文件内容
	if err != nil {
		fmt.println("读取公钥文件错误:", err.error())
		return
	}

	// 解析pem格式的数据
	block, _ := pem.decode([]byte(publiccontent))
	if block == nil || block.type != "public key" {
		fmt.println("公钥类型错误")
		return
	}

	// 解析公钥
	publickey, _ := x509.parsepkixpublickey(block.bytes)
	// 类型断言为*rsa.publickey
	rsapub, ok := publickey.(*rsa.publickey)
	if !ok {
		fmt.println("public key is not rsa")
		return
	}

	// 待加密的字符串
	message := []byte("lucky")
	// 标签,可以为空,如果加密时定义了某个值,解密时也需要用相同的值
	label := []byte("")
	ciphertext, err := rsa.encryptoaep(sha256.new(), rand.reader, rsapub, message, label)

	// 转换为base64编码的字符串
	hexstr := base64.stdencoding.encodetostring(ciphertext)

	fmt.println("加密前的数据:", string(message))
	fmt.println("加密后:", hexstr)
}

运行程序:

go run main.go

会打印出:

以上,我们就得到了加密后的数据

解密

package main

import (
	"crypto/rand"
	"crypto/rsa"
	"crypto/sha256"
	"crypto/x509"
	"demo-mall-api-user/internal/utils"
	"encoding/base64"
	"encoding/pem"
	"fmt"
	"log"
)

func main() {
	// 定义目录和文件
	dirpath := "/app/rsa"
	filename := "private.key"
	filepath := fmt.sprintf("%s/%s", dirpath, filename) // 拼接成完整的文件地址

	privatecontent, err := utils.getfilecontent(filepath) // 读取文件内容
	if err != nil {
		fmt.println("读取密钥文件错误:", err.error())
		return
	}

	// 解析pem格式的数据
	block, _ := pem.decode([]byte(privatecontent))
	if block == nil || block.type != "rsa private key" {
		fmt.println("私钥类型错误")
		return
	}
	// 解析密钥
	privatekey, _ := x509.parsepkcs1privatekey(block.bytes)

	// 待解密的字符串
	encodedciphertext := "br8ixceog4/ew63vef/lnbiataapidh6ozxb96vsgewr+dm98e1kcppvvroggw7gjfdk2gxldn8kuk4beosxukdie9fupby+v58k83zwpycy2andymfkbiog9dvddtr41ktxrp3+lr1+ztozuivjmuerbqmarnvcwf/2alq/4qn7bbzo4c0opxhij9bofan+elbmqlmfb4drcydonbu49i95xjziuv9wdlrlstd+xnmxjc3jdaftyhdgw9abdrqjgilacpjxmszhyqkceowcm16zjgn+omzarvc6o6acclryitcgog2utt4c5fddrsogqmeulu1971b7dpetthey3g=="

	// 标签,可以为空,如果加密时定义了某个值,解密时也需要用相同的值
	label := []byte("")

	// base64编码的字符串解码
	ciphertext, err := base64.stdencoding.decodestring(encodedciphertext)
	if err != nil {
		log.fatalf("failed to decode base64 ciphertext: %v", err)
		return
	}

	// 使用私钥进行解密
	plaintext, err := rsa.decryptoaep(sha256.new(), rand.reader, privatekey, ciphertext, label)
	if err != nil {
		log.fatalf("error decrypting message: %s", err)
		return
	}
	fmt.println("解密前的数据:", encodedciphertext)
	fmt.println("解密后:", string(plaintext))
}

运行程序:

go run main.go

会打印出:

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

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

GORM框架实现分页的示例代码

04-24

gin+gorm实现goweb项目的示例代码

04-24

golang中进行条件编译的示例详解

04-24

Go语言标准库中math模块详细功能介绍与示例代码

04-24

golang 日志log与logrus示例详解

04-24

Go语言中html/template模块详细功能介绍与示例代码

04-24

猜你喜欢

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

发表评论