Проблема с расшифровкой строки OpenSSL
Я постараюсь сделать это максимально сжатым.
Я хочу иметь возможность шифровать и дешифровать простые строки с помощью OpenSSL, которые я сделал раньше.
ОДНАКО, должны выполняться следующие условия:
- Использование простой фразы (без ключей)
- Нет файлов ввода/вывода
- Не запрашивать парольную фразу (укажите параметры командной строки для любого направления)
Я там 50%. Я могу успешно выполнить ENCRYPTION с помощью:
echo 'someTextIWantToEncrypt' | openssl enc -e -aes-256-cbc -nosalt -pass pass:mySecretPass
Выходной результат:
(??b}n??v???>??G??.?B??~?
Хорошо, отлично. Теперь я хочу DECRYPT эту строку. Поэтому я:
echo -n '(??b}n??v???>??G??.?B??~?' | openssl enc -d -aes-256-cbc -pass pass:mySecretPass
или даже в качестве альтернативы:
openssl enc -d -aes-256-cbc -pass pass:mySecretPass <<< '(??b}n??v???>??G??.?B??~?'
Но я получаю этот ответ:
bad magic number
Хотя я не хочу использовать файлы ввода/вывода, этот метод работает 100%:
# encrypt to file
echo -n 'someTextIWantToEncrypt' | openssl enc -e -nosalt -out test.txt -aes-256-cbc -pass pass:mySecretPass
# decrypt from file
openssl enc -d -nosalt -in test.txt -aes-256-cbc -pass pass:mySecretPass
# result of decryption (is successful):
someTextIWantToEncrypt
Итак... как я могу достичь вышеупомянутого процесса дешифрования без, используя файлы ввода/вывода вообще? Я чувствую, что я рядом, но не хватает некоторых мелких деталей.
Спасибо заранее.
Ответы
Ответ 1
Проблема заключается в том, что шифрование использует весь набор символов ASCII, включая непечатаемые символы. Если вы хотите иметь возможность вырезать и вставлять зашифрованные данные, вам необходимо преобразовать их только в печатные символы. Вы можете сделать это с помощью опции -base64
(или -a
):
echo 'someTextIWantToEncrypt' | \
openssl enc -base64 -e -aes-256-cbc -nosalt -pass pass:mySecretPass
KPkBkGJ9bs4YHvh24xz7m9jTlYWm1LcIFcWR0DwY4PU=
Затем расшифруйте его так же:
echo "KPkBkGJ9bs4YHvh24xz7m9jTlYWm1LcIFcWR0DwY4PU=" | \
openssl enc -base64 -d -aes-256-cbc -nosalt -pass pass:mySecretPass
ПРЕДУПРЕЖДЕНИЕ: Если вы используете openssl, я могу только предположить конфиденциальность данных и, следовательно, пароль для вас важны. Если это так, вы должны никогда не предоставлять пароль в командной строке, потому что он может быть доступен любому, у кого есть привилегия для запуска ps
.
Лучшее решение - это сохранить пароль в переменной окружения и открыть его отсюда:
export passwd="mySecretPass"
echo "KPkBkGJ9bs4YHvh24xz7m9jTlYWm1LcIFcWR0DwY4PU=" | \
openssl enc -base64 -d -aes-256-cbc -nosalt -pass env:passwd