【发布时间】:2015-11-27 13:36:24
【问题描述】:
我正在使用 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 方法来加密文件以便可以通过这种方式解密?
【问题讨论】:
-
@MarcoSandrini 我的问题与那个问题相似。但是,给出的解决方案是更改我说我不能做的 openssl 命令。我只能修改Ruby方法。
-
然后您应该更改您的代码,以便它使用与命令行版本的 openssl 用于从密码短语派生密钥和 IV 相同的派生算法。但是引用问题security.stackexchange.com/questions/29106/…的答案“使用带有一些重复散列的自定义密钥派生函数。这是一个非标准且未经严格审查的构造(!),它依赖于可疑声誉的MD5散列函数(!!) ;"
-
鉴于我之前评论中引用的答案中的信息,我将开始考虑替代路线,例如将对 openssl 命令行工具的调用包装到 system/exec/spawn 调用中
-
@MarcoSandrini 从系统或 exec 或 open3 调用 openssl 仅接受来自键盘或 tty 的输入。它不接受标准输入来提供密钥。