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

如何使用OpenPGP和Ruby对数据进行非对称加密?,ruby,encryption,gnupg,encryption-asymmetric,openpgp,Ruby,Encryption,Gnupg,Encryption Asymmetric,Openpgp,这感觉应该非常简单,但我没有任何运气 场景是这样的:我有一个公共的*.asc密钥文件。我想使用这个文件(不是我的个人密钥环)加密服务器上的数据,这样我就可以用一个密钥在本地解密它 在命令行中,我可以使用gpg实现这一点,但我更喜欢使用Ruby库,它不仅仅是CLI的包装器(即,可能是一个提供C库绑定的库)。我看过GPGME和OpenPGP gems,但还没有弄清楚如何使用它们。文档(尤其是OpenPGP)非常稀少 举个例子,我曾尝试使用GPGME,但没有任何运气: key = GPGME::Dat

这感觉应该非常简单,但我没有任何运气

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

在命令行中,我可以使用
gpg
实现这一点,但我更喜欢使用Ruby库,它不仅仅是CLI的包装器(即,可能是一个提供C库绑定的库)。我看过GPGME和OpenPGP gems,但还没有弄清楚如何使用它们。文档(尤其是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
已经有人经历过了吗?这肯定不会那么复杂吧?

我想我现在已经弄明白了。实际上,这只是我遗漏的几个简单片段:

  • 使用
    GPGME::keylist\u mode\u EXTERN
    keylist\u mode
    初始化
    GPGME::Ctx
    对象
  • 使用
    GPGME::Ctx#import
    导入公钥文件
  • 使用
    GPGME::Crypto#encrypt
    执行加密并指定正确的收件人
  • 因此,我的解决方案如下所示:

    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
    

    我不熟悉GPGME,但是如果您尝试
    GPGME::Key.import(File.open(path_to_File))
    ,它能工作吗?如果仍然失败,那么如果您对.asc进行Base64解码并重试会怎么样?您能否从命令行演示如何执行此操作?典型用法要求首先将收件人公钥导入密钥环。。。