web-dev-qa-db-fra.com

Pourquoi un message chiffré se termine-t-il parfois par "=="

Comme exercice de programmation, je dois décrypter un message. Les seuls indices que j'ai, c'est qu'il semble être:

  • Le message codé ne contient que des caractères Base64
  • une séquence de n lettres (n dans 1,4,7,10) fois il renvoie un message chiffré avec "==".
  • une séquence de n lettres (n dans 2,5,8,11) fois il retourne un message crypté avec "=".
  • une séquence de n lettres (n dans 3,6,9,12) renvoie un message chiffré sans caractère spécifique.

Je ne veux pas de solution, je me demande simplement si cette séquence d'occurrences pour le signe égal fournit un indice ou non.

Je vous remercie.

23
czioutas

Les signes = se rapportent à la longueur de la chaîne encodée en Base64 . Essentiellement, dans la forme probablement la plus courante de Base64, = est utilisé comme caractère de remplissage pour garantir que le dernier bloc peut être décodé correctement.

Base64 n'est pas un chiffrement - il n'y a pas de cachette - mais est souvent utilisé pour permettre l'envoi de données binaires sous forme de texte uniquement. Tous les caractères utilisés dans Base64 seront collés correctement et peuvent être saisis à l'aide d'un clavier sans touches de modification au-delà de la touche Maj.

53
Matthew

Comme mentionné ci-dessus, Base64 n'est pas un cryptage mais un encodage. Comme vous pouvez le voir sur le RFC qui a spécifié la norme, base64 fonctionne de la manière suivante.

  • Vous avez un flux de caractères s, de longueur n.
  • Vous lisez 3 valeurs 8 bits du flux (vous avez maintenant un total de 24 bits = 3 octets)
  • Vous cassez ces 24 bits en 4 groupes de 6 bits chacun
  • À l'aide du tableau de l'alphabet Base 64, vous encodez chacun des groupes 6 bits en équivalent Base64

Maintenant, il y a une chance que vous atteigniez la fin du flux et que vous n'ayez pas de groupe 24 bits (s mod 6! = 0) . Si cela se produit, vous ajoutez des zéros à la fin de votre entrée, jusqu'à ce que vous ayez un nombre entier de groupes de 6 bits.

Étant donné que votre flux d'entrée est ASCII encodé, il est donc composé de caractères 8 bits, il n'y a que deux cas où vous vous retrouvez dans le scénario ci-dessus.

1) Vous avez 8 bits dans le dernier groupe

2) Vous avez 16 bits dans le dernier groupe

Dans le premier cas, 4 zéros sont ajoutés (vous donnant 12 bits) et la sortie serait de deux caractères (2 * 6 bits = 12 bits) encodés en fonction de l'alphabet, et deux caractères de remplissage "="

Dans le deuxième cas, 2 zéros seraient ajoutés (vous donnant un total de 18 bits) et la sortie serait de trois caractères (3 * 6 bits = 18 bits) et un caractère de remplissage "=".

C'est ainsi que parfois vous vous retrouvez avec un, deux ou aucun "=" à la fin du texte encodé. Pour plus d'informations, vous devriez vraiment lire le RFC qui définit ce standard et l'entrée wikipedia qui s'y rapporte.

3
G. Kaklam.

Il existe plusieurs autres systèmes de codage qui utilisent le = signer certains comprennent:

ESAB46 (BASE64 à l'envers)

ATOM128

MEGAN35

FERON74

Comme cela a déjà été dit, le = est un remplissage/tampon pour indiquer la longueur du décodeur. C'est notamment la raison pour laquelle les cryptologues recherchent une meilleure méthode de mise en mémoire tampon, car cela = est un cadeau mort.

1
Chad Baxter