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

标签 ruby aes pkcs#7 pkcs#5

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

以下所有值均由我更改为虚构的值。

我得到的是一个 key 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

与上面相同,但在控制台中, 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:

顺便说一句。在您使用的控制台中取回原始 key 和 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 之间存在版本不匹配? #5 用于 8 字节数据 block 而#7 用于 16 字节?只是一个疯狂的猜测......

最佳答案

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

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

关于ruby - Ruby 中的 AES/CBC/PKCS5Padding 实现(用于 rails),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15580065/

相关文章:

java - 将文本加密为 AES/CBC/PKCS7Padding

java - 编译证书验证程序时出错

ruby-on-rails - 并在方法结束时返回

mysql - 我可以在 ruby​​ on Rails 中使用存储过程吗?

Ruby 无法连接到 ruby​​gems.org

java - java AES解密函数有什么问题?

ruby - 在脚本中创建NotificationHub(首选Ruby)

java - 开放声明中的这个错误是什么?

cocoa - 在相同加密的情况下更改密文(IV) Cocoa?

c# - 解码 ASN.1 - PKCS#7 非分离签名