如何在 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 密钥加密和解密纯文本? 的相关文章

  • 将 time.Time 转换为字符串

    我正在尝试将数据库中的一些值添加到 string在围棋中 其中一些是时间戳 我收到错误 无法在数组元素中使用 U Created date 类型 time Time 作为类型字符串 我可以转换吗time Time to string typ
  • 为什么 json.Unmarshal 返回映射而不是预期的结构?

    看看这个游乐场 http play golang org p dWku6SPqj5 http play golang org p dWku6SPqj5 基本上 我正在工作的图书馆收到了interface 作为参数 然后需要json Unma
  • 如何仅在测试时允许一个包访问另一个包的未导出数据?

    In Go 编程语言 第 11 2 4 节 有一个外部测试访问的示例fmt isSpace 通过声明IsSpace in fmt s export test go文件 这似乎是完美的解决方案 所以这就是我所做的 a a go package
  • 如何为所有 API 端点全局设置 http.ResponseWriter Content-Type 标头?

    我是 Go 新手 现在正在用它构建一个简单的 API package main import encoding json fmt github com gorilla mux github com gorilla handlers log
  • 如何在python中使用RSA私钥加密数据?

    我已经安装了pyCrypto http pythonhosted org pycrypto 在 Python 2 7 1 上打包来执行一些加密操作 Q1 我想做的操作是加密一些数据private Key 代替public Key 这个图书馆
  • 如何修复“缺少表的 FROM 子句条目”错误

    我正在尝试根据游戏 ID 获取平台名称 我有如下三个表 我正在尝试加入它们以获得所需的结果 Games Id 1 2 3 4 Game Platforms Id game id platform id 1 1 1 2 1 2 3 3 3
  • 如何读取大型平面文件

    我有一个平面文件 其中包含 339276 行文本 大小为 62 1 MB 我试图读入所有行 根据我所拥有的某些条件解析它们 然后将它们插入数据库 我最初尝试使用 bufio Scan 循环和 bufio Text 来获取该行 但缓冲区空间不
  • 在 Go to 函数中通过引用和值传递

    我对 Go 中通过引用和值传递有点困惑 我已经看到过对类型前面的 的解释 在类型名称前面 表示声明的变量将存储该类型的另一个变量的地址 而不是该类型的值 类型 这对我来说毫无意义 在Java中 如果我将数据库实例传递给函数 我会这样做 da
  • Golang 中的确定性 RSA 加密 - 如何在多次加密下为给定消息获得相同的结果

    对于下面的RSA加密代码 每次对同一条消息进行加密时 结果都会不同 我发现这是由于rand Reader in the rsa EncryptOAEP功能使其更加安全doc https pkg go dev crypto rsa Encry
  • 实现具有更广泛方法签名的接口

    在Go中 是否有一种方法可以使用方法来实现接口 其中实现中相应方法的返回类型 比 预期返回类型 更宽 这很难解释 所以这里有一个例子 在 Go Playground 中运行以下示例代码时出现此错误 prog go 36 14 cannot
  • Facebook服务器端登录、CORS

    我正在实现一个带有 FB 服务器端登录的网站 简化步骤如下 一个简单的按钮触发 JS 脚本 该脚本调用我的后端 APIhttps localhost fblogin function sendFbLoginData get https lo
  • 有没有办法从另一个包访问结构体的私有字段?

    我在一个包中有一个具有私有字段的结构 package foo type Foo struct x int y Foo 另一个包 例如 白盒测试包 需要访问它们 package bar import foo func change foo f
  • iOS SecKeyRef(公钥)将其发送到服务器[重复]

    这个问题在这里已经有答案了 现在我的公钥有问题 我使用 SecKeyGeneratePair 来生成公钥和私钥 现在我必须将我的公钥发送到服务器 我使用下面的方法将 SecKeyRef 转换为 NSData 我总是得到相同的公钥 不过我将其
  • json.Unmarshal json字符串到对象是空结果[重复]

    这个问题在这里已经有答案了 我有一个非常简单的程序 如下所示 package main import encoding json fmt type RunCommand struct level string json level call
  • 如何对结构切片而不是切片结构进行范围调整

    稍微玩了一下 Go HTML 模板后 我发现的所有循环模板中对象的示例都是将切片结构传递给模板 有点像这个示例 type UserList struct Id int Name string var templates template M
  • Golang const unsafe.Sizeof

    不明白为什么我可以做到 const OK uint64 0 const OK int unsafe Sizeof uint64 0 但不是这个 const NOK binary Size uint64 0 它的解释在规格 https gol
  • 从 Golang 调用 C 函数

    我想在 Golang 中编写控制器逻辑并处理 json 和数据库 同时在 C 中使用我的数学处理模型 在我看来 调用 C 函数的开销必须尽可能低 就像设置寄存器 rcx rdx rsi rdi 一样 执行一些操作fastcall 并获取 r
  • 如何在golang中获得两个切片的交集?

    Go 中有没有有效的方法来获取两个切片的交集 我想避免嵌套 for 循环之类的解决方案slice1 string foo bar hello slice2 string foo bar intersection slice1 slice2
  • 所有可能的 GOOS 价值?

    如果我做对了 GOOS在编译源代码时确定 为了更好地支持多个操作系统 我感兴趣的是GOOS可能 当然 Go 是开源的 所以它可能有无限的可能性 所以我真正想要的是一个 通用列表 已知值为 windows linux darwin or fr
  • 共享 GOPATH 的良好做法是什么?

    我刚刚开始学习 Go 并阅读现有代码以了解 其他人是如何做的 在这样做时 go 工作空间 的使用 特别是当它与项目的依赖项相关时 似乎无处不在 在处理各种 Go 项目时 使用单个或多个 Go 工作区 即 GOPATH 的定义 的常见最佳实践

随机推荐

  • 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 包来做到这一点