2012-07-18 24 views
3

这感觉就像它应该是死的简单,但我没有任何运气。如何使用OpenPGP和Ruby对数据进行非对称加密?

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

从命令行我可以实现这个使用gpg,但我宁愿使用一个Ruby库,不仅仅是CLI的包装(也就是说,提供绑定到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 

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

+0

我不熟悉GPGME,但如果你尝试'它的工作原理GPGME :: Key.import(File.open(文件路径)) '?如果它仍然失败,如果你Base64解码.asc然后再试一次? – emboss 2012-07-18 19:13:14

+0

你能证明你如何从命令行执行此操作吗?典型的使用要求首先将收件人公钥导入到钥匙环中... – PinnyM 2012-07-18 19:44:45

回答

2

相信我现在已经明白了。它实际上只是一些简单的作品我失踪:

  1. 初始化与GPGME::KEYLIST_MODE_EXTERN一个keylist_modeGPGME::Ctx对象。
  2. 使用GPGME::Ctx#import导入公钥文件。
  3. 使用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 => "[email protected]") 
end 
相关问题