Go RSA的使用样例

2023-11-10

GenerateRSAKey 是生成公钥和密钥对
RSA_Encrypt 是加密方法
RSA_Decrypt 是解密方法
运行示例:


代码:

package main

import (
	"crypto/rand"
	"crypto/rsa"
	"crypto/x509"
	"encoding/pem"
	"fmt"
	"os"
)

//生成RSA私钥和公钥,保存到文件中
// bits 证书大小
func GenerateRSAKey(bits int) {
   //GenerateKey函数使用随机数据生成器random生成一对具有指定字位数的RSA密钥
   //Reader是一个全局、共享的密码用强随机数生成器
   privateKey, err := rsa.GenerateKey(rand.Reader, bits)
   if err != nil {
      panic(err)
   }
   //保存私钥
   //通过x509标准将得到的ras私钥序列化为ASN.1 的 DER编码字符串
   X509PrivateKey := x509.MarshalPKCS1PrivateKey(privateKey)
   //构建一个pem.Block结构体对象
   privateBlock := pem.Block{Type: "RSA Private Key", Bytes: X509PrivateKey}
   /**
    // 使用密码加密 PEM 块
    encryptedPEM, err := x509.EncryptPEMBlock(rand.Reader, privateBlock.Type, privateBlock.Bytes, []byte(password), x509.PEMCipherAES256)
    if err != nil {
        fmt.Println("加密私钥失败:", err)
        return
    }
   **/
   //使用pem格式对x509输出的内容进行编码
   //创建文件保存私钥
   privateFile, err := os.Create("private.pem")
   if err != nil {
      panic(err)
   }
   defer privateFile.Close()
   //将数据保存到文件
   pem.Encode(privateFile, &privateBlock)

   //保存公钥
   //获取公钥的数据
   publicKey := privateKey.PublicKey
   //X509对公钥编码
   X509PublicKey, err := x509.MarshalPKIXPublicKey(&publicKey)
   if err != nil {
      panic(err)
   }
   //pem格式编码
   //创建用于保存公钥的文件
   publicFile, err := os.Create("public.pem")
   if err != nil {
      panic(err)
   }
   defer publicFile.Close()
   //创建一个pem.Block结构体对象
   publicBlock := pem.Block{Type: "RSA Public Key", Bytes: X509PublicKey}
   //保存到文件
   pem.Encode(publicFile, &publicBlock)
}

//RSA加密
// plainText 要加密的数据
// path 公钥匙文件地址
func RSA_Encrypt(plainText []byte, path string) []byte {
   //打开文件
   file, err := os.Open(path)
   if err != nil {
      panic(err)
   }
   defer file.Close()
   //读取文件的内容
   info, _ := file.Stat()
   buf := make([]byte, info.Size())
   file.Read(buf)
   //pem解码
   block, _ := pem.Decode(buf)
   //x509解码

   publicKeyInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
   if err != nil {
      panic(err)
   }
   //类型断言
   publicKey := publicKeyInterface.(*rsa.PublicKey)
   //对明文进行加密
   cipherText, err := rsa.EncryptPKCS1v15(rand.Reader, publicKey, plainText)
   if err != nil {
      panic(err)
   }
   //返回密文
   return cipherText
}

//RSA解密
// cipherText 需要解密的byte数据
// path 私钥文件路径
func RSA_Decrypt(cipherText []byte,path string) []byte{
   //打开文件
   file,err:=os.Open(path)
   if err!=nil{
      panic(err)
   }
   defer file.Close()
   //获取文件内容
   info, _ := file.Stat()
   buf:=make([]byte,info.Size())
   file.Read(buf)
   //pem解码
   block, _ := pem.Decode(buf)
   /**
   // 密码解密
   decryptedPrivateKeyBytes, err := x509.DecryptPEMBlock(block, password)
   if err != nil {
      fmt.Println("解密私钥失败:", err)
      return
   }
   **/
   //X509解码
   privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
   if err!=nil{
      panic(err)
   }
   //对密文进行解密
   plainText,_:=rsa.DecryptPKCS1v15(rand.Reader,privateKey,cipherText)
   //返回明文
   return plainText
}

