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.Réponses:
Si vous n'avez pas besoin d' espaces, vous
openssl
allez gérer cela avec l'-A
option:Donc:
Nous pouvons voir que les données base64 sont toutes sur une seule ligne et peuvent être décodées.
man enc
explique l'-A
option.Si vous devez conserver les espaces, vous devrez les supprimer (soit en les convertissant,
'\n'
soit en les supprimant et en les utilisant-A
).la source
-A
option a été l'une des premières choses que j'ai essayées, mais je l'ai fait avant d'essayer de supprimer les espaces, puis j'ai "continué" quand cela n'a pas fonctionné! La page de manuel ne mentionne pas que les espaces sont un problème. Quoi qu'il en soit, je viens de l'essayer à nouveau avec les espaces supprimés et cela fonctionne. C'est toujours méchant mais au moins c'est juste untr -d ' '
. C'est dommage qu'il ne puisse pas le traiter et ignorer les espaces blancs (comme lebase64
peut).openssl base64 -A
plus près d'être une interprétation stricte, que vous attendez d'un outil de chiffrement de sécurité. Je suppose que les coreutilsbase64
sont plus indulgents.-A
est fondamentalement "nous avons lesEVP_{En,De}codeBlock
facteurs, autant laisser les gens les utiliser".