我使用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方法来加密文件以便以这种方式解密?
答案 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实现方法,我将不胜感激。