如何在 Go 中使用 RSA 密钥加密和解密纯文本?

2024-01-02

我正在尝试编写一个实用程序,使用 RSA 密钥对加密和解密纯文本文件。 RSA 密钥是使用 ssh-keygen 生成的,并像往常一样存储在 .ssh 中。

我无法理解如何使用 Go 语言 crypto 和 crypto/rsa 包来做到这一点?有关这些的文档有点稀疏(更是如此,因为我是加密新手)并且示例也很少。我检查了 rsa_test.go 文件是否有任何线索,但这只会让我更加困惑。

简而言之,我试图从 .ssh 中的 id_rsa 和 id_rsa.pub 文件加载公钥/私钥对,并使用它们来加密/解密纯文本文件。

先感谢您!


请记住,RSA 并非设计为分组密码。通常,RSA 用于加密对称密钥,然后使用该对称密钥来加密数据。然而,考虑到这一点,下面是一个可以使用 RSA 私钥来加密可自行解密的数据的程序:

package main

import (
    "crypto/rand"
    "crypto/rsa"
    "crypto/sha1"
    "crypto/x509"
    "encoding/pem"
    "flag"
    "io/ioutil"
    "log"
)

// Command-line flags
var (
    keyFile = flag.String("key", "id_rsa", "Path to RSA private key")
    inFile  = flag.String("in", "in.txt", "Path to input file")
    outFile = flag.String("out", "out.txt", "Path to output file")
    label   = flag.String("label", "", "Label to use (filename by default)")
    decrypt = flag.Bool("decrypt", false, "Decrypt instead of encrypting")
)

