2015-09-02 123 views
1

我使用Ruby自動執行OpenSSL文件加密過程。以這種方式加密的文件需要能夠在Linux命令行上使用OpenSSL進行解密。使用Ruby OpenSSL加密文件並使用命令行解密

def encrypt_file 
    cipher = OpenSSL::Cipher.new('aes-256-cbc') 
    cipher.encrypt 
    cipher.key = "somelongkeystring" 

    buf = "" 
    File.open("file.enc", "wb") do |outf| 
     File.open("file.zip", "rb") do |inf| 

     while inf.read(4096, buf) 
      outf << cipher.update(buf) 
     end 
     outf << cipher.final 
     end 
    end 
    end 

我需要能夠解密使用以下命令中的文件(file.enc):

我可以使用以下方法的Ruby加密文件

$ openssl aes-256-cbc -d -in file.enc -out file.zip 

然而,當我運行這個時,我從上面輸入密鑰後得到一個錯誤bad magic number

既然不能改變解密的方法(這意味着它僅使用一個密碼,並輸入在Linux命令行),我怎樣才能改變我的Ruby方法對文件進行加密,因此它可以被解密這樣?

+0

可能的重複http://stackoverflow.com/questions/14602069/why-cant-i-make-openssl-with-ruby-and-command-line-openssl-interoperable –

+0

@MarcoSandrini我的問題類似於題。然而,解決方案是改變openssl命令,我說我不能這樣做。我只能修改Ruby方法。 – analyticsPierce

+0

然後你應該改變你的代碼,以便它使用與openssl的命令行版本使用相同的派生算法來衍生密碼中的密鑰和IV。但是引用問題的答案http://security.stackexchange.com/questions/29106/openssl-recover-key-and-iv-by-passphrase「使用一個自定義的密鑰派生函數和一些重複的散列函數,標準和未經良好審查的構造(!)依賴於可疑聲譽(!!)的MD5哈希函數;「 –

回答

0

我得到這個工作,雖然沒有使用Ruby OpenSSL實現(我更喜歡)。如果你使用-k標誌,你可以指定一個密碼作爲下一個參數,那麼你不需要傳遞任何東西,並可以使用系統調用它。

system("openssl aes-256-cbc -k '#{key}' -in file.zip -out file.enc") 

如果任何人有使用Ruby OpenSSL實現的方法,我將不勝感激。

1

在stackoverflow中的類似問題的幫助下,我能夠在ruby中實現它。

首先u've添加一個iv的東西放在烏爾密碼對象,像這樣

cipher = OpenSSL::Cipher.new('aes-256-cbc') 
cipher.encrypt 
cipher.iv = "0"*16 
cipher.key = "somelongkeystring" 

雖然解密u've傳遞-K-iv

openssl aes-256-cbc -d -in file.enc -out file.zip -K <key_hex_code> -iv <iv_hex_code> 

U能夠產生hex碼像這樣的紅寶石"string".unpack('H*')。在cli中也必須有一些方法來生成十六進制代碼。

0

基於薩米特的答案:A液

require 'openssl' 

class Crypto 
    def initialize(key, iv, data, cipher='aes-256-cbc') 
    @key = key 
    @iv = iv 
    @cipher = cipher 
    @data = data 
    end 

    def encrypt 
    c = OpenSSL::Cipher.new(@cipher).encrypt 
    c.iv = @iv 
    c.key = @key 
    c.update(@data) + c.final  
    end 

    def decrypt 
    c = OpenSSL::Cipher.new(@cipher).decrypt 
    c.iv = @iv 
    c.key = @key 
    c.update(@data) + c.final  
    end 
end 

iv = '0'*16 
key = '1'*32 
message = 'My Message' 
encrypted = Crypto.new(key,iv,message).encrypt 
puts Crypto.new(key,iv,encrypted).decrypt 
puts `echo -n '#{encrypted}' | openssl aes-256-cbc -d -K #{key.unpack('H*').first} -iv #{iv.unpack('H*').first}` 
# My Message 
# My Message 

該解決方案適用於字符串,可以很容易地適應文件。

相關問題