func main() {
	//生成密钥对,保存到文件
   GenerateRSAKey(1024)
	//加密
   data := []byte("hello world")
   encrypt := RSA_Encrypt(data, "public.pem")
   fmt.Println(string(encrypt))

   // 解密
   decrypt := RSA_Decrypt(encrypt, "private.pem")
   fmt.Println(string(decrypt))
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go RSA的使用样例 的相关文章

  • 使用 testify 模拟接口方法两次,输入和输出不同

    如何在 golang 测试中模拟接口方法两次 例如 type myCache interface Get key string data interface error type service struct cache myCache f
  • 我可以根据我正在构建的操作系统导入 Golang 包吗?

    假设我有一个基于哪个操作系统的 go 项目 在某些情况下是哪个发行版 我想使用 Systemd 客户端包 Upstart 客户端包 sysv 客户端包 launchd 客户端包 是否可以有选择地导入每个包 以便我只导入我正在构建的每个操作系
  • 在处理程序之后访问 HTTP 请求上下文

    在我的日志记录中间件 链中的第一个 中 我需要访问一些在链下游的某些身份验证中间件中编写的上下文 并且仅在处理程序本身执行之后 旁注 需要首先调用日志记录中间件 因为我需要记录请求的持续时间 包括在中间件中花费的时间 此外 当权限不足时 身
  • 在golang中获取TTFB(第一个字节的时间)值

    我正在尝试获取 TTFB 值和 Connect 值 c exec Command curl w Connect time connect TTFB time starttransfer Total time time total o dev
  • Go 无法推断赋值中的类型:“non-name on left side of :=”

    该片段按预期工作play golang org p VuCl OKMav http play golang org p VuCl OKMav i 10 next 11 prev i i next 然而这个几乎相同的片段给出了non name
  • Golang中如何删除字符串的最后一个字符?

    我想删除字符串的最后一个字符 但在此之前我想检查最后一个字符是否是 如何才能做到这一点 以下是删除尾随加号的几种方法 package main import fmt strings func TrimSuffix s suffix stri
  • 错误“binary.Write:无效类型”是什么意思?

    下面显示的代码 我创建了一个结构类型并希望将其编码为二进制 但它显示binary Write invalid type main Stu错误 我读过一些类似的代码 但我找不到为什么我的代码不起作用 type Stu struct Name
  • 使用覆盖率信息测试 Go 中的 os.Exit 场景 (coveralls.io/Goveralls)

    这个问题 如何在 Go 中测试 os exit 场景 https stackoverflow com questions 26225513 how to test os exit scenarios in go 以及其中得票最高的答案 列出
  • 重新插入通道导致死锁

    我有稳定的入站 作业 流 将其输入到无缓冲通道中 我有一个for range循环来迭代项目并处理它们 如果处理该项目失败 我会将项目重新插入通道中 以便稍后重试 问题是当我将项目重新插入通道时 它陷入僵局 我明白为什么会发生这种情况 处理器
  • 根据值匹配数组

    我使用以下代码来解析 yaml 并应得到输出为runners对象和函数build应更改数据结构并根据以下结构提供输出 type Exec struct NameVal string Executer string 这是我尝试过的 但我不知道
  • golang mongodb (mgo) 没有插入文档

    我在使用 mgo 在 mongodb 中保存 golang 结构时遇到问题 type AN Track Log struct Id bson ObjectId bson id omitempty user session id str st
  • 如何在 Go 中从 stdin 解析无限 json 数组?

    我正在尝试编写一个 i3status 的小替代品 一个与 i3bar 兼容的小程序进行通信this http i3wm org docs i3bar protocol html协议 他们通过标准输入和标准输出交换消息 两个方向的流都是一个无
  • RSA 已处置对象错误 - 所有其他测试

    我们有几个测试生成 jwt 请求来调用服务器来检索令牌 我们有 6 个测试 使用相同的数据对相同的方法进行相同的调用 方法如下 private static string GenerateSignedTokenRequest string
  • RSA SignatureException:签名长度不正确

    我在签署 rsa 签名时遇到问题 我有一个用私钥加密的签名 然而 当我尝试使用公钥验证它时遇到问题 我得到以下异常 java security SignatureException Signature length not correct
  • benchmem 的输出

    使用内存分析器运行基准测试时 我看到以下输出 SomeFunc 100 17768876 ns op 111 B op 0 allocs op 我不明白输出 0 allocs op 但分配了 111 B 知道这意味着什么吗 我的函数是否在堆
  • Golang HTTP Post 错误:连接被拒绝

    我正在尝试向正在运行 PHP 应用程序的端口 8080 上的本地主机发送 post 请求 卷曲效果很好 curl data key asdf http localhost 8080 但在 Go 中我收到以下错误 Post http loca
  • 如何将 json 字符串编组到 bson 文档以写入 MongoDB?

    我正在寻找的东西相当于文档 parse https api mongodb com java 3 2 org bson Document html parse java lang String 在golang中 这允许我直接从json创建b
  • 解组此 xml 时遇到问题

    尝试了解如何在 Go 中解组 XML 通读多个示例和 stackoverflow 问题 我想要的是一个包含系统上安装的所有补丁的切片 我什至无法解组补丁 没有错误 只是一个空切片 可能做的事情基本上是错误的 提前感谢您的任何建议
  • go install - 我需要手动更新我的路径吗?

    我对 Go 的最新最佳实践是什么有点困惑 在 macos 上安装最新的 1 17 Go 没有 GOPATH 环境变量 使用 go mod 我看到我的路径中有以下内容 usr local go bin 当我跑步时go install
  • go语言读取并合并两个Yaml文件

    假设我们有两个 yaml 文件 master yaml someProperty someVaue anotherProperty anotherValue 覆盖 yaml someProperty overriddenVaue 是否可以解

随机推荐

  • Zmodem协议由浅入深

    Zmodem协议由浅入深 废话不多说直接解释 1 最简单的 ZMODEM 文件传输显示如下 例如 发送器要发送 爸爸的爸爸到底叫什么呀丫鸭压 gt gt gt gt gt 给接收器 逻辑如下 发送器 问 接收器可以接受什么类型的数据 接受器
  • stm32 Systick定时器

    Systick定时器属于是简单定时器 是为了节省定时器资源而存在的一个一般用于延时和用作实时系统的心跳时钟的一个定时器 Systick定时器就是系统滴答定时器 一个24 位的倒计数定时器 计到0 时 将从RELOAD 寄存器中自动重装载定时
  • 开发中遇到的线程不安全问题小结

    1 SimpleDateFormat 是线程不安全的 推荐使用如下 1 声明SimpleDateFormat变量时 加synchronized修饰 2 使用DateUtils 工具类 3 使用ThreadLocal 如下 private s
  • 设计一个学生类和它的一个子类——本科生类

    设计一个学生类 Student 和它的一个子类 本科生类 Undergraduate 要求如下 1 Student类有姓名 name 和年龄 age 属性 两者的访问权限为protected 一个包含两个参数的构造方法 用于给姓名和年龄属性
  • 微信小程序刷新前一界面数据和返回按钮监听

    在android中 为了实现从新页面往前一页面传值 使用startActivityForResult Intent intent int requestCode 打开新的activity 前一个activity通过onActivityRes
  • idea中安装leetcode插件后的cookie问题

    cookie配置 cookie失效操作相同 插件安装 cookie获取和配置 插件安装 参考 https blog csdn net m0 58275619 article details 120128587 安装插件后 idea中登录 可
  • 工厂模式有三个Level,你能用Go写到第几层?

    设计模式中的工厂模式是我们编写代码时常用的一种建造型模式 用于创建指定类的实例 在不使用设计模式的时候 我们是怎么创建类的实例的呢 别多想 这个问题没坑 就是我们写代码时直接用 new 关键字 直接创建实例 比如 Java 语言里是通过 n
  • Unet实现眼底图像血管分割(二)

    使用了google colaboratory的免费GPU进行训练 调整了源代码的各个参数 下面是configuration txt文件的解析 data paths 只有在修改了prepare datasets DRIVE py文件之后 才能
  • Axure教程 原型设计工具Axure RP新手入门教程(一):基础

    什么是Auxre RP Axure RP是一种线框图 原型设计 流程图和文档工具 使用Axure RP来创建和设置图表样式 为图表页面和元素添加交互性和注释 并将完成的设计发布到HTML以便通过Web浏览器查看 点击下方图片可观看视频 点击
  • 华为OD-货币单位换算-python版

    题目描述 记账本上记录了若干条多国货币金额 需要转换成人民币 fen 汇总后输出 每行记录一条金额 金额带有货币单位 格式为数字 单位 可能是单独的元 或者单独的分 或者分与元的组合 要求将这些货币全部换算成人民币 fen 后进行汇总 汇总
  • 统信uos操作系统虚拟机安装_【IT之家学院】统一操作系统 UOS 尝鲜记(一):下载&安装...

    近期风头正劲的统一操作系统UOS 由统信软件技术有限公司开发 该公司由国内多家长期从事操作系统研发的核心企业参与筹建 包括中国电子集团 CEC 武汉深之度科技有限公司 南京诚迈科技 中兴新支点 最新消息显示深度科技已成为统信软件全资子公司
  • Ribbon 负载均衡

    介绍 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具 Ribbon是Netflix发布的开源项目 主要功能是提供客户端的软件负载均衡算法和服务调用 Ribbon客户端组件提供一系列完善
  • react后台web端替换高德key之后报错10008

    web端高德地图添加key步骤 2021年12月02日升级之后新申请的key都有安全秘钥 10008的报错原因 https lbs amap com api javascript api guide abc prepare 解决方法 在 文
  • JavaScript(客户端脚本语言)

    js与html结合方式 ECMAScript规范 Function 代表函数 1 JavaScript发展史 1992年 nombas公司 C 最早的客户端脚本语言 专门用于表单验证 后更名为 scriptEarth 网景 scriptli
  • UnityWebRequest图片上传和下载

    上传 IEnumerator UpLoadTexture byte bytes WWWForm form new WWWForm string id Photo DateTime Now ToString yyyy MM dd hh mm
  • IntelliJ IDEA或goland没有 Go SDK选项 显示 no version

    1 首先 保证安装正常 环境变量正常配置 参考 Go语言环境安装及配置 ThrAvicii的博客 CSDN博客 go语言安装 2 在IDEA中安装Go语言支持插件 使用GOLand请忽略此步骤 3 重点 配置SDK 找不到 显示no ver
  • 2023美国大学生数学建模竞赛中文题目发布

    2023年美国大学生数学建模竞赛竞赛将于北京时间 2023年2月17日 早晨6 00点 至 北京时间 2023年2月21日 上午9 00 举行 赛题已发布 请同学们按照要求参赛 预祝同学们获得理想的成绩 Problem A Problem
  • Docker安装与简单操作

    文章目录 Docker安装 1 Docker离线安装 第一步 下载离线安装包 第二步 下载离线安装工具 第三步 将下载好的文件放在一个目录 如 第四步 在linux环境下 创建 docker文件夹 然后拷贝下载好的资源到此目录 如 第五步
  • 程序员由于天天和逻辑打交道,所以在世故的人眼里往往显得过于简单。

    程序员由于天天和逻辑打交道 所以在世故的人眼里往往显得过于简单 近来看组织行为学 发现其中一节列了很多特别的技能 考虑到也许他们对程序员群体很有启示意义 就追加了一点说明 把它放在博客里 相信这对想成为管理者的程序员是有意义的 我个人的观点
  • Go RSA的使用样例

    GenerateRSAKey 是生成公钥和密钥对 RSA Encrypt 是加密方法 RSA Decrypt 是解密方法 运行示例 代码 package main import crypto rand crypto rsa crypto x