【发布时间】:2021-07-15 18:06:28
【问题描述】:
我需要解密使用AES/CBC/PKCS5Padding 方案加密的文本。我得到的加密文本是使用一些 Java 软件生成的。
下面的所有值都被我改成了虚构的。
我得到的是一个 Key aHjgYFutF672eGIUGGVlgSETyM9VJj0K (256-bit = 32-chars * 8-bit)
和 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
与上面相同,但在控制台中,key 和 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。 gem 看起来不错,它只是 OpenSSL::Cipher::Cipher 的一个很好的包装器。
ruby/openssl 是否有可能使用不同的 PKCS,比如说 PKCS#7,Java 使用 PKCS#5,我需要预处理我的数据?或者 ruby/openssl 与 Java 的 PKCS #7 和 #5 之间存在 vesion 不匹配? #5 表示 8 字节数据块,#7 表示 16 字节?只是一个疯狂的猜测......
【问题讨论】: