golang中的RSA算法,加密解密,签名校验,导出公钥密钥,导入公钥密钥
RSA算法广泛应用与数据加密(比如 SSL 传输层加密),数字签名(比如支付宝的支付签名)。
1、加密解密
// encrypts the given message with RSA-OAEP
func f1() {// random 用来生成随机的素数rsaPriviteKey, err := rsa.GenerateKey(rand.Reader, 1024)if err != nil {log.Fatal(err)}str := "raoxiaoya"encdata, err := rsa.EncryptOAEP(sha256.New(), rand.Reader, &rsaPriviteKey.PublicKey, []byte(str), nil)if err != nil {log.Fatal(err)}log.Println(hex.EncodeToString(encdata))decdata, err := rsa.DecryptOAEP(sha256.New(), nil, rsaPriviteKey, encdata, nil)if err != nil {log.Fatal(err)}log.Println(string(decdata))// 通用的 Decode 方法decdata2, err2 := rsaPriviteKey.Decrypt(rand.Reader, encdata, &rsa.OAEPOptions{Hash: crypto.SHA256, Label: nil})if err2 != nil {log.Fatal(err2)}log.Println(string(decdata2))
}// encrypts the given message with RSA and the padding scheme from PKCS #1 v1.5
func f2() {rsaPriviteKey, err := rsa.GenerateKey(rand.Reader, 1024)if err != nil {log.Fatal(err)}str := "raoxiaoya"encdata, err := rsa.EncryptPKCS1v15(rand.Reader, &rsaPriviteKey.PublicKey, []byte(str))if err != nil {log.Fatal(err)}log.Println(hex.EncodeToString(encdata))decdata, err := rsa.DecryptPKCS1v15(nil, rsaPriviteKey, encdata)if err != nil {log.Fatal(err)}log.Println(string(decdata))// 通用的 Decode 方法decdata2, err2 := rsaPriviteKey.Decrypt(rand.Reader, encdata, nil)if err2 != nil {log.Fatal(err2)}log.Println(string(decdata2))
}
2、数字签名
func f3() {rsaPriviteKey, err := rsa.GenerateKey(rand.Reader, 1024)if err != nil {log.Fatal(err)}str := []byte("raoxiaoya")// 由于 rsa 算法比较慢,所以先使用哈希算法来缩短加密的数据hashed := sha256.Sum256(str)// random 参数是预留问题,可以设置为nil// 使用私钥来签名signature, err := rsa.SignPKCS1v15(nil, rsaPriviteKey, crypto.SHA256, hashed[:])if err != nil {log.Fatal(err)}log.Println(hex.EncodeToString(signature))// 使用公钥来验证签名err = rsa.VerifyPKCS1v15(&rsaPriviteKey.PublicKey, crypto.SHA256, hashed[:], signature)log.Fatal(err)
}
3、将RSA密钥导出到PEM文件
func f4() {rsaPriviteKey, err := rsa.GenerateKey(rand.Reader, 1024)if err != nil {log.Fatal(err)}pri := x509.MarshalPKCS1PrivateKey(rsaPriviteKey)block := &pem.Block{Type: "RSA PRIVATE KEY",Bytes: pri,}file, err := os.Create("private.pem")if err != nil {log.Fatal(err)}err = pem.Encode(file, block)if err != nil {log.Fatal(err)}pub := x509.MarshalPKCS1PublicKey(&rsaPriviteKey.PublicKey)block2 := &pem.Block{Type: "PUBLIC KEY",Bytes: pub,}file2, err2 := os.Create("public.pem")if err2 != nil {log.Fatal(err2)}err2 = pem.Encode(file2, block2)if err2 != nil {log.Fatal(err2)}
}
文件内容如下
-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQDFgklwSCKCIdoMoPbRrS/kYAlHfbq6SyjBx+6rvQ8muGEBtt+n
SwQQEsPRGyIfe/bN/E0lh1iONqhO3z1qiQoOGc1mAlq3/So8dXOx3HWTGyhbvKZi
O/suGsjAx/OIrmeaHuypMK5uY2TXx0CI2a4h3JyQ/X9WzfCZRs3uZhAb6wIDAQAB
AoGBAKSTQMBnyyFmNbxKMABdcEe64mCI2pw63nZCM5U1DzfzcRmtmUVcE8GU8Uf/
dPqJIAlaD6qS0e6Gis5V5GYuVIoejjruEZDVLB/VULg3hqFrwHmjCxZ8tevQxAXf
nFMO0pycmLB4MIh2PlupSdN7QACAnFY/DQatiV7xjfHzll0hAkEA5ghQrDDEqLfn
fau5rK5K3+Gi8W8z++GMizWUnlxJMKrJycTcoYnDUFCb/W2Q39WTvEFNBSfSIzg3
iFqGXiEU0QJBANvOE7ySosZTGLoHptdueH3MMqN351QZ8okyCWwf9kQS1sI8dBl9
4BrTAccR7YfxQuzk0CK5QJPcqLRhvEPOQ/sCQQDYcgaGnzTMlI7LnyQMqctmMcfC
aaJ+ZVJ7QqVfBPMRSgKpSgVYMmqHTfIZWlkxZKOoRcGVEk0WOrV2Jce9Fl+hAkEA
ryob+mQVCd2A0Ad3AymLJh0Loc/U7uW6rXDNp3gVJgypTqMklogEhvvu57i2xWYT
wntaDsH435yyaQWWJacD7wJAQ8ShSWEWThuS+OgRh9j/UpFzXi5MKolQdnWefYCd
2QZRir4eF27Y0TaRr4YvDSddmHW+yGa0Uy2xcWooSSUQSQ==
-----END RSA PRIVATE KEY-----
-----BEGIN PUBLIC KEY-----
MIGJAoGBAMWCSXBIIoIh2gyg9tGtL+RgCUd9urpLKMHH7qu9Dya4YQG236dLBBAS
w9EbIh979s38TSWHWI42qE7fPWqJCg4ZzWYCWrf9Kjx1c7HcdZMbKFu8pmI7+y4a
yMDH84iuZ5oe7Kkwrm5jZNfHQIjZriHcnJD9f1bN8JlGze5mEBvrAgMBAAE=
-----END PUBLIC KEY-----
4、加载现有的RSA密钥文件进行加密解密
func f5() {// load public.pempf, err := os.Open("public.pem")if err != nil {log.Fatal(err)}pfc, err := io.ReadAll(pf)if err != nil {log.Fatal(err)}block, _ := pem.Decode(pfc)if block == nil {log.Fatal("pem decode fail.")}rsaPublicKey, err := x509.ParsePKCS1PublicKey(block.Bytes)if err != nil {log.Fatal(err)}// load private.pempvf, err := os.Open("private.pem")if err != nil {log.Fatal(err)}pvfc, err := io.ReadAll(pvf)if err != nil {log.Fatal(err)}blockv, _ := pem.Decode(pvfc)if block == nil {log.Fatal("pem decode fail.")}rsaPrivateKey, err := x509.ParsePKCS1PrivateKey(blockv.Bytes)if err != nil {log.Fatal(err)}// teststr := "raoxiaoya"encdata, err := rsa.EncryptPKCS1v15(rand.Reader, rsaPublicKey, []byte(str))if err != nil {log.Fatal(err)}log.Println(hex.EncodeToString(encdata))decdata, err := rsa.DecryptPKCS1v15(nil, rsaPrivateKey, encdata)if err != nil {log.Fatal(err)}log.Println(string(decdata))
}
5、使用openssl程序生成RSA公钥密钥
openssl genrsa -out rsa_private_key.pem 1024openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
相关文章:
golang中的RSA算法,加密解密,签名校验,导出公钥密钥,导入公钥密钥
RSA算法广泛应用与数据加密(比如 SSL 传输层加密),数字签名(比如支付宝的支付签名)。 1、加密解密 // encrypts the given message with RSA-OAEP func f1() {// random 用来生成随机的素数rsaPriviteKey, err : rsa…...
修炼k8s+flink+hdfs+dlink(四:k8s(二)组件)
一:控制平面组件。 控制平面组件会为集群做出全局决策,比如资源的调度。 以及检测和响应集群事件,例如当不满足部署的 replicas 字段时, 要启动新的 pod)。 1. kube-apiserver。 该组件负责公开了 Kubernetes API&a…...
Android约束布局ConstraintLayout流式Flow
Android约束布局ConstraintLayout流式Flow <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.…...
Android JNI代码语法解释
文章目录 JNI中的JNIEXPORT、JNIIMPORT和JNICALLJVM如何查找native方法①按照JNI规范的命名规则②调用JNI提供的RegsterNatives函数,将本地函数注册到JVM中示例代码 JNI数据类型JNI字符串的处理①获取字符串②释放字符串③创建字符串④其他字符串处理API JNI中的JNI…...
小程序和前台开发软件定制的相关信息|APP网站搭建
小程序和前台开发软件定制的相关信息 在如今数字化时代,软件、小程序和前台开发软件定制已经成为了企业必备的工具之一。那么,这些工具到底有什么作用呢?接下来,我将为大家详细介绍。 首先,让我们来了解一下软件。软件…...
JVM监控及诊断工具-GUI篇
文章目录 JVM监控及诊断工具-GUI篇工具概述JConsoleVisual VM再谈内存泄漏Java中内存泄漏的8种情况Arthas(阿尔萨斯)康师傅使用阿尔萨斯的例子help指令 JVM监控及诊断工具-GUI篇 工具概述 使用上一章命令行工具或组合能获取目标Java应用性能相关的基础…...
【C++STL基础入门】list基本使用
文章目录 前言一、list简介1.1 list是什么1.2 list的头文件 二、list2.1 定义对象2.2 list构造函数2.3 list的属性函数 总结 前言 STL(Standard Template Library)是C标准库的一个重要组成部分,提供了一套丰富的数据结构和算法,可…...
WSL+vscode配置miniob环境
1.配置WSL Windows Subsystem for Linux入门:安装配置图形界面中文环境vscode wu-kan 2.获取源码 找个位置Git Bash然后拉取代码 git clone https://github.com/oceanbase/miniob.git 3.安装相关依赖 https://gitee.com/liangcha-xyy/source/blob/master/how…...
Flutter SliverAppBar 吸顶效果
吸顶是常见的布局,主要使用的是CustomScrollView 和SliverApp组件实现的 页面布局 overrideWidget build(BuildContext context) {return CustomScrollView(controller: controller.scrollController!,physics: const BouncingScrollPhysics(),slivers: [SliverApp…...
Java Spring Boot 自动装配:简化配置和提高开发效率
Spring Boot 自动装配是 Spring Boot 提供的一种特性,它可以根据应用程序的依赖关系和配置信息,自动配置应用程序的各种组件和功能。这样,开发者可以将更多的精力放在业务逻辑的实现上,而不需要手动配置和管理各种组件。 1. 自动…...
对象转换之modelmapper
1. 官网地址:http://modelmapper.org 源码地址:GitHub - modelmapper/modelmapper: Intelligent object mapping 2.实现原理: 主要是基于匹配策略进行属性的转化,目前支持三种策略: 2.1 Standard(默认标准…...
Ant Design+react 路由跳转
今天我们来继续探讨react的路由跳转 首先,创建router文件夹中的index import { lazy } from "react"; import { Outlet,useRoutes } from react-router-dom; //引入页面,引用了路由懒加载 const One lazy(() > import(../pages/one)); c…...
提高爬虫效率的秘诀之一:合理配置库池数量
在提高爬虫效率的过程中,合理配置库池数量是一个重要的秘诀。通过增加或减少库池的数量,可以有效提升爬虫系统的效率和稳定性。本文将介绍如何合理配置库池数量,以及配置不同数量库池的优缺点,帮助您提高爬虫效率,顺利…...
初学者必看,前端 Debugger 调试学习
1.文章简介: 报错和Bug,是贯穿程序员整个编程生涯中,无法回避的问题。而调试,就是帮助程序员定位问题、解决问题的重要手段,因此调试是每个程序员必备技能。 调试本身可分为两个过程: 定位问题 和 解决问题࿰…...
Dubbo—Admin 整体架构与安装步骤
回顾 Dubbo 服务治理体系的总体架构,Admin 是服务治理控制面中的一个核心组件,负责微服务集群的服务治理、可视化展示等。 Admin 部署架构 总体上来说,Admin 部署架构分为以下几个部分: Admin 主进程,包括服务发现…...
C++11打断线程的几种方式
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pthread_cancel1.代码演示2.两个重要方法1.pthread_setcancelstate2.pthread_setcanceltype 3.资源回收 二、Boost1.看代码2.资源泄露2.资源回收 总结 前言…...
如何提升网站排名和用户体验:优化网站速度
网站的排名和用户满意度直接受到站点内容的加载速度影响深远。通过精心的网站优化,您不仅可以提高排名,还可以提供更出色的用户体验,尽管用户可能不会察觉到您的网站加载得更快,但这是一个非常有意义的改进。在这篇文章中…...
【Redis】Hash 哈希内部编码方式
Hash 哈希内部编码方式 哈希的内部编码有两种: ziplist(压缩列表):当哈希类型元素个数⼩于hash-max-ziplist-entries配置(默认512个)、同时所有值都⼩于hash-max-ziplist-value配置(默认64字节…...
JUC第二十八讲:JUC工具类: Semaphore详解
JUC工具类: Semaphore详解 本文是JUC第二十八讲,JUC工具类: Semaphore详解。Semaphore底层是基于AbstractQueuedSynchronizer来实现的。Semaphore称为计数信号量,它允许n个任务同时访问某个资源,可以将信号量看做是在向外分发使用资源的许可证…...
vue3组合式API实现父组件触发子组件中的方法 | vue3中ref的用法 | defineExpose的使用场景
vue3组合式API实现父组件触发子组件中的方法 | vue3中ref的用法 | defineExpose的使用场景 目录 vue3组合式API实现父组件触发子组件中的方法 | vue3中ref的用法 | defineExpose的使用场景一、问题背景二、解决方法三、示例 一、问题背景 代码环境:vue3 ࿰…...
让 TDengine 在 JetBrains IDEs 里更像“原生数据库”一点
让 TDengine 在 JetBrains IDEs 里更像“原生数据库”一点 Author: ChangJin Wei (魏昌进) 最近我做了一个小插件,把 TDengine 接入到了 JetBrains IDEs 的数据库工具链里。 先埋个小提示:文末有彩蛋。 项目地址: GitHub: https://github.…...
从IPv4到IPv6迁移实战:在eNSP里排查那些容易被忽略的安全配置(避坑指南)
从IPv4到IPv6迁移实战:eNSP环境下的安全配置深度排查指南 当企业网络从IPv4向IPv6过渡时,工程师们常常会陷入一种"配置惯性"——沿用IPv4时代的安全策略直接套用到IPv6环境。这种思维定式往往会导致网络出现各种"隐形漏洞"。本文将通…...
【花雕学AI】打破AI轻量化极限!MimiClaw:5美元芯片上跑的纯 C 轻量 AI 智能体
提到AI智能体,很多人的第一印象是“需要高性能服务器支撑”“离不开复杂操作系统”“功耗高到不敢长时间运行”——但MimiClaw的出现,彻底打破了这种固有认知。作为全球首个能在仅售5美元的ESP32-S3芯片上流畅运行的纯C编写轻量AI智能体,Mimi…...
龙虾为啥越养越贵,越用越蠢?极客老王揭秘Agent落地真相
进入2026年3月,科技圈的舆论风向标发生了一次剧烈偏移。曾经被誉为开启“AI代驾”时代的超级智能体OpenClaw(俗称“龙虾”),在经历了一年的野蛮生长后,正陷入一场空前的信任危机。根据最新的行业调研数据显示ÿ…...
小白也能玩转的AI语音合成:超级千问语音世界快速体验报告
小白也能玩转的AI语音合成:超级千问语音世界快速体验报告 1. 初识超级千问语音世界 第一次打开超级千问语音世界,我仿佛穿越回了童年玩红白机的时代。复古的像素风界面、跳跃的蘑菇按钮、会移动的小乌龟,这哪里是AI工具,分明是个…...
nli-distilroberta-base轻量化效果实测:在嵌入式设备上的推理性能与精度
nli-distilroberta-base轻量化效果实测:在嵌入式设备上的推理性能与精度 1. 开篇:当大模型遇上小设备 在树莓派上跑BERT?半年前这还是个笑话。但当我第一次在Jetson Nano上成功运行量化后的nli-distilroberta-base模型时,这个4核…...
CoPaw自动化办公实战:Python脚本批量处理文档与邮件
CoPaw自动化办公实战:Python脚本批量处理文档与邮件 1. 为什么需要办公自动化? 每天重复处理大量文档和邮件,是不是让你感到疲惫不堪?根据统计,普通职场人平均每天要花费2-3小时在文档处理和邮件回复上。这些重复性工…...
终极指南:简单快速解决C盘爆红的Windows清理工具
终极指南:简单快速解决C盘爆红的Windows清理工具 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服! 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 你的C盘是不是又红了?电脑卡得像蜗牛爬&a…...
Ubuntu服务器上配置KVM虚拟化环境:从零搭建Windows开发环境
1. 为什么要在Ubuntu服务器上跑Windows? 很多开发者可能都有这样的困惑:明明手头有性能强劲的Ubuntu服务器,但某些开发工具只能在Windows环境下运行。比如Visual Studio、SQL Server Management Studio这些微软系工具,或者某些行业…...
4个步骤掌握ComfyUI-WanVideoWrapper:从环境搭建到视频生成全攻略
4个步骤掌握ComfyUI-WanVideoWrapper:从环境搭建到视频生成全攻略 【免费下载链接】ComfyUI-WanVideoWrapper 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-WanVideoWrapper ComfyUI-WanVideoWrapper是一款强大的AI视频生成插件,作…...
