【问题标题】:Opening an RSA private key from Ruby从 Ruby 打开 RSA 私钥
【发布时间】:2026-02-12 21:35:01
【问题描述】:

认为我知道如何创建自定义加密的 RSA 密钥,但是如何读取像 ssh-keygen 那样加密的密钥?

我知道我能做到:

OpenSSL::PKey::RSA.new(File.read('private_key'))

但后来 OpenSSL 要求我输入密码...如何将其作为参数传递给 OpenSSL?

而且,我怎样才能创建一个与 ssh-keygen 生成的兼容的?

我这样做是为了创建私有加密密钥:

pass = '123456'
key = OpenSSL::PKey::RSA.new(1024)
key = "0000000000000000#{key.to_der}"
c = OpenSSL::Cipher::Cipher.new('aes-256-cbc')
c.encrypt
c.key = Digest::SHA1.hexdigest(pass).unpack('a2' * 32).map {|x| x.hex}.pack('c' * 32)
c.iv = iv
encrypted_key = c.update(key)
encrypted_key << c.final

此外,由 OpenSSL::PKey::RSA.new(1024)(未加密)生成的密钥在我尝试无密码登录时不起作用(即,我将公钥复制到服务器并使用私人登录)。

另外,当我通过 OpenSSL 打开一个 ssh-keygen 文件然后检查其内容时,它似乎在密钥的开头和结尾有其他字符。这正常吗?

我不太了解其中的一些安全知识,但我正在努力学习。我做错了什么?

【问题讨论】:

    标签: ruby encryption openssl encryption-asymmetric


    【解决方案1】:

    根据这里的博文:

    http://stuff-things.net/2008/02/05/encrypting-lots-of-sensitive-data-with-ruby-on-rails/

    你可以这样做:

    OpenSSL::PKey::RSA.new(File.read('private_key'), 'passphrase')

    祝你好运。

    【讨论】:

      【解决方案2】:

      我在这方面取得了一些进展。如果我使用 Net::SSH 库,我可以这样做:

      Net::SSH::KeyFactory.load_private_key 'keyfile', 'passphrase'
      

      通过阅读源代码,我还没有弄清楚库对 OpenSSL 的 PKey::RSA.new 做了什么来完成这个......然后我再次去测试,果然,OpenSSL 可以打开私钥没有 Net::SSH 就好了……我做了很多测试,以至于我以前没有正确测试过。

      但是我仍然有创建 SSH 兼容密钥对的问题......也许我会再次测试并得到答案:P......不,我对那部分不感兴趣

      【讨论】: