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

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函数&#xff0c;将本地函数注册到JVM中示例代码 JNI数据类型JNI字符串的处理①获取字符串②释放字符串③创建字符串④其他字符串处理API JNI中的JNI…...

小程序和前台开发软件定制的相关信息|APP网站搭建

小程序和前台开发软件定制的相关信息 在如今数字化时代&#xff0c;软件、小程序和前台开发软件定制已经成为了企业必备的工具之一。那么&#xff0c;这些工具到底有什么作用呢&#xff1f;接下来&#xff0c;我将为大家详细介绍。 首先&#xff0c;让我们来了解一下软件。软件…...

JVM监控及诊断工具-GUI篇

文章目录 JVM监控及诊断工具-GUI篇工具概述JConsoleVisual VM再谈内存泄漏Java中内存泄漏的8种情况Arthas&#xff08;阿尔萨斯&#xff09;康师傅使用阿尔萨斯的例子help指令 JVM监控及诊断工具-GUI篇 工具概述 使用上一章命令行工具或组合能获取目标Java应用性能相关的基础…...

【C++STL基础入门】list基本使用

文章目录 前言一、list简介1.1 list是什么1.2 list的头文件 二、list2.1 定义对象2.2 list构造函数2.3 list的属性函数 总结 前言 STL&#xff08;Standard Template Library&#xff09;是C标准库的一个重要组成部分&#xff0c;提供了一套丰富的数据结构和算法&#xff0c;可…...

WSL+vscode配置miniob环境

1.配置WSL Windows Subsystem for Linux入门&#xff1a;安装配置图形界面中文环境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 吸顶效果

吸顶是常见的布局&#xff0c;主要使用的是CustomScrollView 和SliverApp组件实现的 页面布局 overrideWidget build(BuildContext context) {return CustomScrollView(controller: controller.scrollController!,physics: const BouncingScrollPhysics(),slivers: [SliverApp…...

Java Spring Boot 自动装配:简化配置和提高开发效率

Spring Boot 自动装配是 Spring Boot 提供的一种特性&#xff0c;它可以根据应用程序的依赖关系和配置信息&#xff0c;自动配置应用程序的各种组件和功能。这样&#xff0c;开发者可以将更多的精力放在业务逻辑的实现上&#xff0c;而不需要手动配置和管理各种组件。 1. 自动…...

对象转换之modelmapper

1. 官网地址&#xff1a;http://modelmapper.org 源码地址&#xff1a;GitHub - modelmapper/modelmapper: Intelligent object mapping 2.实现原理&#xff1a; 主要是基于匹配策略进行属性的转化&#xff0c;目前支持三种策略&#xff1a; 2.1 Standard&#xff08;默认标准…...

Ant Design+react 路由跳转

今天我们来继续探讨react的路由跳转 首先&#xff0c;创建router文件夹中的index import { lazy } from "react"; import { Outlet,useRoutes } from react-router-dom; //引入页面&#xff0c;引用了路由懒加载 const One lazy(() > import(../pages/one)); c…...

提高爬虫效率的秘诀之一:合理配置库池数量

在提高爬虫效率的过程中&#xff0c;合理配置库池数量是一个重要的秘诀。通过增加或减少库池的数量&#xff0c;可以有效提升爬虫系统的效率和稳定性。本文将介绍如何合理配置库池数量&#xff0c;以及配置不同数量库池的优缺点&#xff0c;帮助您提高爬虫效率&#xff0c;顺利…...

初学者必看,前端 Debugger 调试学习

1.文章简介&#xff1a; 报错和Bug&#xff0c;是贯穿程序员整个编程生涯中&#xff0c;无法回避的问题。而调试&#xff0c;就是帮助程序员定位问题、解决问题的重要手段&#xff0c;因此调试是每个程序员必备技能。 调试本身可分为两个过程: 定位问题 和 解决问题&#xff0…...

Dubbo—Admin 整体架构与安装步骤

​回顾 Dubbo 服务治理体系的总体架构&#xff0c;Admin 是服务治理控制面中的一个核心组件&#xff0c;负责微服务集群的服务治理、可视化展示等。 Admin 部署架构 总体上来说&#xff0c;Admin 部署架构分为以下几个部分&#xff1a; Admin 主进程&#xff0c;包括服务发现…...

C++11打断线程的几种方式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pthread_cancel1.代码演示2.两个重要方法1.pthread_setcancelstate2.pthread_setcanceltype 3.资源回收 二、Boost1.看代码2.资源泄露2.资源回收 总结 前言…...

如何提升网站排名和用户体验:优化网站速度

网站的排名和用户满意度直接受到站点内容的加载速度影响深远。通过精心的网站优化&#xff0c;您不仅可以提高排名&#xff0c;还可以提供更出色的用户体验&#xff0c;尽管用户可能不会察觉到您的网站加载得更快&#xff0c;但这是一个非常有意义的改进。在这篇文章中&#xf…...

【Redis】Hash 哈希内部编码方式

Hash 哈希内部编码方式 哈希的内部编码有两种&#xff1a; ziplist&#xff08;压缩列表&#xff09;&#xff1a;当哈希类型元素个数⼩于hash-max-ziplist-entries配置&#xff08;默认512个&#xff09;、同时所有值都⼩于hash-max-ziplist-value配置&#xff08;默认64字节…...

JUC第二十八讲:JUC工具类: Semaphore详解

JUC工具类: Semaphore详解 本文是JUC第二十八讲&#xff0c;JUC工具类: Semaphore详解。Semaphore底层是基于AbstractQueuedSynchronizer来实现的。Semaphore称为计数信号量&#xff0c;它允许n个任务同时访问某个资源&#xff0c;可以将信号量看做是在向外分发使用资源的许可证…...

vue3组合式API实现父组件触发子组件中的方法 | vue3中ref的用法 | defineExpose的使用场景

vue3组合式API实现父组件触发子组件中的方法 | vue3中ref的用法 | defineExpose的使用场景 目录 vue3组合式API实现父组件触发子组件中的方法 | vue3中ref的用法 | defineExpose的使用场景一、问题背景二、解决方法三、示例 一、问题背景 代码环境&#xff1a;vue3 &#xff0…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

windows系统MySQL安装文档

概览&#xff1a;本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容&#xff0c;为学习者提供全面的操作指导。关键要点包括&#xff1a; 解压 &#xff1a;下载完成后解压压缩包&#xff0c;得到MySQL 8.…...

【SpringBoot自动化部署】

SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一&#xff0c;能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时&#xff0c;需要添加Git仓库地址和凭证&#xff0c;设置构建触发器&#xff08;如GitHub…...