使用 Ruby OpenSSL 库时公钥无效

2024-04-28

我正在尝试在 Ruby 中生成 RSA 密钥对,主要使用来自这篇博文 http://stuff-things.net/2009/12/11/generating-rsa-key-pairs-in-ruby/。这是我稍微修改过的代码:

def generate_keypair(passphrase)
   rsa_key = OpenSSL::PKey::RSA.new(2048)
   cipher =  OpenSSL::Cipher::Cipher.new('aes-256-cbc')
   private_key = rsa_key.to_pem(cipher, passphrase)
   public_key = rsa_key.public_key.to_pem
   return private_key, public_key
end

这成功生成了私钥和公钥,我可以将它们写到文件系统上的文件中。

irb(main):002:0> private_key1, public_key1 = generate_keypair('test')
[...output of keys...]
irb(main):003:0> File.open("key.pem","w") {|f| f.write(private_key1) }
=> 1766
irb(main):004:0> File.open("pubkey.pem","w") {|f| f.write(public_key1) }
=> 426

但是,当我尝试使用此公钥时,OpenSSL 会抱怨:

$ openssl rsautl -encrypt -inkey pubkey.pem -pubin -in text.txt -out text.ssl
unable to load Public Key

如果我使用openssl从私钥中提取公钥的工具,然后一切正常:

$ openssl rsa -in key.pem -pubout -out pubkey2.pem
Enter pass phrase for key.pem:
writing RSA key
$ openssl rsautl -encrypt -inkey pubkey2.pem -pubin -in text.txt -out text.ssl
$ openssl rsautl -decrypt -inkey key.pem -in text.ssl 
Enter pass phrase for key.pem:
this is a 
file that
needs to be
encrypted

Ruby OpenSSL 库生成的公钥与opensslcli工具提取私钥:

$ cat pubkey.pem 
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAzgNcsEL7yGBoLBYBXFYrDL6oLP8ZbW9+VwdoXyNG6Qt/NEhEx4Ww
5yOxtXAbqeUwyvbTUxRrJ02dQcb4FGcSMDgz2QHIZyCuDJkgC9Wj7KI1Q7g0GV+7
DcZvLcwPZOhLXqUzlcZXjDWM1PZ+az734qEribgyI+87LB8TujG8v5iOvdzT/Je4
JAllToZVGC3RddfTc6ww37gB39B++FYNzPg+nrIEU45KgEWPo2eJxBpX29lACh6q
EEBCQr9xyLxOC2eomYIl3dG2dV7nGGH7Pur2HjppgJphBvNkwxIWUa/pD6hAnOQ4
MkDDFGwWv7eJLb4UZuZjafTbqokHved3bwIDAQAB
-----END RSA PUBLIC KEY-----

$ cat pubkey2.pem 
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzgNcsEL7yGBoLBYBXFYr
DL6oLP8ZbW9+VwdoXyNG6Qt/NEhEx4Ww5yOxtXAbqeUwyvbTUxRrJ02dQcb4FGcS
MDgz2QHIZyCuDJkgC9Wj7KI1Q7g0GV+7DcZvLcwPZOhLXqUzlcZXjDWM1PZ+az73
4qEribgyI+87LB8TujG8v5iOvdzT/Je4JAllToZVGC3RddfTc6ww37gB39B++FYN
zPg+nrIEU45KgEWPo2eJxBpX29lACh6qEEBCQr9xyLxOC2eomYIl3dG2dV7nGGH7
Pur2HjppgJphBvNkwxIWUa/pD6hAnOQ4MkDDFGwWv7eJLb4UZuZjafTbqokHved3
bwIDAQAB
-----END PUBLIC KEY-----

我不太确定这里发生了什么,但 Ruby OpenSSL 库似乎正在生成无效的公钥 pem 文件。难道我做错了什么?


OSSL 似乎不支持该格式。 “openssl rsa”生成的是一个 RSA_PUBKEY 结构:一个带有 ASN.1“标记”(带有 OID)的 PUBKEY 记录,以表明它是一个 RSA 密钥。 Ruby 生成的是“原始”RSA 密钥(其中字节并不表明它是 RSA;因此您必须在 PEM 标头中声明它)。

OSSL 应使用 PEM_write_bio_RSA_PUBKEY(或通用 PEM_write_bio_PUBKEY)等 API 函数来代替/补充 PEM_write_bio_RSAPublicKey。

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

使用 Ruby OpenSSL 库时公钥无效 的相关文章

