OpenSSL расшифровывает 256-битный (base64) зашифрованный пароль AES - неверная конечная длина блока - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь расшифровать пароль, закодированный aes-256-cdc, используя OpenSSL

#!/usr/bin/env bash

ak=BgL0cPoZQ4wZWOWl5mXBhlMsNbbZL2zvsWZXjuGy4Iw=
iv=cGEvcGWzE8t7CS3wbeoUFQ==
pass=RCQm23YHOCg3nxOl7CcQ7w==

#change format from base64 into hex
AES_KEY=<span class="math-container">$(echo "$</span>{ak}" | openssl base64 -d | xxd -p |tr -d '\n')
AES_IV=<span class="math-container">$(echo "$</span>{iv}" | openssl base64 -d | xxd -p)
ENCODED_PASSWORD=<span class="math-container">$(echo "$</span>{pass}" | openssl base64 -d | xxd -p)

echo "AES_KEY <span class="math-container">${AES_KEY}"
echo "AES_IV $</span>{AES_IV}"
echo "ENCODED_PASSWORD ${ENCODED_PASSWORD}"

#set password file
echo "${ENCODED_PASSWORD}" > in.txt

#decode password
openssl enc -nosalt -aes-256-cbc -d -iv <span class="math-container">${AES_IV} -K $</span>{AES_KEY} -in in.txt

, это приводит к сообщению об ошибке

AES_KEY 0602f470fa19438c1958e5a5e665c186532c35b6d92f6cefb166578ee1b2e08c
AES_IV 70612f7065b313cb7b092df06dea1415
ENCODED_PASSWORD 53b7adff6e85baedfa9dab80109ad67d
▒▒▒▒▒▒`$;▒▒▒▒%▒O▒Q▒▒▒S▒▒<7 7
                            bad decrypt
32624:error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length:evp_enc.c:518:
0602f470fa19438c1958e5a5e665c186532c35b6d92f6cefb166578ee1b2
e08c

Я думаю, что проблема в ключе aes (ak), в котором есть символ новой строки, который я пытаюсь удалить с помощью

|tr -d '\n'

, пароль должен декодироваться как

password

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

это работает как ожидалось:

#!/usr/bin/env bash
#base64 encoded aes key, iv and password
ak=BgL0cPoZQ4wZWOWl5mXBhlMsNbbZL2zvsWZXjuGy4Iw=
iv=cGEvcGWzE8t7CS3wbeoUFQ==
pass=OfOXO+ruKFTCsBwGHynXwA==

#change format from base64 into hex, for openssl to consume, xxd -p -c32 is taking care of wrapping of the new lines
AES_KEY=$(echo ${ak} | openssl base64 -d | xxd -p -c32)
AES_IV=$(echo ${iv} | openssl base64 -d | xxd -p -c32)

echo "AES_KEY ${ak}"
echo "AES_IV ${iv}"
echo "encoded password ${pass}"
echo "decoded password is: "
echo ${pass} | openssl enc -aes-256-cbc -d -a -K ${AES_KEY} -iv ${AES_IV}

объяснение:

openssl enc -aes-256-cbc -d

декодировать с использованием алгоритма aes-256-cbc

-a   

в нашем случае этоозначает, что openssl примет пароль в кодировке base64

-K 

ключ aes

-iv

aes iv

0 голосов
/ 25 сентября 2018

Нет, что не так в кодировке in.txt.Он вообще не должен быть текстовым, он должен быть двоичным .

В принципе, вы также не получите эту ошибку, если будете использовать echo -n с подавлением окончательного конца строкив зашифрованном виде.Однако дешифрование все равно будет неудачным, так как ожидается двоичное вместо двоичного значения в кодировке .

Вы можете изменить имя in.txt на in.bin, если хотите сохранитьфайл.Вы также должны иметь возможность просто передать зашифрованный текст в openssl, используя стандартный ввод (stdin).В этом случае вы можете сначала закодировать его, чтобы сохранить в переменной оболочки, а затем декодировать , а затем передать его в openssl для расшифровки.

Для двоичного кода используйте catвместо echo.

...