使用Ruby OpenSSL加密文件并使用命令行解密

时间:2015-09-02 06:58:48

标签: ruby openssl

我使用Ruby自动化OpenSSL文件加密过程。以这种方式加密的文件需要能够在linux命令行上使用OpenSSL进行解密。

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

  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):

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

然而,当我运行此操作时,从上面输入密钥后,bad magic number出现错误。

由于我无法更改解密方法(意味着它只使用密码并在linux命令行中输入),如何更改我的Ruby方法来加密文件以便以这种方式解密?

3 个答案:

答案 0 :(得分:2)

借助stackoverflow中的类似问题,我能够在ruby中实现它。

首先你要在你的密码对象中添加一个iv的东西,比如这个

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

解密时,您需要传递-K-iv

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

你可以像这样hex生成红宝石中的"string".unpack('H*')代码。必须有一些方法在cli中生成十六进制代码。

答案 1 :(得分:1)

基于Sumit答案的解决方案:

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

此解决方案适用于字符串,可轻松适应文件。

答案 2 :(得分:0)

虽然没有使用Ruby OpenSSL实现(我更喜欢),但我还是这样做了。如果你使用-k标志,你可以指定一个密码作为下一个参数,那么你不需要传递任何东西,可以使用系统来调用它。

{{1}}

如果有人使用Ruby OpenSSL实现方法,我将不胜感激。