func main() {
    flag.Parse()

    // Read the input file
    in, err := ioutil.ReadFile(*inFile)
    if err != nil {
        log.Fatalf("input file: %s", err)
    }

    // Read the private key
    pemData, err := ioutil.ReadFile(*keyFile)
    if err != nil {
        log.Fatalf("read key file: %s", err)
    }

    // Extract the PEM-encoded data block
    block, _ := pem.Decode(pemData)
    if block == nil {
        log.Fatalf("bad key data: %s", "not PEM-encoded")
    }
    if got, want := block.Type, "RSA PRIVATE KEY"; got != want {
        log.Fatalf("unknown key type %q, want %q", got, want)
    }

    // Decode the RSA private key
    priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)
    if err != nil {
        log.Fatalf("bad private key: %s", err)
    }

    var out []byte
    if *decrypt {
        if *label == "" {
            *label = *outFile
        }
        // Decrypt the data
        out, err = rsa.DecryptOAEP(sha1.New(), rand.Reader, priv, in, []byte(*label))
        if err != nil {
            log.Fatalf("decrypt: %s", err)
        }
    } else {
        if *label == "" {
            *label = *inFile
        }
        out, err = rsa.EncryptOAEP(sha1.New(), rand.Reader, &priv.PublicKey, in, []byte(*label))
        if err != nil {
            log.Fatalf("encrypt: %s", err)
        }
    }

    // Write data to output file
    if err := ioutil.WriteFile(*outFile, out, 0600); err != nil {
        log.Fatalf("write output: %s", err)
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Go 中使用 RSA 密钥加密和解密纯文本? 的相关文章

  • Bash脚本无法执行Go命令

    我正在尝试编写一个 bash 脚本来自动在不同的目录中运行 go get install 相关部分在这里 cd web go get cd web go install cd services go get cd services go i
  • runtime.LockOSThread 是否允许子 goroutine 在同一个操作系统线程中运行?

    我明白在 Go 中 runtime LockOSThread https golang org pkg runtime LockOSThread将一个 goroutine 绑定到一个操作系统线程 并且不允许其他 goroutine 在该线程
  • Go MSSQL 连接

    如何提供 MSSQL 连接 它说它始终与代码相关 即使信息不正确 也不会报错 package main import database sql fmt github com denisenkom go mssqldb log var ser
  • 优化 golang 中的数据结构/字对齐填充

    与我在 C 中学到的类似 我相信填充导致了两个结构体实例大小的差异 type Foo struct w byte 1 byte x byte 1 byte y uint64 8 bytes type Bar struct x byte 1
  • Golang Appengine 项目无法构建

    我有一个使用 golang 的应用程序引擎项目 我已经大约一年没有碰过了 我现在无法让它在之前构建的机器上构建 我收到以下错误 go app builder 解析输入失败 解析器 src golang org x net internal
  • Golang - 更改 Windows 上的构建工作路径

    我正在使用 SublimeText3 GoSublime 插件 在 Windows 8 上测试简单的 Go 程序 go run v example go 在运行之前它正在内部编译 应用程序数据 本地 温度 目录 我的防病毒程序认为这是病毒并
  • 如何在 Go 中表示可选字符串?

    我希望建模一个可以有两种可能形式的值 不存在或字符串 执行此操作的自然方法是Maybe String or Optional
  • 使用 crypto/ssh 的 golang scp 文件

    我正在尝试通过 ssh 下载远程文件 以下方法在 shell 上运行良好 ssh hostname tar cz opt local folder gt folder tar gz 然而 golang 上的相同方法在输出工件大小方面存在一些
  • 取消用户特定的 goroutine [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个应用程序 网络应用程序 允许用户使用 twitter oauth 登录并提供自动推文删除功能 用户登录到 Web 应用程序后
  • 无法连接到代理“证书由未知机构签名”

    我正在尝试通过 Kubernetes 部署上的 cloudsql proxy 容器连接到 CloudSQL 实例 我已安装 cloudsql 凭据以及值GOOGLE APPLICATION CREDENTIALS set 但是 我的日志中仍
  • 是否支持动态变量?

    我想知道Go中是否可以动态创建变量 我在下面提供了一个伪代码来说明我的意思 我将新创建的变量存储在切片中 func method slice make type for i 0 i lt 10 i var variable i i slic
  • Golang 按位运算以及一般字节操作

    我有一些 C 代码 可以对字节执行一些按位运算 我正在尝试在 golang 中做同样的事情 但遇到了困难 C 中的示例 byte a c byte data int j c data j c byte c j c a c 0xFF c 0x
  • 为什么我的 SQL 占位符没有被替换(使用 Go pq)?

    根据文档 我正在这样做 var thingname string asdf var id int err database QueryRow SELECT id from things where thing thingname Scan
  • 如何在golang模板上打印JSON?

    我需要在客户端有一个对象 所以我使用 json marshal 将其转换为 JSON 并将其打印到模板中 该对象被打印为转义 JSON 字符串 我期待它是var arr o1 o2 但它是var arr o1 o2 我知道我可以在客户端进行
  • 使用 testify 模拟接口方法两次,输入和输出不同

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

    假设我有一个基于哪个操作系统的 go 项目 在某些情况下是哪个发行版 我想使用 Systemd 客户端包 Upstart 客户端包 sysv 客户端包 launchd 客户端包 是否可以有选择地导入每个包 以便我只导入我正在构建的每个操作系
  • 在 Go 中使用电子邮件地址创建证书签名请求 (CSR)

    我尝试使用 crypto x509 包生成 CSR 但没有找到将 emailAddress 字段添加到其主题中的方法 根据文档证书申请 http golang org pkg crypto x509 CertificateRequest结构
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 如何在 Go 中从 stdin 解析无限 json 数组?

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

    我们有几个测试生成 jwt 请求来调用服务器来检索令牌 我们有 6 个测试 使用相同的数据对相同的方法进行相同的调用 方法如下 private static string GenerateSignedTokenRequest string

随机推荐

  • DropDownListFor 从模型中默认选择的项目

    我有一个绑定到模型成员的 DropDownListFor 以及可供选择的项目列表 与该成员的绑定有效 但我似乎无法弄清楚如何在页面加载时显示模型的当前值 View Html DropDownListFor model gt model Me
  • 如何消除同名类型和模块的歧义?

    我正在尝试使用 K roly L rentey 的基于B树OrderedSet https github com lorentey BTree在一个项目中 但是 我遇到了一个问题 我无法声明不合格OrderedSet
  • Angular DI:将价值代币注入工厂提供者

    是否可以将 InjectionToken 注入工厂提供程序 目前 我已经编码 export const HOST TOKEN new InjectionToken
  • 为什么 PyTorch 模型在模型内部采用多个图像尺寸?

    我在 PyTorch 中使用简单的对象检测模型 并使用 Pytorch 模型进行推理 当我在代码上使用简单的迭代器时 for k image path in enumerate image list image imgproc loadIm
  • alsa_aplay 不在 Android 上录制

    我刚刚开始研究 android 我试图了解 android 音频子系统 alsa 是如何工作的 我正在 windows 7 64 位 上运行的虚拟盒中运行 android 映像 我正在摆弄 alsa utils 来录制声音 我试过alsa
  • 如何在 Go 模板中修剪空行?

    go版本go1 16 3 windows amd64 我使用 template html 包 如果我在 html 中设置一个变量 Example range kk vv Users if eq vv Id performedBy pSurn
  • Node.js 标准输出刷新

    也许我在复制this https stackoverflow com questions 6471004 how can i write blocking in stdout with node js问题 但提供的答案可能指的是旧版本的节点
  • 向多个收件人发送电子邮件

    我已将一些旧代码从旧的 unix 盒子移至新的 unix 盒子 并且我在使用 perl 脚本向多个收件人发送电子邮件时遇到了一些困难 它适用于旧盒子 旧盒子 perl 为 PA RISC2 0 构建的版本 5 004 04 新框 perl
  • 如何使用 Python 显示 OSM 图块?

    我正在使用generate tiles py 生成图块 我想编写一个Python 应用程序来显示它们 而不是使用Web 界面 是否已经存在类似的东西 或者是否有关于如何自己编写此类应用程序的信息 您可以使用 Tilemill 或 QGIS
  • 图像字段不会显示在活动管理表单中

    gem formtastic gt 2 1 1 gem activeadmin gt 0 4 2 宝石 回形针 照片字段不会显示在活动管理表单 app views admin products form html erb 中 但是 app
  • 声明数组的不同语法:带和不带维度声明[重复]

    这个问题在这里已经有答案了 我在用着gfortran版本 7 2 0 我对 Fortran 很陌生 我知道 Fortran 有不同的版本 在下面的代码中 我使用不同的语法声明数组 或实际上是张量 program arrays implici
  • cmake 非常令人沮丧的问题

    我在 Windows 上使用 cmake 时遇到了令人沮丧的问题 我已经安装了 kde 库 当我尝试使用 cmake 编译我的项目时 这一次又一次地爆发 Found Qt Version 4 7 0 using C Qt 2010 05 q
  • 使用 Podman 通信不同的 pod

    我正在使用 podman compose 部署多个 Pod 为此 每个 pod 在 podman compose yaml 文件中都有自己的定义 我以无根模式执行该文件 因此 Pod 中的所有容器共存于同一主机 IP 中 但是 我希望 Po
  • asp.net core中间件中Map和MapWhen分支的区别?

    当我们验证请求时 何时在 asp net core 中间件中使用 Map 和 MapWhen 分支 public void Configure IApplicationBuilder app IHostingEnvironment env
  • “.el”与 JavaScript/HTML/jQuery 有何关系?

    我在谷歌搜索中找不到太多东西 但我可能谷歌搜索了错误的术语 我试图从这里理解 el 中的 el 是什么 http joestelmach github com laconic http joestelmach github com laco
  • 如何使用 Mono.WebBrowser?

    我将此页读了两遍http www mono project com WebBrowser http www mono project com WebBrowser但我不知道如何使用它 没有程序集 我也无法打字using Mono WebBr
  • 默认 nginx client_max_body_size

    我一直收到 nginx 错误 413 Request Entity Too Large 我已经能够更新我的client max body size在我的 nginx conf 文件的服务器部分中将其大小更改为 20M 这已经解决了问题 但是
  • 如何为 postgresql 配置 HikariCP?

    我正在尝试在 postgresql 中使用 HikariCP 但在任何地方都找不到 postgresql 的配置 请给我指出带有 HikariCP 的 postgresql 的任何示例或任何相同的配置教程 我尝试像下面那样使用它 但它不起作
  • 创建docx word文档 web api .net core 2.0

    我正在Asp net core 2 0中开发一个Web API项目 我需要一个库或方法来创建 Word 文档 我搜索了一个尝试过的 NPOI 和 DocX 两者都没有想象中那么好 有人能给我推荐一个工具吗 乍一看 以下链接可以有所帮助 ht
  • 如何在 Go 中使用 RSA 密钥加密和解密纯文本?

    我正在尝试编写一个实用程序 使用 RSA 密钥对加密和解密纯文本文件 RSA 密钥是使用 ssh keygen 生成的 并像往常一样存储在 ssh 中 我无法理解如何使用 Go 语言 crypto 和 crypto rsa 包来做到这一点