Tengo dos fragmentos de datos base64 en una variable bash. Los saltos de línea habituales dentro de los datos de base64 han sido reemplazados por espacios y la variable es básicamente una cadena muy larga de una línea.
Puedo decodificar los dos fragmentos de datos de base64 contenidos en la variable, pero experimenté algunos matices al intentar hacerlo. Me gustaría entender si me estoy acercando a esto correctamente o si hay una mejor manera de decodificar datos base64 que no contengan saltos de línea. Esto es lo que tengo:
El primer fragmento tiene 350 caracteres y puedo decodificarlo con éxito así:
echo ${DATA::350} | openssl base64 -d | wc -c
256
El segundo fragmento tiene 5745 caracteres, pero el comando anterior no produce los resultados esperados. es decir:
$ echo {DATA:350} | openssl base64 -d | wc -c
432
Sin embargo, funciona si vuelvo a poner saltos de línea:
$ echo ${DATA:350} | tr ' ' "\n" | openssl base64 -d | wc -c
4240
Espero que haya algún problema de longitud de línea que el primer fragmento es lo suficientemente pequeño como para evitarlo, y parece ser una característica del decodificador base64 que se está utilizando (los dos habituales base64
y se openssl base64
comportan de manera diferente).
El base64
decodificador (en lugar de openssl base64
) se detiene en el primer carácter no válido (el espacio en blanco) y, por lo tanto, solo decodifica la primera "línea" (48 bytes de datos de salida) mientras que OpenSSL genera 432 caracteres (9 "líneas"). El base64
comando tiene una opción para ignorar la basura , por lo que esto funciona:
$ echo ${DATA:350} | base64 -d -i | wc -c
4240
El decodificador OpenSSL no parece tener esa opción.
Además, eliminar el espacio en blanco funciona por completo base64
pero no para openssl base64
:
$ echo ${DATA:350} | tr -d ' ' | openssl base64 -d | wc -c
400
$ echo ${DATA:350} | tr -d ' ' | base64 -d | wc -c
4240
Entonces, al final, reemplacé las nuevas líneas y usé el decodificador OpenSSL porque de todos modos necesitaba procesar aún más los datos decodificados:
$ openssl enc -d -a -in <(echo ${DATA:350} | /usr/bin/tr ' ' "\n") -aes-256-cbc -pass file:<(echo $skey) | ...
Pero me gustaría entender ¿Puede OpenSSL decodificar datos base64 que no contienen saltos de línea?
tr
usar${var//old[/new}
, pero no al mismo tiempo que la subcadena.