Может ли OpenSSL декодировать данные base64, которые не содержат разрывов строк?


9

У меня есть две части данных 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, которые не содержат разрывов строк?


FWIW bash может изменять или удалять символы самостоятельно, без trиспользования, ${var//old[/new}но не одновременно с подстрокой.
dave_thompson_085

Ответы:


17

Если вам не нужны пробелы openssl, обработайте это с помощью -Aопции:

Так:

$ ls -l sp2.bmp
-rw-r--r-- 1 sweh sweh 3000054 Apr 21 20:13 sp2.bmp
$ x=$(openssl base64 -A < sp2.bmp)                
$ echo "$x" | wc
      1       1 4000073
$ echo "$x" | openssl base64 -d -A > res
$ ls -l res
-rw-r--r-- 1 sweh sweh 3000054 Jul 30 10:00 res
$ cmp res sp2.bmp 
$ 

Мы видим, что данные base64 находятся в одной строке и могут быть декодированы.

man encобъясняет -Aвариант.

Если вам нужно сохранить пробелы, вам нужно удалить их (путем преобразования '\n'или удаления или использования -A).


Этот -Aвариант был одним из первых, которые я попробовал, но я сделал это, прежде чем пытаться удалить пробелы, а затем «двинулся дальше», когда он не работал! На странице руководства ничего не говорится о проблемах с пробелами. В любом случае, я только что попробовал это снова с удаленными пробелами, и это работает. Это все еще противно, но, по крайней мере, это просто tr -d ' '. Обидно, что он не может обработать это и игнорировать пробелы (как base64может).
звездный день

2
RFC 4648 говорит, что строго говоря пробелы (раздел 3.3) и переводы строк (раздел 3.1) запрещены в base64. В разделе 3.3 также говорится, что реализации ДОЛЖНЫ отклонять данные в этом случае. Так openssl base64 -Aближе к тому , строгая интерпретация, которую вы могли бы ожидать от инструмента шифрования безопасности. Я думаю, что coreutils base64более снисходительный.
Стивен Харрис

2
OpenSSL внедрил base64 в 1990-х годах (до 4648 или даже 3548) в основном для чтения и записи файлов PEM (действительно PEM-подобных) и S / MIME, оба из которых требуют переноса строк. -Aв основном "у нас есть EVP_{En,De}codeBlockфакторы, которые могут позволить людям их использовать".
dave_thompson_085
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.