Comment encoder et décoder du Z85
- Collez les octets en hex dans Entrée · Hex. Les espaces, les deux-points et les préfixes
0xsont acceptés : un dump hex se colle tel quel. - Lisez le Z85 dans Sortie · Z85 (ZeroMQ).
- Si le nombre d’octets n’est pas un multiple de 4, une erreur indique ce nombre. Ne cochez Autoriser un dernier bloc partiel (non standard) que si les deux côtés s’accordent sur cette extension.
- Pour décoder, cliquez sur Z85 (ZeroMQ) → Hex dans le sélecteur de sens et collez la chaîne Z85. Réglez Vers sur Base64 ou Texte pour d’autres vues, ou utilisez Enregistrer les octets pour obtenir un fichier binaire.
Les vecteurs de test de la spécification
La spécification Z85 de ZeroMQ (RFC 32 de la série des RFC ZeroMQ) donne deux valeurs de test. Cet outil reproduit les deux :
| Hex | Z85 |
|---|---|
86 4F D2 6F B5 59 F7 5B | HelloWorld |
8E 0B DD 69 76 28 B9 1D 8F 24 55 87 EE 95 C5 B0 4D 48 96 3F 79 25 98 77 B4 9C D9 06 3A EA D3 B7 | JTKVSB%%)wK0E.X)V>+}o?pNmC{O&4W4b!Ni{Lh6 |
La première montre la structure en blocs : 8 octets, deux blocs, dix caractères. La seconde est une clé de 32 octets et son encodage de 40 caractères, la taille que l’on voit dans les configurations CurveZMQ.
Quelques valeurs limites : quatre octets nuls donnent 00000, et quatre octets ff donnent %nSc0. Z85 n’a pas de raccourci pour les blocs nuls : une suite de zéros reste à cinq caractères par bloc.
Pourquoi ZeroMQ utilise Z85
Les clés CurveZMQ sont 32 octets aléatoires. ZeroMQ avait besoin de les mettre sous forme de chaînes simples dans des fichiers de configuration, des lignes de commande et du code source. Z85 a été conçu pour cela :
- Il est 25 % plus gros que les octets bruts, contre 33 % pour Base64 : une clé de 32 octets fait donc 40 caractères au lieu de 44.
- Son alphabet ne contient ni
", ni', ni\, ni accent grave : une clé peut aller dans un littéral de chaîne C, Python ou shell sans échappement. Il évite aussi,et;. - Les chiffres et les lettres viennent en premier (
0-9 a-z A-Z), suivis de 23 caractères de ponctuation :.-:+=^!/*?&<>()[]{}@%$#.
Il contient tout de même <, > et & : du Z85 dans du XML ou du HTML doit donc être échappé. En JSON, aucun échappement n’est nécessaire.
Z85 en Python
Z85 et b85encode de Python partagent la même arithmétique et ne diffèrent que par l’alphabet : une traduction de caractères convertit l’un en l’autre.
import base64
B85 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!#$%&()*+-;<=>?@^_`{|}~"
Z85 = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-:+=^!/*?&<>()[]{}@%$#"
TO_Z85 = str.maketrans(B85, Z85)
FROM_Z85 = str.maketrans(Z85, B85)
def z85encode(data: bytes) -> str:
if len(data) % 4:
raise ValueError("Z85 needs a multiple of 4 bytes")
return base64.b85encode(data).decode().translate(TO_Z85)
def z85decode(text: str) -> bytes:
return base64.b85decode(text.translate(FROM_Z85))
z85encode(bytes.fromhex("864FD26FB559F75B")) # 'HelloWorld'
Si vous dépendez déjà de PyZMQ, zmq.utils.z85.encode et decode font la même chose. En C, libzmq propose zmq_z85_encode et zmq_z85_decode. D’autres manipulations d’octets en Python sur la page Python.
Problèmes courants
- « Z85 encode des blocs de 4 octets et les données font N octets ». L’entrée n’est pas alignée sur les blocs. Vérifiez que vous avez copié toute la clé ; une clé de 32 octets qui en affiche 31 a perdu une paire de chiffres hex.
- « Z85 attend des groupes de 5 caractères ; il en reste N ». La chaîne Z85 a été tronquée ou contient des caractères en trop. Une clé CurveZMQ doit faire exactement 40 caractères.
- La chaîne se décode, mais la clé ne fonctionne pas. Il s’agit peut-être d’Ascii85 ou du Base85 de Git, qui partagent les règles de longueur mais pas l’alphabet : les mêmes caractères se décodent alors en octets différents. Essayez sur la page Base85 en réglant De sur une autre variante.
FAQ
Pourquoi Z85 exige-t-il un multiple de 4 octets ?
La spécification ne définit Z85 que pour des blocs entiers de 4 octets, ce qui permet à un décodeur de compter sur le fait que 5 caractères valent toujours 4 octets. Des données d’une autre longueur doivent être complétées ou encadrées par l’application. Cochez Autoriser un dernier bloc partiel (non standard) pour encoder quand même la fin à la manière d’Ascii85.
Quelle est la longueur d'une clé CurveZMQ en Z85 ?
40 caractères. Les clés publiques et secrètes CurveZMQ font 32 octets, et 32 / 4 × 5 = 40. C’est la longueur que renvoie zmq_curve_keypair(), plus un caractère nul final en C.
Z85, est-ce la même chose qu'Ascii85 ?
Même arithmétique, alphabet différent. Les deux écrivent 4 octets en 5 chiffres de base 85, mais Z85 place les chiffres et les lettres en premier et évite les guillemets et les barres obliques inverses ; il n’a ni raccourci z ni délimiteurs <~ ~>.
Comment encoder du Z85 en Python ?
La bibliothèque standard n’a pas de Z85, mais base64.b85encode utilise la même arithmétique : traduire l’alphabet de sa sortie donne du Z85. L’extrait de cette page fait exactement cela. PyZMQ fournit aussi zmq.utils.z85.