golang的RSA加密解密

参考:https://blog.csdn.net/lady_killer9/article/details/118026802

1.加密解密工具类PasswordUtil.go

Go 复制代码
package util

import (
	"crypto/rand"
	"crypto/rsa"
	"crypto/x509"
	"encoding/pem"
	"fmt"
	"log"
	"os"
	"runtime"
)

// RSA 加密解密


//生成密钥对
func GenerateRsaKey(keySize int, dirPath string) error {
	privateKey,err := rsa.GenerateKey(rand.Reader,keySize)
	if err != nil{
		_, file, line, _ := runtime.Caller(0)
		return Error(file,line+1,err.Error())
	}
	// x509
	derText :=x509.MarshalPKCS1PrivateKey(privateKey)
	// pem Block
	block := &pem.Block{
		Type:"rsa private key",
		Bytes:derText,
	}
	// just joint, caller must let dirPath right
	file,err := os.Create(dirPath+"private.pem")
	defer file.Close()
	if err != nil{
		_, file, line, _ := runtime.Caller(0)
		return Error(file,line+1,err.Error())
	}
	err = pem.Encode(file,block)
	if err != nil{
		_, file, line, _ := runtime.Caller(0)
		return Error(file,line+1,err.Error())
	}
	// get PublicKey from privateKey
	publicKey := privateKey.PublicKey
	derStream,err := x509.MarshalPKIXPublicKey(&publicKey)
	if err != nil{
		_, file, line, _ := runtime.Caller(0)
		return Error(file,line+1,err.Error())
	}
	block = &pem.Block{
		Type:"rsa public key",
		Bytes:derStream,
	}
	file,err = os.Create(dirPath+"public.pem")
	if err != nil{
		_, file, line, _ := runtime.Caller(0)
		return Error(file,line+1,err.Error())
	}
	err = pem.Encode(file, block)
	if err != nil{
		_, file, line, _ := runtime.Caller(0)
		return Error(file,line+1,err.Error())
	}
	return nil
}





//加密
func RsaEncrypt(plainText []byte,filePath string) ([]byte, error) {
	// get pem.Block
	block,err := GetKey(filePath)
	if err != nil{
		_, file, line, _ := runtime.Caller(0)
		return nil,Error(file,line+1,err.Error())
	}
	// X509
	publicInterface,err := x509.ParsePKIXPublicKey(block.Bytes)
	if err != nil{
		_, file, line, _ := runtime.Caller(0)
		return nil,Error(file,line+1,err.Error())
	}
	publicKey,flag := publicInterface.(*rsa.PublicKey)
	if flag == false{
		_, file, line, _ := runtime.Caller(0)
		return nil,Error(file,line+1, "加密发生异常==================="/*errors.RsatransError*/)
		log.Println(file)
		log.Println(line)
		//log.Println("发生异常==============================")
	}
	// encrypt
	cipherText, err := rsa.EncryptPKCS1v15(rand.Reader, publicKey, plainText)
	if err != nil{
		_, file, line, _ := runtime.Caller(0)
		return nil,Error(file,line+1,err.Error())
	}
	return cipherText,nil
}





//解密
func RsaDecrypt(cipherText []byte,filePath string) (plainText []byte,err error) {
	// get pem.Block
	block,err := GetKey(filePath)
	if err != nil{
		_, file, line, _ := runtime.Caller(0)
		return nil,Error(file,line+1,err.Error())
	}
	// get privateKey
	privateKey, _ := x509.ParsePKCS1PrivateKey(block.Bytes)
	defer func() {
		if err2 := recover();err2 != nil{
			_, file, line, _ := runtime.Caller(0)
			err = Error(file,line,"解密发生异常==================")
		}
	}()
	// get plainText use privateKey
	plainText, err3 := rsa.DecryptPKCS1v15(rand.Reader, privateKey, cipherText)
	if err3 != nil{
		_, file, line, _ := runtime.Caller(0)
		return nil,Error(file,line+1,err3.Error())
	}
	return plainText,err
}













// 读取公钥/私钥文件,获取解码的pem块
// filePath文件路径
// 返回pem块和错误
func GetKey(filePath string) (*pem.Block,error)  {
	file,err := os.Open(filePath)
	defer file.Close()
	if err != nil{
		_, file, line, _ := runtime.Caller(0)
		return nil,Error(file,line+1,err.Error())
	}
	fileInfo,err := file.Stat()
	if err != nil{
		_, file, line, _ := runtime.Caller(0)
		return nil,Error(file,line+1,err.Error())
	}
	buf := make([]byte,fileInfo.Size())
	_, err = file.Read(buf)
	if err != nil{
		_, file, line, _ := runtime.Caller(0)
		return nil,Error(file,line+1,err.Error())
	}
	block, _ := pem.Decode(buf)
	return block,err
}


// 错误格式化
func Error(file string,line int,err string) error {
	return fmt.Errorf("file:%s line:%d error:%s",file,line,err)
}

2.测试

Go 复制代码
func Rsapassword(c *gin.Context, loginBody *sysEntity.LoginBody) []map[string]interface{} {
	var resultList []map[string]interface{}
	//参数接收
	//userName := loginBody.UserName
	//password := loginBody.Password

	//生成密钥对
	err := sysUtil.GenerateRsaKey(1024, "./")
	if err != nil {
		log.Println("==================生成密钥对发生异常")
		fmt.Println(err)
	}

	//加密
	plainText := []byte("123456")
	cipherText, err := sysUtil.RsaEncrypt(plainText, "./public.pem")
	if err != nil {
		fmt.Println(err)
		log.Println("==================加密发生异常")
	}
	fmt.Printf("加密后为:%s\n",cipherText)

	//解密
	plainText,err = sysUtil.RsaDecrypt(cipherText,"./private.pem")
	if err!=nil{
		log.Println("==================解密发生异常")
		fmt.Println(err)
	}
	fmt.Printf("解密后为:%s\n",plainText)

	return resultList
}
相关推荐
吴梓穆2 分钟前
UE5 C++ 注册 开始重叠和结束重叠事件
开发语言·c++·ue5
AI玫瑰助手5 分钟前
Python函数:内置函数(len/max/min/sorted等)详解
android·开发语言·python
oqX0Cazj29 分钟前
Go-Zero数据库事务实战:本地事务+失败自动回滚+生产避坑+简单分布式事务方案
数据库·分布式·golang
咸鱼翻身小阿橙13 分钟前
C# WinForms 控件学习项目
开发语言·学习·c#
右耳朵猫AI14 分钟前
Go周刊2026W22 | GoReleaser 2.16、chi 5.3、tldx 1.4、wazero 1.12、Buf 1.70
开发语言·后端·golang
AI人工智能+电脑小能手19 分钟前
【大白话说Java面试题 第105题】【并发篇】第5题:说一下 synchronized 关键字的底层原理?
java·开发语言·面试
yueping221 分钟前
【无标题】
java·开发语言
摇滚侠22 分钟前
Spring 零基础入门到进阶 基于 XML 管理 Bean 29-37
xml·java·数据库·后端·spring·intellij-idea
踏着七彩祥云的小丑26 分钟前
Go学习第3天:变量+常量+运算符
开发语言·学习·golang·go
专注搞钱27 分钟前
用Python写了个SPC自动分析工具,效率提升10倍
开发语言·python