2015-09-02 154 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 

该解决方案适用于字符串,可以很容易地适应文件。

相关问题