2012-07-18 30 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 
相關問題