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,一经查实,立即删除!

相关文章

umi3项目axios 请求参数序列化参数

由于get 请求中有一个日期参数 dates 是一个数组类型。 未处理参数时请求地址是这样的:/api/list?page1&pageSize10&keyWord&dates[]2024-06-10&dates[]2024-06-24 会发现dates后面有中括号,所以前端需要将参数格式处理变成如下:/api…

微软Edge浏览器搜索引擎切换全攻略

微软Edge浏览器作为Windows 10的默认浏览器,提供了丰富的功能和良好的用户体验。其中,搜索引擎的切换功能允许用户根据个人喜好和需求,快速更换搜索引擎,从而获得更加个性化的搜索服务。本文将详细介绍如何在Edge浏览器中进行搜索…

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

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

Unity 从0开始编写一个技能编辑器_03_Buff系统的Handler

BuffHandler可以是用于处理角色身上buff的Mono类,任何具备跟Buff交互的角色,都要携带这个BuffHandler脚本。如果你的Buff有额外的处理机制,比如互斥Buff(如:免疫负面效果的霸体),需要在AddBuff方…

最新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 提供的 代码扫描分析工具,它可以帮助我们发现代码结构/质量…

CONSTRAINT关键字

CREATE TABLE accounts(acctNo CHAR(20) PRIMARY KEY,balance FLOAT,CONSTRAINT c1 CHECK(balance > 0) ); 1、CONSTRAINT C1部分定义了一个新的约束,这里命名为C1 2、CHECK(BALANCE>0)是约束的具体内容,它规定了balance列的值必须大于等于0。这…

最小生成树拓展应用

文章目录 最小生成树拓展应用理论基础 题单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年),会有动态的天气系统,以及改善后的破坏系统。该作为《…

c++字典

在C中,“字典”通常指的是std::map或std::unordered_map,它们是标准库中提供的关联容器,用于存储键值对。以下是一些常见的操作示例,包括插入、访问、删除和遍历元素。 使用 std::map std::map 是一种有序的关联容器,键…

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

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

【基础篇】第1章 Elasticsearch 引言

1.1 Elasticsearch简介 1.1.1 基本概念 Elasticsearch,一个开源的分布式搜索引擎,以其强大的搜索能力和实时数据分析能力,在大数据时代脱颖而出。它基于Apache Lucene库构建,旨在提供高效、可扩展且易于使用的全文检索解决方案。…

关于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…