我最初在Bash中尝试过一个简单的加密脚本,它的工作方式与预期相当。但是,我现在正试图在Ruby中做同样的事情,Ruby版本的功能看起来有点不同。
加密
echo 'hello' | openssl enc -aes-256-cbc -a
密码:mypass
结果:U2FsdGVkX19rERfOXiKs97FgwIkLy3+ttZzaHkEoQyE=
解密
echo 'U2FsdGVkX19rERfOXiKs97FgwIkLy3+ttZzaHkEoQyE=' | openssl aes-256-cbc -d -a
密码:mypass
结果:hello
require "openssl"
require 'base64'
cipher = OpenSSL::Cipher.new('AES-256-CBC').encrypt
cipher.key = 'mypass'
这是我到目前为止在Ruby中尝试的但是我收到了OpenSSL::Cipher::CipherError: key length too short
错误。我想尽可能地模仿Bash。
答案 0 :(得分:4)
OpenSSL使用一个名为EVP_BytesToKey
的(基本上未记录的)基于密码的密钥派生函数(PBKDF),使用8字节盐和1的迭代计数。每个8字节的魔法和盐都以密文为前缀(检查结果的第一个字节以查看魔法。
显然"mypass"
不能成为AES的正确密钥。 AES密钥是128,292和256密钥大小的16,24或32字节二进制值。但是,您可以使用命令行上的-K
开关直接指定密钥,以使代码与Ruby Cipher
对象兼容。在这种情况下,您需要使用二进制(文件)或十六进制为openssl
命令行和Ruby指定密钥。您还需要指定IV。
或者你必须找到Ruby的EVP_BytesToKey
实现,但请注意,这是一个旧的OpenSSL特定函数,具有完全不安全的迭代计数。