J'ai deux morceaux de données base64 dans une variable bash. Les sauts de ligne habituels dans les données base64 ont été remplacés par des espaces et la variable est fondamentalement une très longue chaîne d'une ligne.
Je peux décoder les deux morceaux de données base64 contenus dans la variable mais j'ai rencontré quelques nuances en essayant de le faire. Je voudrais comprendre si je m'approche de cela correctement ou s'il existe un meilleur moyen de décoder les données base64 qui ne contiennent pas de sauts de ligne. Voici ce que j'ai:
Le premier morceau est de 350 caractères et je peux le décoder avec succès comme ceci:
echo ${DATA::350} | openssl base64 -d | wc -c
256
Le deuxième bloc est de 5745 caractères mais la commande ci-dessus ne produit pas les résultats attendus. c'est à dire:
$ echo {DATA:350} | openssl base64 -d | wc -c
432
Cependant, cela fonctionne si je remets les sauts de ligne en arrière:
$ echo ${DATA:350} | tr ' ' "\n" | openssl base64 -d | wc -c
4240
Je m'attends à ce qu'il y ait un problème de longueur de ligne que le premier bloc soit assez petit pour éviter, et il semblerait que ce soit une caractéristique du décodeur base64 utilisé (les deux habituels base64
et openssl base64
se comportent différemment).
Le base64
décodeur (au lieu de openssl base64
) s'arrête au premier caractère invalide (le blanc) et décode donc juste la première "ligne" (48 octets de données de sortie) tandis qu'OpenSSL produit 432 caractères (9 "lignes"). La base64
commande a une option pour ignorer les ordures , donc cela fonctionne:
$ echo ${DATA:350} | base64 -d -i | wc -c
4240
Le décodeur OpenSSL ne semble pas avoir une telle option.
En outre, la suppression de l'espace blanc fonctionne entièrement pour base64
mais pas openssl base64
:
$ echo ${DATA:350} | tr -d ' ' | openssl base64 -d | wc -c
400
$ echo ${DATA:350} | tr -d ' ' | base64 -d | wc -c
4240
Donc, à la fin, j'ai remplacé les sauts de ligne et j'ai utilisé le décodeur OpenSSL parce que j'avais quand même besoin de continuer à traiter les données décodées:
$ openssl enc -d -a -in <(echo ${DATA:350} | /usr/bin/tr ' ' "\n") -aes-256-cbc -pass file:<(echo $skey) | ...
Mais je voudrais comprendre Est-ce qu'OpenSSL peut décoder les données base64 qui ne contiennent pas de sauts de ligne?
tr
, en utilisant${var//old[/new}
- mais pas en même temps que la sous-chaîne.