openssl钥匙长度在红宝石中太短,而不是bash



我最初在bash中使用一个简单的加密脚本进行了实验,并且它的工作原理几乎可以预期。但是,我现在试图在Ruby中做同样的事情,Ruby版本的功能似乎有所不同。

bash

Encrypt

echo 'hello' | openssl enc -aes-256-cbc -a

密码:mypass

结果:U2FsdGVkX19rERfOXiKs97FgwIkLy3+ttZzaHkEoQyE=

解密

echo 'U2FsdGVkX19rERfOXiKs97FgwIkLy3+ttZzaHkEoQyE=' | openssl aes-256-cbc -d -a

密码:mypass

结果:hello


Ruby

require "openssl"
require 'base64'
cipher = OpenSSL::Cipher.new('AES-256-CBC').encrypt
cipher.key = 'mypass'

这是我到目前为止在Ruby中尝试的内容,但我收到OpenSSL::Cipher::CipherError: key length too short错误。我想尽可能地模仿狂欢。

openssl使用(基于无证件的)基于密码的密钥推导功能(PBKDF),使用8个字节盐和迭代计数为1. EVP_BytesToKey。到Ciphertext(检查结果的第一个字节以查看魔术)。

显然"mypass"不能是AES的正确键。AES键为128、192和256键尺寸的16、24或32字节二进制值。但是,您可以使用命令行上的-K开关直接指定键,以使代码与Ruby Cipher对象兼容。在这种情况下,您需要使用二进制(文件)或十六进制的openssl命令行和Ruby指定密钥。您还需要指定IV。

另外,您必须找到Ruby的EVP_BytesToKey实现,但请注意,这是一个旧的OpenSSL特定功能,具有完全不安全的迭代计数。

最新更新