Ruby中的OpenSSL密钥长度太短,而不是Bash

时间:2017-09-15 00:16:33

标签: ruby bash encryption

我最初在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。

1 个答案:

答案 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特定函数,具有完全不安全的迭代计数。