OpenSSL può decodificare i dati base64 che non contengono interruzioni di riga?


9

Ho due blocchi di dati base64 in una variabile bash. Le solite interruzioni di riga all'interno dei dati base64 sono state sostituite da spazi e la variabile è sostanzialmente una stringa di una riga molto lunga.

Posso decodificare i due blocchi di dati base64 contenuti nella variabile ma ho provato alcune sfumature quando ho provato a farlo. Vorrei capire se mi sto avvicinando a questo correttamente o esiste un modo migliore per decodificare i dati base64 che non contengono interruzioni di riga. Ecco cosa ho:

Il primo blocco è di 350 caratteri e posso decodificarlo correttamente in questo modo:

echo ${DATA::350} | openssl base64 -d | wc -c
256

Il secondo blocco è di 5745 caratteri ma il comando sopra non produce i risultati previsti. vale a dire:

$ echo {DATA:350} | openssl base64 -d | wc -c
432

Tuttavia, funziona se inserisco le interruzioni di riga:

$ echo ${DATA:350} | tr ' ' "\n" | openssl base64 -d | wc -c
4240

Mi aspetto che ci sia un problema di lunghezza della linea che il primo blocco è abbastanza piccolo da evitare, e sembrerebbe essere una caratteristica del decodificatore base64 in uso (i due soliti, base64e openssl base64, comportarsi diversamente).

Il base64decodificatore (invece di openssl base64) si ferma al primo carattere non valido (lo spazio bianco) e quindi decodifica la prima "riga" (48 byte di dati di output) mentre OpenSSL emette 432 caratteri (9 "righe"). Il base64comando ha un'opzione per ignorare la spazzatura , quindi funziona:

$ echo ${DATA:350} | base64 -d -i | wc -c
4240

Il decodificatore OpenSSL non sembra avere tale opzione.

Inoltre, rimuovere lo spazio bianco funziona interamente per base64ma non openssl base64:

$ echo ${DATA:350} | tr -d ' ' | openssl base64 -d | wc -c
400

$ echo ${DATA:350} | tr -d ' ' | base64 -d | wc -c
4240

Quindi, alla fine, ho sostituito le nuove righe e usato il decodificatore OpenSSL perché avevo bisogno di elaborare ulteriormente i dati decodificati:

$ openssl enc -d -a -in <(echo ${DATA:350} | /usr/bin/tr ' ' "\n") -aes-256-cbc -pass file:<(echo $skey) | ...

Ma vorrei capire OpenSSL può decodificare i dati base64 che non contengono interruzioni di riga?


FWIW bash può modificare o eliminare i caratteri stessi, senza tr, usando ${var//old[/new}- ma non contemporaneamente alla sottostringa.
dave_thompson_085,

Risposte:


17

Se non hai bisogno di spazi openssl, gestirli con l' -Aopzione:

Così:

$ 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 
$ 

Possiamo vedere che i dati di base64 sono tutti su una riga e possono essere decodificati.

man encspiega l' -Aopzione.

Se è necessario mantenere gli spazi, è necessario rimuoverli (convertendoli in '\n'o eliminando e utilizzando -A).


L' -Aopzione è stata una delle prime cose che ho provato, ma l'ho fatto prima di provare a rimuovere gli spazi e poi "spostato" quando non ha funzionato! La pagina man non menziona nulla sugli spazi come un problema. Comunque, l'ho appena provato di nuovo con gli spazi rimossi e funziona. È ancora brutto ma almeno è solo un tr -d ' '. È un peccato che non possa elaborarlo e ignorare lo spazio bianco (come base64può).
Starfry,

2
RFC 4648 afferma che gli spazi strettamente parlando (sezione 3.3) e gli avanzamenti di riga (sezione 3.1) sono vietati in base64. La sezione 3.3 afferma inoltre che le implementazioni DEVONO rifiutare i dati in questo caso. Quindi openssl base64 -Aè più vicino ad essere un'interpretazione rigorosa, che ti aspetteresti da uno strumento di crittografia di sicurezza. Immagino che il coreutils base64sia più indulgente.
Stephen Harris,

2
OpenSSL ha implementato base64 negli anni '90 (prima del 4648 o addirittura del 3548) principalmente per leggere e scrivere file 'PEM' (molto simili a PEM) e S / MIME, entrambi i quali richiedono interruzioni di riga. -Aè fondamentalmente "abbiamo i EVP_{En,De}codeBlockfattori, potrebbe anche permettere alle persone di usarli".
dave_thompson_085,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.