Реализация AES/CBC/PKCS5Padding в Ruby (для рельсов)

Мне нужно расшифровать зашифрованный текст с помощью AES/CBC/PKCS5Padding схема. Зашифрованный текст, который я получил, был сгенерирован с использованием некоторого программного обеспечения Java.

Все значения ниже меняются на что-то вымышленное.

Что я получаю, это ключ aHjgYFutF672eGIUGGVlgSETyM9VJj0K (256 бит = 32 символа * 8 бит) и IV: rxYoks3c8hRRsL2P (16-битный)

и (я предположил) Base64 зашифрованный результат ETlAHS5ZcshKxQUaHVB8==

Что мне нужно, это расшифровать в Ruby это ETlAHS5ZcshKxQUaHVB8== чтобы получить в и простая строка, как "Blablablabla"

Я попытался расшифровать то, что получил, используя как Ruby, так и обычную консольную команду linux openssl. ПРИМЕЧАНИЕ. Ключ и 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 и PKCS # 7 и # 5 в Java? № 5 предназначен для блоков данных размером 8 байт, а № 7 - для блоков размером 16 байт? Просто дикая догадка...

1 ответ

Решение

Код Ruby в моем первом посте правильный, проблема была в этом AES/CBC/PKCS5Padding используется частью Java.

Java-программа не должна использовать эту схему для AES-CBC-256, PKCS5 дополняет размер блока до 64 бит (8 байт), но AES-256-CBC использует 16-байтовые блоки. Следовательно, PKCS7 должен быть использован.

Другие вопросы по тегам