golang使用RSA加密和解密

news2024/10/6 1:42:10

目录

前提

生成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

会打印出:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在 Java 中的使用Selenium 测试框架

Selenium 测试框架:在 Java 中的使用 Selenium 测试框架就是这样一个强大的工具,它为 Web 应用的自动化测试提供了全面且高效的解决方案。 一、Selenium 简介 Selenium 是一个开源的自动化测试工具集,专门用于测试 Web 应用程序。它支持多…

Camera Raw:编辑 - 曲线

Camera Raw “编辑”模块中的曲线 Curve面板提供了曲线这一强大的工具,通过精确控制亮度和对比度,以及调整红、绿、蓝通道的曲线,可以显著提升图像的视觉效果和色彩表现。这些调整工具为摄影师和图像编辑者提供了丰富的创意可能性&#xff0c…

Cesium 在加载 3dTiles 如何如何获取ID

文章目录 问题分析问题 加载的 3dTiles 打印content.getFeature(i)出来后如图所示,想获取到id值 分析 var tileset = mapLayer.init3dTileLayer({url:it.url,maximumMemoryUsage: it.maximumMemoryUsage,

python查找支撑数 青少年编程电子学会python编程等级考试三级真题解析2022年3月

目录 python查找支撑数 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序代码 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python查找支撑数 2022年3月 python编程等级考试级编程题 一、题目要求…

金融科技:重塑用户体验,驱动满意度飙升

随着科技的飞速发展,金融科技(FinTech)已经深入到我们生活的每一个角落,从日常支付到投资理财,再到跨境汇款,它都在悄无声息地改变着我们的金融行为。而在这背后一个不可忽视的驱动力就是金融科技对用户体验…

kubernetes给指定用户分配调用k8s的api权限

文章目录 概要利用RBAC添加角色权限使用shell命令创建角色权限使用配置文件创建角色权限 调用k8s的api获取k8s账户的token 小结 概要 使用kubernetes部署项目时,有些特殊场景,我们需要在自己创建的pod里面调用k8s的api来管理k8s,但是需要使用…

Ubuntu24.04之安装KVM(二百五十五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

牛客小白月赛97:D走一个大整数迷宫

链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 给一个 nmn\times mnm 矩阵迷宫, 第 iii 行第 jjj 列的值为 ci,jc_{i,j}ci,j​ ,LHLHLH 在迷宫中迷路了,他需要你的帮助。 LHLHLH 当前在 (1,1)(1…

Linux基础 - Samba 或 NFS 实现文件共享

目录 零. 简介 一. Samba 二. NFS 三. 总结 零. 简介 在 Linux 系统中,Samba 和 NFS 是两种常见的用于实现文件共享的方式,它们各有特点。 Samba 主要用于在 Linux 和 Windows 系统之间实现文件和打印机共享。它基于 SMB(Server Message…

[Leetcode刷题] - 栅栏涂漆DP类问题

题目描述 这一类题目通常会问给定一组房子n和一组染料k去涂漆,并且会加入限制条件比如:某种颜色只能使用1次,相相邻房子不能涂同一种颜色,或者最多不能超过连续3个房子涂想通过颜色等等,让我们列举所有可能性总和&…

企智汇PaaS平台:数字化时代下的项目管理利器

企智汇项目管理系统PaaS平台是一个强大而灵活的平台,旨在为企业提供高效、智能的项目管理解决方案。在项目管理领域提供了显著的优势,这些优势主要体现在以下几个方面: 1.快速部署与迭代:企智汇一体化PaaS平台提供了预配置的基础…

代理IP如何助力旅游信息聚合?

在数字化时代,旅游信息聚合对于提升服务质量、优化用户体验起着至关重要的作用。随着在线旅游预订的普及,旅游信息的采集、整合和呈现成为了一个复杂而关键的过程。在这个过程中,代理IP技术以其独特的优势,为旅游信息聚合提供了强…

STM32介绍和资料地址

STM32标准外设软件库 https://www.st.com.cn/zh/embedded-software/stm32-standard-peripheral-libraries.html 支持标准外设库的产品系列:

ROS2开发机器人移动

.创建功能包和节点 这里我们设计两个节点 example_interfaces_robot_01,机器人节点,对外提供控制机器人移动服务并发布机器人的状态。 example_interfaces_control_01,控制节点,发送机器人移动请求,订阅机器人状态话题…

【升压电子烟方案】DC-DC电源升压恒压芯片FP6277+全极低功耗霍尔MH251在电子烟中的应用

电子烟是一种新型烟草制品,由于其健康、环保和口感多样化的特点,逐渐受到了消费者的青睐。 升压芯片作为电子烟的核心组件之一,主要作用是将输入的电压升高至合适的工作电压,霍尔传感器控制电子烟的使用状态,以确保电子…

【笔记】Spring Cloud Gateway 实现 gRPC 代理

Spring Cloud Gateway 在 3.1.x 版本中增加了针对 gRPC 的网关代理功能支持,本片文章描述一下如何实现相关支持.本文主要基于 Spring Cloud Gateway 的 官方文档 进行一个实践练习。有兴趣的可以翻看官方文档。 由于 Grpc 是基于 HTTP2 协议进行传输的,因此 Srping …

已解决java.security.acl.LastOwnerException:无法移除最后一个所有者的正确解决方法,亲测有效!!!

已解决java.security.acl.LastOwnerException:无法移除最后一个所有者的正确解决方法,亲测有效!!! 目录 问题分析 出现问题的场景 报错原因 解决思路 解决方法 1. 检查当前所有者数量 2. 添加新的所有者 3. 维…

【Python系列】Python 中循环依赖问题及其解决方案

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

CAN和CANFD数据写入.asc文件的dll

因为工作需要,需要做一些硬件不是CANoe的上位机(比如说周立功CAN,NI-CAN),上位机需要有记录数据的功能,所以用Qt制作了一个记录数据的dll,方便重复使用(因为有的客户指定了编程软件,…

Spring框架整体概念

Spring框架基础概念 首先, 从Spring框架的整体架构和组成对整体框架有个认知。 Spring基础 - Spring和Spring框架组成 上图是从官网4.2.x获取的原图,目前我们使用最广法的版本应该都是5.x,5版本移除了Web模块中的Portlet子模块,新…