Ich habe zwei Blöcke von base64-Daten in einer Bash-Variablen. Die üblichen Zeilenumbrüche in den base64-Daten wurden durch Leerzeichen ersetzt, und die Variable ist im Grunde eine sehr lange einzeilige Zeichenfolge.
Ich kann die zwei in der Variablen enthaltenen Blöcke von base64-Daten dekodieren, aber ich habe beim Versuch einige Nuancen festgestellt. Ich würde gerne verstehen, ob ich mich dem richtig nähere oder ob es eine bessere Möglichkeit gibt, base64-Daten zu dekodieren, die keine Zeilenumbrüche enthalten. Folgendes habe ich:
Der erste Block besteht aus 350 Zeichen und ich kann ihn erfolgreich so dekodieren:
echo ${DATA::350} | openssl base64 -d | wc -c
256
Der zweite Block besteht aus 5745 Zeichen, aber der obige Befehl führt nicht zu den erwarteten Ergebnissen. dh:
$ echo {DATA:350} | openssl base64 -d | wc -c
432
Es funktioniert jedoch, wenn ich die Zeilenumbrüche zurückstelle:
$ echo ${DATA:350} | tr ' ' "\n" | openssl base64 -d | wc -c
4240
Ich gehe davon aus, dass es ein Problem mit der Zeilenlänge gibt, das der erste Block klein genug ist, um es zu vermeiden, und es scheint ein Merkmal des verwendeten base64-Decoders zu sein (die beiden üblichen base64
und openssl base64
verhalten sich unterschiedlich).
Der base64
Decoder openssl base64
stoppt (anstelle von ) beim ersten ungültigen Zeichen (dem Leerzeichen) und decodiert daher nur die erste "Zeile" (48 Byte Ausgabedaten), während OpenSSL 432 Zeichen (9 "Zeilen") ausgibt. Der base64
Befehl verfügt über eine Option zum Ignorieren von Müll . Dies funktioniert also:
$ echo ${DATA:350} | base64 -d -i | wc -c
4240
Der OpenSSL-Decoder scheint keine solche Option zu haben.
Das Entfernen des Leerzeichens funktioniert auch vollständig für, base64
aber nicht für openssl base64
:
$ echo ${DATA:350} | tr -d ' ' | openssl base64 -d | wc -c
400
$ echo ${DATA:350} | tr -d ' ' | base64 -d | wc -c
4240
Am Ende habe ich also die Zeilenumbrüche ersetzt und den OpenSSL-Decoder verwendet, weil ich die decodierten Daten trotzdem weiterverarbeiten musste:
$ openssl enc -d -a -in <(echo ${DATA:350} | /usr/bin/tr ' ' "\n") -aes-256-cbc -pass file:<(echo $skey) | ...
Aber ich würde gerne verstehen, ob OpenSSL Base64-Daten dekodieren kann, die keine Zeilenumbrüche enthalten.
tr
, mit${var//old[/new}
- aber nicht zur gleichen Zeit wie substringing.