golang的RSA加密解密

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

1.加密解密工具类PasswordUtil.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.测试


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
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/905728.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringSecurity框架(入门)

简介: Spring Security 是一个用于构建安全的 Java 应用程序的框架,尤其适用于基于Spring的应用程序。它提供了全面的安全控制,从认证(Authentication)到授权(Authorization),以及…

探索C嘎嘎:初步接触STL

#1024程序员节|征文# 前言: 在前文小编讲述了模版初阶,其实讲述模版就是为了给讲STL提前铺垫,STL是C中很重要的一部分,各位读者朋友要知道它的份量,下面废话不多说,开始走进STL的世界。 目录&am…

使用Python进行数据分析入门

文章目录 Python环境搭建安装Anaconda验证安装 必备库介绍NumPyPandasMatplotlibSciPy 数据导入与清洗导入数据清洗数据 数据探索与分析描述性统计相关性分析 数据可视化绘制直方图 高级主题机器学习深度学习 总结 随着大数据时代的到来,数据分析变得越来越重要。Py…

宏组学干货|一文get宏基因组产品如何选择

大家好,小编来分享宏基因组产品选做思路喽~ 随着微生物研究的发展和高通量测序技术的出现,微生物的研究迎来了宏组学技术研究时代。目前宏组学产品种类繁多,常见项目主要包括宏基因组、宏病毒组和宏转录组。宏基因组项目可以检测宏样本中所有…

Elasticsearch —— ES 环境搭建、概念、基本操作、文档操作、SpringBoot继承ES

文章中会用到的文件,如果官网下不了可以在这下 链接: https://pan.baidu.com/s/1SeRdqLo0E0CmaVJdoZs_nQ?pwdxr76 提取码: xr76 一、 ES 环境搭建 注:环境搭建过程中的命令窗口不能关闭,关闭了服务就会关闭(除了修改设置后重启的…

【电商搜索】现代工业级电商搜索技术-亚马逊-经典的Item-to-Item协同推荐算法

【电商搜索】现代工业级电商搜索技术-亚马逊-经典的Item-to-Item协同推荐算法 文章目录 【电商搜索】现代工业级电商搜索技术-亚马逊-经典的Item-to-Item协同推荐算法1. 论文信息2. 算法介绍3. 创新点小结4. 实验效果5. 算法结论6. 代码实现7. 问题及优化方向1. 冷启动问题2. 稀…

Windows 系统安装 Hadoop 详细教程

Hadoop 是一个分布式系统基础架构,在大数据处理领域有着广泛的应用。在 Windows 系统上安装 Hadoop 虽然相对复杂一些,但只要按照步骤来,也可以顺利完成。本文将详细介绍在 Windows 系统下安装 Hadoop 的过程。 一、准备工作 下载 Hadoop 安装…

如何快速使用Cesium完成项目

要快速使用Cesium完成项目,可以按照以下步骤进行: 学习基础知识: 首先,了解Cesium的基本概念和功能。可以通过阅读Cesium的官方文档和一些入门教程来掌握基础知识。例如,可以参考“Cesium速成教程:一小时入…

记录一下方便的条件编译

1. 需要准备: 1-1、npm i cross-env -D 是跨平台的自定义编译 1-2、构造工具:vite/webpack > vite: import.meta.env.VITE_NODE_ENV > webpack:process.env.NODE_ENV这里使用vite为例子 1-3、 package.json 2. 思路与步骤 首先我们知道 axio…

前端开发转行做渗透测试,通过挖漏洞来赚钱

最近,一个做运维的朋友在学渗透测试。他说,他公司请别人做渗透测试的费用是 2w/人天,一共2周。2周 10w 的收入,好香~ 于是,我也对渗透测试产生了兴趣。开始了探索之路~ 什么是渗透测试 渗透测试这名字听起来有一种敬…

网络自动化02:基于xlsx传入设备信息与所需执行备份配置命令,使用netmiko自动化登录分发

这是这个系列第二篇 本文将仅简单介绍使用xlsx导入设备信息,并使用netmiko配置 目录 环境设备信息表格式单线程代码解释代码逻辑分析函数解析 逻辑调用图逻辑说明 遇到的问题写在最后 环境 所有设备均能与我执行Python脚本的环境互通,同时均拥有独立的ip…

Knowledge-refined Denoising Network for Robust Recommendation

Knowledge-refined Denoising Network for Robust Recommendation(Sigir23) 摘要 知识图(KG)包含丰富的边信息,是提高推荐性能和可解释性的重要组成部分。然而,现有的知识感知推荐方法直接在KG和用户-项目…

数据结构 之 图的 最小生成树(十二)

提示:本篇难点: 生成树概念的理解 重点:是普利姆算法、克鲁斯卡尔算法构造最小生成树 超超超重点的是 普利姆和克鲁斯卡尔构造最小生成树的算法,这部分可能需要同学们自行去学习了。 一定要理解后用代码能够实现这两个算法已经了解…

如何清空回收站后在 Windows 11/10 中恢复已删除的文件

这篇文章将解释如何将已删除的文件、文件夹和其他项目从回收站还原或恢复到原始位置。有时,我们最终会删除重要的文件和文件夹,然后我们不知道如何将它们恢复到原来的位置。但是您不必担心,因为这篇针对初学者的帖子将详细指导您完成所有步骤…

Axios 请求超时设置无效的问题及解决方案

文章目录 Axios 请求超时设置无效的问题及解决方案1. 引言2. 理解 Axios 的超时机制2.1 Axios 超时的工作原理2.2 超时错误的处理 3. Axios 请求超时设置无效的常见原因3.1 配置错误或遗漏3.2 超时发生在建立连接之前3.3 使用了不支持的传输协议3.4 代理服务器或中间件干扰3.5 …

不懂知识图谱的你,正在失去转行做AI产品经理的机会

伴随着AI这块新的投资风口,新兴企业对AI人才的需求也是激增。所以,你准备好了么? 一、AI来了,你被OUT了,有人却已在快车道上了 给你讲个恐怖的故事:我今年,32岁了!三十岁左右是一生…

Generating /run/initramfs/rdsosreport.txt

Linux中遇到Generating /run/initramfs/rdsosreport.txt 第一步:首先输入 ls /dev/mapper 第二步:输入 xfs_repair /dev/mapper/centos-root -L 第三步:重启reboot 不说原因了,直接上解决方式: 第一步:首先…

纯CSS实现UI设计中常见的丝带效果(5)

原文传送门:纯CSS实现UI设计中常见的丝带效果 网页中的丝带效果在设计中扮演着多重角色,其作用可以归纳为以下几个方面: 视觉吸引与装饰 增强视觉吸引力:丝带效果以其独特的形态和色彩,能够迅速吸引用户的注意力&…

OpenCV系列教程六:信用卡数字识别、人脸检测、车牌/答题卡识别、OCR

文章目录 一、信用卡数字识别1.1 模板匹配1.2 匹配多个对象1.3 处理数字模板1.4 预处理卡片信息,得到4组数字块。1.5 遍历数字块,将卡片中每个数字与模板数字进行匹配 二、人脸检测2.1人脸检测算法原理2.2 OpenCV中的人脸检测流程 三、车牌识别3.1 安装t…

音视频入门基础:FLV专题(21)——FFmpeg源码中,获取FLV文件音频信息的实现(上)

由于本文篇幅较长,分为上、中、下三篇。 一、引言 通过FFmpeg命令可以获取到FLV文件的音频压缩编码格式、音频采样率、通道数、音频码率信息: ./ffmpeg -i XXX.flv 而由《音视频入门基础:FLV专题(9)——Script Tag简…