Реализация 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
должен быть использован.