Problèmes entièrement résolus
-
Passer à 68 caractères depuis une charge utile JSON ASCII de 49 caractères et inversement 5 étapes
L'entrée est
eyJuYW1lIjoiU3BvY2siLCJyb2xlIjoic2NpZW50aXN0IiwiYWN0aXZlIjp0cnVlfQ==, et le contenu utile sous-jacent est le JSON ASCII de 49 caractères{"name":"Spock","role":"scientist","active":true}. Le panneau affiche 68 pour Caractères et 68 pour Octets. Arrivez à 68 à partir de 49 sans compter la chaîne encodée — puis faites le chemin inverse.-
Le Base64 est un changement de base, pas un chiffrement. 64 = 26, donc chaque caractère de sortie transporte 6 bits ; 3 octets d'entrée transportent 24 bits ; et 6 divise 24 exactement. C'est tout le format : 3 octets en entrée, 4 caractères en sortie, sans reste.
-
49 octets représentent 16 triplets complets et 1 octet restant. Les triplets sont la partie facile — 16 × 4 = 64 caractères, chacun d'eux transportant 6 bits complets.
-
L'octet orphelin est la source du remplissage. 8 bits n'est pas un multiple de 6, il est donc complété par 4 bits à zéro pour faire 12, ce qui donne 2 caractères, et 2 signes '=' complètent le quatuor. 64 + 2 + 2 = 68. Chaque '=' marque une position de caractère qui ne possédait pas de bits propres.
-
Les deux lignes du panneau indiquent 68, et cette concordance ne dit rien sur cette chaîne. L'alphabet base64 étant ASCII, chaque caractère émis vaut exactement 1 octet ; la ligne Octets suivrait la ligne Caractères pour n'importe quelle entrée en base64.
-
Maintenant, faites le chemin inverse. 68 ÷ 4 = 17 quatuors, 17 × 3 = 51 emplacements d'octets, moins les 2 emplacements que le remplissage indique comme vides : 49. Vous venez de retrouver la taille du contenu utile sans en décoder le moindre octet.
Réponse
68 caractères pour 49 octets, et ce sont les signes '=' qui permettent de relire directement 49 depuis l'enveloppe. Cette inversion est la moitié utile. La longueur d'une chaîne base64 dépend de la longueur de son contenu utile et de rien d'autre, de sorte que vous pouvez déclarer la taille exacte de quelque chose qu'il ne vous est pas permis d'ouvrir — ce qui est une affirmation plus forte que n'importe quel détecteur de cette page ne fait sur le contenu. L'autre moitié est l'addition. 4 caractères pour 3 octets ne s'améliore jamais, donc le base64 coûte 4/3 à la limite : un fichier de 1 MiB arrive sous forme de 1 398 104 caractères, soit 341 KiB de pur emballage. Cette chaîne fait pire, à 68/49 = 1,388, car les 2 caractères de remplissage sont un surcoût fixe et 49 octets est bien trop court pour l'amortir.
-
-
Bits aléatoires dans un GUID/UUID v4 et identifiants générés avant une répétition 6 étapes
L'entrée est
550e8400-e29b-41d4-a716-446655440000, que le panneau qualifie de GUID/UUID v4 tout en proposant de le décoder en Base64URL. Calculez combien de ses bits ont réellement été choisis au hasard, et combien de tels identifiants peuvent être générés avant qu'une répétition cesse d'être improbable.-
Comptons d'abord la forme : 8-4-4-4-12 chiffres hexadécimaux avec 4 traits d'union entre les groupes, soit 32 + 4 = 36 caractères, et la ligne Octets correspond à 36 car les chiffres hexadécimaux et les traits d'union sont tous en ASCII. Remarquez ce que valent ces 4 traits d'union. Situés à des positions fixes, ils transportent 0 bit.
-
Chaque chiffre hexadécimal vaut 4 bits, donc les 32 qui comptent en contiennent 128. C'est le nombre habituellement cité pour un UUID, et pour cette chaîne, il est trop élevé.
-
Le 13e chiffre et le 17e chiffre en sont la raison. Le 13e chiffre est 4, et il s'agit du champ de version — un UUID de version 4 est tenu d'y placer un 4, donc ces 4 bits n'ont jamais été un choix. Le 17e chiffre est 'a', qui vaut 1010 en binaire, et ses 2 bits de poids fort sont l'étiquette de variante, fixée à 10. 6 bits consacrés à nommer le format laissent 122.
-
L'espace est donc de 2122, soit environ 5,32 × 1036 — et non les 3,40 × 1038 que 128 bits auraient donnés.
-
Les répétitions suivent la règle des anniversaires plutôt que la taille de l'espace. En tirant n identifiants au hasard, la probabilité qu'une paire corresponde croît comme n2/(2N), et en fixant cela à 0,5, on obtient n = 1,177√N. Le décompte varie comme la racine carrée, c'est pourquoi les 6 bits perdus à l'étape 3 coûtent un facteur 8 et non un facteur 64.
-
√N vaut 2,31 × 1018, donc n ressort à 2,7 × 1018.
Réponse
122 bits, et 2,7 × 1018 UUID avant que la probabilité d'une répétition n'atteigne 0,5. Générés à raison de 109 par seconde, cela représente 86 ans, et c'est tout l'argument en faveur de laisser chaque machine générer les siens sans registre ni coordination — pas un protocole, juste un nombre trop grand pour être atteint. Mettez cela en regard du premier problème et le contraste résume la raison d'être de cette page. Le Base64 compacte 6 bits dans chaque caractère ; cette chaîne consacre 36 caractères à 122 bits, soit 3,4 bits chacun, de sorte que le même identifiant tiendrait dans 21 caractères base64url. Les 15 autres achètent la lisibilité, pas l'information. Et le décodage Base64URL proposé par le panneau revient signalé comme binaire plutôt que texte pour la raison la plus simple qui soit : rien n'y a jamais été encodé.
-
Références (1)
- The alphabets and padding rules the detector reasons about, normatively: S. Josefsson, "The Base16, Base32, and Base64 Data Encodings." RFC 4648, IETF, 2006.