ruby - 使用 Ruby OpenSSL 库时公钥无效

标签 ruby cryptography openssl

我正在尝试在 Ruby 中生成 RSA key 对,主要使用 this blog post 中的示例.这是我稍微修改过的代码:

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 库生成的公钥与 openssl cli 工具从私钥中提取的公钥不同:

$ 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 结构:一个 PUBKEY 记录,它是 ASN.1-“标记”(带有 OID)以指示它是一个 RSA key 。 Ruby 生成的是“原始”RSA key (其中字节不表示它是 RSA;因此您必须在 PEM header 中声明它)。

OSSL 应该使用 PEM_write_bio_RSA_PUBKEY(或通用 PEM_write_bio_PUBKEY)之类的 API 函数来代替/除 PEM_write_bio_RSAPublicKey 之外。

关于ruby - 使用 Ruby OpenSSL 库时公钥无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4635837/

相关文章:

.net - 使用 PKCS11 提供程序对文件进行加密签名并以 CMS 格式输出的最简单方法?

c - 使用 EVP 和 OpenSSL,用 C 编码

java - 在 Selenium Test Automation 中使用符号定义 Css Selector 或不使用符号之间的性能优势?

ruby-on-rails - 被 nokogiri 在 ruby​​ on rails 中转换为 "\u0092"

.net - 有没有办法在不使用外部库的情况下在 C# 中生成大素数?

c# - 证书的私钥导出为不同的值?

encryption - 在内存和存储受限的系统上加密和/或解密大文件 (AES),使用 "catastrophe recovery"

cmake - FindOpenSSL.cmake :422 when parsing string 处 CMake 代码中的语法错误

ruby - 如何使用 XPath 和 nokogiri 解析 for 循环内的 inner_html

ruby 正则表达式在字符串中查找前两个数字