当前位置: 首页 > news >正文

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

会打印出:

相关文章:

  • Nosql期末复习
  • 机器人----四元素
  • Cocos制作抖音小游戏接入侧边栏复访接口实例
  • 6.29学习笔记
  • 【RabbitMQ实战】Springboot 整合RabbitMQ组件,多种编码示例,带你实践 看完这一篇就够了
  • ONLYOFFICE 桌面编辑器 8.1全新发布,更强大的编辑工具
  • C# 警告 warning MSB3884: 无法找到规则集文件“MinimumRecommendedRules.ruleset”
  • 终极指南:RNNS、Transformers 和 Diffusion 模型
  • Stirling PDF 部署 - 强大的PDF Web在线编辑工具箱
  • Linux环境安装配置nginx服务流程
  • Linux:网络基础1
  • Python基础之错误和异常讲解
  • ArkTS自定义组件
  • 【D3.js in Action 3 精译】1.2.2 可缩放矢量图形(三)
  • GCP FrontendConfig 详解:优化您的云负载均衡
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • Bytom交易说明(账户管理模式)
  • C++类的相互关联
  • ERLANG 网工修炼笔记 ---- UDP
  • JavaScript设计模式系列一:工厂模式
  • java取消线程实例
  • learning koa2.x
  • ng6--错误信息小结(持续更新)
  • node学习系列之简单文件上传
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • React组件设计模式(一)
  • 从setTimeout-setInterval看JS线程
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 汉诺塔算法
  • 基于webpack 的 vue 多页架构
  • 蓝海存储开关机注意事项总结
  • 前端面试题总结
  • 网络应用优化——时延与带宽
  • 【干货分享】dos命令大全
  • NLPIR智能语义技术让大数据挖掘更简单
  • puppet连载22:define用法
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • ​ubuntu下安装kvm虚拟机
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • #07【面试问题整理】嵌入式软件工程师
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (一)基于IDEA的JAVA基础12
  • (正则)提取页面里的img标签
  • (转)树状数组
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .Family_物联网
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .net6使用Sejil可视化日志
  • .net经典笔试题
  • .NET命名规范和开发约定
  • /run/containerd/containerd.sock connect: connection refused