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

会打印出:

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

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

相关文章

一个AI图片生成工具导航网站

上周末上线了一个AI图片生成工具导航网站,主要是面向AI图片工具这个垂直领域。 https://chatgpt-image-generator.com/ 目标是通过收集当下的一些工具,然后进行分类管理,一方面方便大家发现新的工具,另一方面能够更加有针对性、…

Kotlin vs Java:深入解析两者之间的最新差异与优劣(全面指南)

文章目录 1. 概述2. 语法简洁性3. 空安全4. 扩展函数5. 协程6. 数据类7. 智能类型转换8. 默认参数与命名参数9. 无 checked exceptions10. 单例模式总结 🎉欢迎来到Java学习路线专栏~探索Java中的静态变量与实例变量 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨…

python CSSE7030

1 Introduction In this assignment, you will implement a (heavily) simplified version of the video game ”Into The Breach”. In this game players defend a set of civilian buildings from giant monsters. In order to achieve this goal, the player commands a s…

上位机图像处理和嵌入式模块部署(mcu之静态库生成和使用)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 很多同学做了很长时间的mcu和keil开发,都认为keil工程中必须包含所有的源代码,其实这是不对的。如果有一些代码我们不希望别…

游戏AI的创造思路-技术基础-深度学习(7)TF

重头戏TF,汽车人,变形~~~~ 现在广泛应用的GPT中,数据处理的关键点就是Transformer算法,多次多层的映射“变形”造就了其对自然语言处理能力的提升,但本篇介绍的内容中,Transformer算法是用来构建游戏AI的“…

深度学习经典检测方法概述

一、深度学习经典检测方法 two-stage(两阶段):Faster-rcnn Mask-Rcnn系列 one-stage(单阶段):YOLO系列 1. one-stage 最核心的优势:速度非常快,适合做实时检测任务! 但是…

【知识图谱系列】(实例)python操作neo4j构建企业间的业务往来的知识图谱

本章节通过聚焦于"金额"这一核心属性,构建了一幅知识图谱,旨在揭示"销售方"与"购买方"间的商业互动网。在这张图谱中,绿色节点象征着购买方,而红色节点则代表了销售方。这两类节点间的紧密连线,不仅映射了双方在市场活动中的合作桥梁,还特…

8个成功的原型设计案例分享

原型设计在整个产品设计过程中非常的重要,定下了整个产品的基调,想要做好原型设计,需要不断的经验的积累,新手入门最快的方式就是学习一些优秀的原型设计案例,今天就为大家分享一些可以直接使用源文件进行编辑和修改的…

Linux高级编程——线程

pthread 线程 概念 :线程是轻量级进程,一般是一个进程中的多个任务。 进程是系统中最小的资源分配单位. 线程是系统中最小的执行单位。 优点: 比多进程节省资源,可以共享变量 进程会占用&am…

SpringBoot(二)SpringBoot多环境配置

Spring框架常用注解简单介绍 SpringMVC常用注解简单介绍 SpringBoot(一)创建一个简单的SpringBoot工程 SpringBoot(二)SpringBoot多环境配置 SpringBoot(三)SpringBoot整合MyBatis SpringBoot(四…

MySQL高级-SQL优化- limit优化(覆盖索引加子查询)

文章目录 0、limit 优化0.1、从表 tb_sku 中按照 id 列进行排序,然后跳过前 9000000 条记录0.2、通过子查询获取按照 id 排序后的第 9000000 条开始的 10 条记录的 id 值,然后在原表中根据这些 id 值获取对应的完整记录 1、上传5个sql文件到 /root2、查看…

AI与学术的交响:ChatGPT辅助下的实验设计新篇章

学境思源,一键生成论文初稿: AcademicIdeas - 学境思源AI论文写作 在学术研究中,实验设计是确保研究质量和结果可信度的关键环节。这篇文章我们将为大家介绍如何利用ChatGPT辅助完成学术论文的实验设计,通过提供灵感、优化实验步…

有什么好用的ai自动绘画软件?6个软件帮助你快速进行智能绘画

有什么好用的ai自动绘画软件?6个软件帮助你快速进行智能绘画 寻找好用的AI自动绘画软件可以帮助用户快速进行智能绘画,以下是几款推荐的软件,它们能够提供不同风格和功能的绘画体验: 聪明灵犀:这是一款知名的AI艺术应…

【pytorch10】统计属性

常见统计属性 norm(范数)mean,sumprodmax,min,argmin,argmaxkthvalue,topk kthvalue求第几个的位置和第几个的值 topk求top几的这样的一个数值 norm范数 这里的norm表达的是范数的意思,norma…

多地高温持续“热力”爆表 约克VRF中央空调带你清凉舒爽一夏

“出门5分钟,流汗2小时”,夏季高温天气,怎一个“热”字了得?6月以来,我国多地迎来高温“炙烤”,全国出现40℃以上高温的范围持续增加,随着中央气象台高温预警持续拉响,人们都很纳闷:…

主流电商平台API接口(天猫获得淘宝商品详情,获得淘宝app商品详情原数据 ,获得淘口令真实url API,按图搜索淘宝商品(拍立淘) API )

主流电商平台商品接口在电商企业中具有重要应用价值。通过商品接口,电商企业可以实现商品同步功能: 商品信息同步:通过接口可以实时同步主流电商平台上的商品信息,包括商品标题、价格、库存、销量等数据,确保企业在自…

[leetcode]search-insert-position 搜索插入位置

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int searchInsert(vector<int>& nums, int target) {int left 0, right nums.size()-1;while(left <right) {int mid left (right-left)/2;if(nums[mid] target){return mid;} else if(nu…

subline设置打开文件重启一个新的窗口

问题 打开文件后&#xff0c;用的是同一个窗口的子tab页面 想要打开一个新的窗口 解决 点解preferences->setting 在右边的配置文件新增一行 “open_files_in_new_window”: “always” 保存 搞定&#xff01;

立创ESP32C3学习笔记

好的设计可以学到很多知识和细节&#xff0c;就如同学会一个数学知识点最好的方法是做典型例题。 乐鑫关于产品的硬件设计都有硬件设计指南&#xff0c;设计板子的时候需要仔细阅读&#xff1a; 原理图设计 - ESP32-C3 - — ESP 硬件设计指南 latest 文档 (espressif.com) 技…

IP地址查询和代理服务器:双重保护隐私

随着网络应用的日益普及&#xff0c;我们的个人信息和数据安全面临前所未有的挑战。在此背景下&#xff0c;IP地址查询和代理服务器成为保护个人隐私和网络安全的两大关键工具。本文将从IP地址查询的原理和应用出发&#xff0c;深入剖析代理服务器在网络隐私保护中的作用&#…