golang使用RSA加密和解密

目录

前提

生成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 mainimport ("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.PublicKeyrsaPub, 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 mainimport ("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.mzph.cn/bicheng/37002.shtml

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

相关文章

同步模式之保护性暂停模式

1. Guarded Suspension:一个线程需要等待另一个线程的执行结果 2. 理解 一个线程需要将结果传递给另一个线程,将这两个线程关联到到同一个 GuardedObject 如果需要源源不断地传递结果,需要使用消息队列(生产者-消费者模型&…

最新AIGC系统源码-ChatGPT商业版系统源码,自定义ChatGPT指令Promp提示词,AI绘画系统,AI换脸、多模态识图理解文档分析

目录 一、前言 系统文档 二、系统演示 核心AI能力 系统快速体验 三、系统功能模块 3.1 AI全模型支持/插件系统 AI模型提问 文档分析 ​识图理解能力 3.2 GPts应用 3.2.1 GPTs应用 3.2.2 GPTs工作台 3.2.3 自定义创建Promp指令预设应用 3.3 AI专业绘画 3.3.1 文…

【51单片机入门】数码管原理

文章目录 前言共阴极与共阳极数码管多个数码管显示原理 总结 前言 在我们的日常生活中,数码管被广泛应用于各种电子设备中,如电子表、计时器、电子钟等。数码管的主要功能是显示数字和一些特殊字符。在这篇文章中,我们将探讨数码管的工作原理…

SpringMVC启动流程

文章目录 引文HandlerHandlerMapperHandlerAdapterRequestMapping方法参数解析RequestMapping方法返回值解析文件上传流程拦截器解析 SpringMVC启动流程如下 引文 我们在使用SpringMVC时,传统的方式是在webapp目录下定义一个web.xml文件,比如&#xff1a…

PerplexityAI与《连线》杂志纠纷事件深度分析

引言 最近,PerplexityAI,这家人工智能搜索领域的新秀公司,因被《连线》杂志指控剽窃内容和捏造事实而陷入困境。这起事件引发了广泛关注,也揭示了AI技术在信息检索和内容生成领域面临的一系列挑战。本文将对该事件进行详细分析&a…

Android Lint

文章目录 Android Lint概述工作流程Lint 问题问题种类警告严重性检查规则 用命令运行 LintAndroidStudio 使用 Lint忽略 Lint 警告gradle 配置 Lint查找无用资源文件 Android Lint 概述 Lint 是 Android 提供的 代码扫描分析工具,它可以帮助我们发现代码结构/质量…

最小生成树拓展应用

文章目录 最小生成树拓展应用理论基础 题单1. [新的开始](https://www.acwing.com/problem/content/1148/)2. [北极通讯网络](https://www.acwing.com/problem/content/1147/)3. [走廊泼水节](https://www.acwing.com/problem/content/348/)4. [秘密的牛奶运输](https://www.ac…

用英文介绍芝加哥(1):Making Modern Chicago Part 1 Building a Boomtown

Making Modern Chicago | Part 1: Building a Boomtown Link: https://www.youtube.com/watch?vpNdX0Dm-J8Y&listPLmSQiOQJmbZ7TU39cyx7gizM9i8nOuZXy&index4 Summary Summary of Chicago’s History and Development Urban Planning and Growth Chicago, often r…

无需向量量化的自回归图像生成

摘要 https://arxiv.org/pdf/2406.11838 传统观点认为,用于图像生成的自回归模型通常伴随着向量量化的标记。我们观察到,尽管离散值空间可以方便地表示分类分布,但它对于自回归建模来说并不是必需的。在这项工作中,我们提出使用扩…

战地战地风云最强的免费加速器 2024低延迟不卡顿加速器推荐

来喽来喽,steam夏季促销它又来喽,战地风云,第一人称射击游戏,而且这次迎来了史低,游戏背景设定为近未来(公元2042年),会有动态的天气系统,以及改善后的破坏系统。该作为《…

开源模型应用落地-FastAPI-助力模型交互-WebSocket篇(三)

一、前言 使用 FastAPI 可以帮助我们更简单高效地部署 AI 交互业务。FastAPI 提供了快速构建 API 的能力,开发者可以轻松地定义模型需要的输入和输出格式,并编写好相应的业务逻辑。 FastAPI 的异步高性能架构,可以有效支持大量并发的预测请求,为用户提供流畅的交互体验。此外,F…

关于Mac mini 10G网口的问题

问题: 购入一个10G网口的Mac mini M2,将其和自己的2.5G交换机连接,使用共享屏幕进行远程操作的过程中出现了频率极高的卡顿,几乎是几秒钟卡一下,使用ping进行测试发现卡的时候就ping不通了。测试使用Mac mini的无线网和雷电转2.5G…

React Native 开发常见问题及注意事项

本文只是使用时积累的一些经验 开发环境 1、Android Studio 依赖项下载慢 如果发现依赖下载非常慢,动不动十几KB的 参考:加速 Android Studio 依赖项下载 也可以切换数据源 修改 android/build.gradle中的jcenter()和google() repositories {// goo…

人脑计算机技术与Neuroplatform:未来计算的革命性进展

引言 想象一下,你在某个清晨醒来,准备开始一天的工作,而实际上你的大脑正作为一台生物计算机的核心,处理着大量复杂的信息。这并非科幻电影的情节,而是人脑计算机技术即将带来的现实。本文将深入探讨FinalSpark公司的…

选择适合你的8款原型设计工具

随着互联网的飞速发展,设计行业逐渐成为近年来的热门职业。设计师们需要的掌握的技能也越来越多,例如海报设计、名片设计、产品设计、网页设计等。产品原型设计就是产品设计中非常重要的一个阶段,主要目的是帮助用户更容易了解产品设计的思路…

深度学习 —— 1.单一神经元

深度学习初级课程 1.单一神经元2.深度神经网络3.随机梯度下降法4.过拟合和欠拟合5.剪枝、批量标准化6.二分类 前言 本套课程仍为 kaggle 课程《Intro to Deep Learning》,仍按之前《机器学习》系列课程模式进行。前一系列《Keras入门教程》内容,与本系列…

【机器学习】Whisper:开源语音转文本(speech-to-text)大模型实战

目录 一、引言 二、Whisper 模型原理 2.1 模型架构 2.2 语音处理 2.3 文本处理 三、Whisper 模型实战 3.1 环境安装 3.2 模型下载 3.3 模型推理 3.4 完整代码 3.5 模型部署 四、总结 一、引言 上一篇对​​​​​​​ChatTTS文本转语音模型原理和实战进行了讲解&a…

【语义分割系列】基于cityscape的DDRNet算法

基于cityscape的DDRNet算法 前言 DDRNet是专门为实时语义分割设计的高效主干。该模型由两个深度分支组成,在这两个分支之间执行多次双边融合,并且还设计了一个新的上下文信息抽取器,名为深度聚合金字塔池模块(DAPPM),用于扩大有效的接受域,并基于低分辨率特征映射融合…

计算机网络——数据链路层(数据链路层概述及基本问题)

链路、数据链路和帧的概念 数据链路层在物理层提供服务的基础上向网络层提供服务,其主要作用是加强物理层传输原始比特流的功能,将物理层提供的可能出错的物理连接改造为逻辑上无差错的数据链路,使之对网络层表现为一条无差错的链路。 链路(…

Steam夏促史低游戏推荐 Steam夏促哪有游戏值得入手

steam夏季促销来袭,有这很多的游戏都进行打折出售,而且还有这很多的游戏都迎来了史低,简直是白送,很多玩家都想趁着这个时间入手自己喜欢的游戏,为了方便大家了解,下面我给大家带来steam夏季促销史低的游戏…