如何使用Ruby使用OpenPGP对数据进行非对称加密?

时间:2012-07-18 18:51:04

标签: ruby encryption gnupg encryption-asymmetric openpgp

这感觉应该是死的简单,但我没有运气。

场景是这样的:我有一个公共* .asc密钥文件。我想使用这个文件(而不是我的个人密钥环)来加密服务器上的数据,这样我就可以用密钥在本地解密它。

从命令行我可以使用gpg实现这一点,但我更喜欢使用一个不仅仅是CLI包装器的Ruby库(也就是说,可能是提供与C库绑定的一个) )。我查看了GPGME和OpenPGP宝石,但未能弄清楚如何使用它们。文档(特别是对于OpenPGP)非常稀疏。

例如,在这里,我尝试过使用GPGME,没有任何运气:

key = GPGME::Data.new(File.open(path_to_file))
data = GPGME::Data.new("I want to encrypt this string.")

# Raises GPGME::Error::InvalidValue
GPGME::Ctx.new do |ctx|
  e = ctx.encrypt(key, data)
end

有没有人经历过这个?当然这不是那么复杂吗?

1 个答案:

答案 0 :(得分:2)

相信我现在已经弄明白了。它实际上只是我遗漏的一些简单的部分:

  1. 使用GPGME::Ctx keylist_mode初始化GPGME::KEYLIST_MODE_EXTERN对象。
  2. 使用GPGME::Ctx#import导入公钥文件。
  3. 使用GPGME::Crypto#encrypt执行加密并指定正确的收件人。
  4. 所以我的解决方案现在看起来像这样:

    key = GPGME::Data.new(File.open(path_to_file))
    data = GPGME::Data.new("I want to encrypt this string.")
    
    GPGME::Ctx.new(GPGME::KEYLIST_MODE_EXTERN) do |ctx|
      ctx.import(key)
      crypto = GPGME::Crypto.new(:armor => true, :always_trust => true)
      e = crypto.encrypt(data, :recipients => "recipient@domain.com")
    end