随机推荐

  • Kotlin AutoCompleteTextView 适配器项目选择给出不同的值

    所以我在这个项目上使用 Kotlin 我主要使用 Java 所以我试图在 Kotlin 中找到等效项来实现相同的功能 我从数据库中获取 JSONArray 并将其存储在名为的可序列化数据类中Congregation它有以下变量id Int
  • 如何解决22端口连接超时问题

    ssh connect to host bitbucket org port 22 Connection timed out fatal Could not read from remote repository Please make s
  • 如何创建静态字符串数组?

    Note这个问题包含 Rust 1 0 之前的语法 代码无效 但概念仍然相关 如何在 Rust 中创建全局静态字符串数组 对于整数 编译如下 static ONE u8 1 static TWO u8 2 static ONETWO sta
  • 当我不使用 CoreData 时,为什么我的 iOS 或 OSX 应用程序会出现 CoreData 错误?

    我在构建过程中收到以下错误 API 滥用 尝试在非拥有协调器上序列化存储访问 PSC 0x7fb5ae208890 存储 PSC 0x0 CoreData 为什么我的应用程序中出现 CoreData 错误 我没有使用 CoreData 此消
  • 从文件中读取第n行的快速方法

    介绍 我有一个名为的 C 进程MyProcess我称之为nbLines时间 地点nbLines是一个名为的大文件的行数InputDataFile txt在其中可以找到输入数据 例如调用 MyProcess InputDataFile txt
  • 为什么我无法“停用”pyenv / virtualenv?如何“修复”安装

    我是新安装的乌班图16 04并考虑到使用最新版本的开发pandas我安装了Python 3 6 0使用虚拟环境 选择 3 6 0 的一个原因是因为我在某处读到这个版本的 Python 可以原生处理虚拟环境 即无需安装任何其他东西 无论如何安
  • 为什么 AnyVal 不能用于 isInstanceOf 检查?

    我想知道 为什么 AnyVal 不能在 isInstanceOf 检查中使用 这种行为背后的原因是什么 scala gt val c t c Char t scala gt c isInstanceOf AnyVal
  • 在 Windows 任务栏中对单独的进程进行分组

    我有许多逻辑上相关的独立进程 但所有进程都是单独启动的 没有共同的 父 进程 是否可以使它们在 Windows 任务栏中显示为一组 工作样本 这是一些受雷米答案启发的工作代码 using System using System Runtim
  • Angular 4:响应式网格列表

    昨晚开始探索 Angular 4 我只是想知道是否有办法使mat grid listMaterial Design 组件响应式与 Boostrap 如何处理它一样简单 任何人 提前谢谢您 不是纯 html 不过你可以找到一些 html ts
  • 不间断破折号 html [重复]

    这个问题在这里已经有答案了 我知道有一个不间断的空白 nbsp 是否有不间断的破折号 我可以使用这样我的单词就不会在该位置换行 中断 另外 有人可以向我指出一个列表 其中包含在断开句子时优先考虑的字符 例如空格 提前致谢 Use 8209
  • iOS Objective-C 以编程方式获取 VPN IP

    我使用第三方应用程序连接VPN 我们可以在以下位置获取详细信息Settings gt VPN gt information 我怎样才能得到Assigned IP通过 Objective C 在我们的应用程序中以编程方式 NSString a
  • 是否可以在 Android 中动态更改 EditTextPreference 的摘要?

    我设置了一个首选项屏幕来编辑应用程序中的设置 我想插入一个 EditTextPreference 其中包含一个标题 如 设置您的名字 和一个包含输入名称的摘要 那可能吗 先感谢您 当然 这是一个简短的例子 EditTextPreferenc
  • VS2010 中使用 lambda 参数捕获的 C++ 嵌套 lambda bug?

    我使用的是 Visual Studio 2010 它显然在 lambda 上有一些错误行为 并且有这个嵌套 lambda 其中内部 lambda 返回包装为 std function 的第二个 lambda 参见MSDN 上的 高阶 Lam
  • 从函数调用动态 SQL

    我正在编写一个返回表的函数 有两个参数传递给该函数 并构建并执行查询并将其插入到返回的表中 但是我收到这个错误 只能从函数内执行函数和一些扩展存储过程 我不想使用存储过程 因为这是一个简单的实用函数 有谁知道这是否可以做到 我的函数编码如下
  • 跨多个类使用 SharedPreferences?

    我有一个 SharedPreferences 目前适用于一类 但不适用于第二类 我想我可能把它称为错误的 因为我得到的错误说 The method getSharedPreferences String int is undefined f
  • Firefox 中忽略的图像最大高度百分比

    HTML div class container div
  • android中无法绕过的Root检测方法

    我知道在 root 设备上运行拥有敏感信息的应用程序根本不安全 因此 开发人员通常在这种情况下进行 root 检测 如果发现设备已 root 则该应用程序将不会安装 一切都好 开发者在root检测中使用的主要技术是检查superuser a
  • Inno Setup,APP启动 Windows启动时

    对于 Inno 设置 我想为 Windows 启动时 MyAPP 自动启动创建一个复选框任务 我的代码如下 并且 如何编写下面的代码 DO Set AutoStart WhenWindowsStart Tasks Name StartMen
  • 使用 .Net 检测外部应用程序中的拖放操作

    我需要检测拖放操作外用 是否可以 我想到写一个钩子来检测这些操作 任何人都可以指出我可以尝试挂钩哪些消息或 api 函数来检测拖放事件的正确方向吗 我想用 C 来做这个 提前致谢 您可以通过两条明显的路径来尝试此操作 第一个是挂钩参与调解拖
  • 使用 Ruby OpenSSL 库时公钥无效

    我正在尝试在 Ruby 中生成 RSA 密钥对 主要使用来自这篇博文 http stuff things net 2009 12 11 generating rsa key pairs in ruby 这是我稍微修改过的代码 def gen