Ruby中的AES / CBC / PKCS5Padding实现(用于rails)

时间:2013-03-22 21:21:37

标签: ruby aes pkcs#7 pkcs#5

我需要解密使用AES/CBC/PKCS5Padding方案加密的文本。我得到的加密文本是使用一些Java软件生成的。

以下所有值都被我改为虚构的东西。

我得到的是密钥aHjgYFutF672eGIUGGVlgSETyM9VJj0K(256位= 32字符* 8位) 和IV:rxYoks3c8hRRsL2P(16位)

和(我猜)Base64编码加密结果ETlAHS5ZcshKxQUaHVB8==

我需要的是在Ruby中解密这个ETlAHS5ZcshKxQUaHVB8==来获取一个简单的字符串,比如'blablablabla'

我尝试使用Ruby和普通的linux控制台openssl命令解密我所得到的内容。 注意:下面的Key和IV不是实际代码中使用的那些:

# require 'openssl'
# require 'base64'
# decryption
aes = OpenSSL::Cipher::AES256.new(:CBC)
aes.decrypt
aes.padding = 1 # actually it's on by default
aes.key = "aHjgYFutF672eGIUGGVlgSETyM9VJj0K"
aes.iv="rxYoks3c8hRRsL2P"
aes.update(Base64::decode64("ETlAHS5ZcshKxQUaHVB8=="))+aes.final
=> OpenSSL::Cipher::CipherError: bad decrypt

与上述相同,但在控制台,键和iv转换为十六进制时使用:

$ echo -n $key256 | hexdump -e '16/1 "%02x"'
$ echo -n $iv     | hexdump -e '16/1 "%02x"'

$ echo "ETlAHS5ZcshKxQUaHVB8==" | openssl enc -d -aes-256-cbc -a  -K 61486a675946757446363732654749554747566c67534554794d39564a6a304b -iv 7278596f6b73336338685252734c3250
bad decrypt
140378046432928:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:539:

顺便说一句。要在控制台中取回原始密钥和iv,请使用:

$ echo 61486a6... | xxd -r -p
#or , but then need to add \x before every character pair
$ eval `printf "\x61\x48......"

请给我一些线索,因为我希望在开始时能够使用https://github.com/chicks/aes gem。宝石似乎很好,它只是OpenSSL::Cipher::Cipher的一个很好的包装。

ruby​​ / openssl是否可能使用不同的PKCS,比方说PKCS#7,Java使用PKCS#5,我需要预处理我的数据?或者ruby / openssl与Java的PKCS#7和#5之间存在一些不匹配? #5用于8字节数据块,#7用于16字节?只是猜测......

1 个答案:

答案 0 :(得分:3)

我的第一篇文章中的Ruby代码是正确的,问题是Java部分使用了这个AES/CBC/PKCS5Padding

Java程序不应该将此方案用于AES-CBC-256PKCS5填充到64位(8字节)块大小,但AES-256-CBC使用16字节块。因此,必须使用PKCS7