golang使用RSA加密和解密

发布于:2024-07-02 ⋅ 阅读:(15) ⋅ 点赞:(0)

目录

前提

生成RSA公钥和密钥

读取文件

加密

解密


前提

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

生成RSA公钥和密钥

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

生成RSA公钥和密钥icon-default.png?t=N7T8https://blog.csdn.net/longfeng995/article/details/140042658

读取文件

在加密前,我们需要读取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

会打印出: