У меня есть две части данных base64 в переменной bash. Обычные разрывы строк в данных base64 были заменены пробелами, а переменная в основном представляет собой одну очень длинную однострочную строку.
Я могу декодировать два фрагмента данных base64, содержащихся в переменной, но у меня возникли некоторые нюансы при попытке сделать это. Я хотел бы понять, правильно ли я подхожу к этому или есть лучший способ декодировать данные base64, которые не содержат разрывов строк. Вот что у меня есть:
Первый блок содержит 350 символов, и я могу успешно его расшифровать следующим образом:
echo ${DATA::350} | openssl base64 -d | wc -c
256
Второй блок состоит из 5745 символов, но приведенная выше команда не дает ожидаемых результатов. то есть:
$ echo {DATA:350} | openssl base64 -d | wc -c
432
Тем не менее, это работает, если я поставлю разрывы строк:
$ echo ${DATA:350} | tr ' ' "\n" | openssl base64 -d | wc -c
4240
Я ожидаю, что есть некоторая проблема длины строки, которую первый блок достаточно мал, чтобы избежать, и это может показаться особенностью используемого декодера base64 (два обычных, base64
и openssl base64
ведут себя по-разному).
base64
Декодер (вместо openssl base64
) останавливается на первом недопустимого символа (пробелы) и , следовательно , только декодирует первую «линию» (48 байт выходных данных) , тогда как OpenSSL выводит 432 символов (9 «линии»). У base64
команды есть опция игнорировать мусор , так что это работает:
$ echo ${DATA:350} | base64 -d -i | wc -c
4240
OpenSSL-декодер не имеет такой возможности.
Кроме того, удаление пробелов полностью работает, base64
но не для openssl base64
:
$ echo ${DATA:350} | tr -d ' ' | openssl base64 -d | wc -c
400
$ echo ${DATA:350} | tr -d ' ' | base64 -d | wc -c
4240
Итак, в конце я заменил символы новой строки и использовал декодер OpenSSL, потому что мне все равно нужно было еще обрабатывать декодированные данные:
$ openssl enc -d -a -in <(echo ${DATA:350} | /usr/bin/tr ' ' "\n") -aes-256-cbc -pass file:<(echo $skey) | ...
Но я хотел бы понять, может ли OpenSSL декодировать данные base64, которые не содержат разрывов строк?
tr
использования,${var//old[/new}
но не одновременно с подстрокой.Ответы:
Если вам не нужны пробелы
openssl
, обработайте это с помощью-A
опции:Так:
Мы видим, что данные base64 находятся в одной строке и могут быть декодированы.
man enc
объясняет-A
вариант.Если вам нужно сохранить пробелы, вам нужно удалить их (путем преобразования
'\n'
или удаления или использования-A
).источник
-A
вариант был одним из первых, которые я попробовал, но я сделал это, прежде чем пытаться удалить пробелы, а затем «двинулся дальше», когда он не работал! На странице руководства ничего не говорится о проблемах с пробелами. В любом случае, я только что попробовал это снова с удаленными пробелами, и это работает. Это все еще противно, но, по крайней мере, это простоtr -d ' '
. Обидно, что он не может обработать это и игнорировать пробелы (какbase64
может).openssl base64 -A
ближе к тому , строгая интерпретация, которую вы могли бы ожидать от инструмента шифрования безопасности. Я думаю, что coreutilsbase64
более снисходительный.-A
в основном "у нас естьEVP_{En,De}codeBlock
факторы, которые могут позволить людям их использовать".