Cómo codificar y decodificar Z85
- Pega los bytes en hex en Entrada · Hex. Se aceptan espacios, dos puntos y prefijos
0x, así que un volcado hex se pega tal cual. - Lee el Z85 en Salida · Z85 (ZeroMQ).
- Si el número de bytes no es múltiplo de 4, obtienes un error que indica cuántos hay. Marca Permitir último bloque parcial (no estándar) solo si ambas partes están de acuerdo en usar esa extensión.
- Para decodificar, haz clic en Z85 (ZeroMQ) → Hex en el selector de dirección y pega la cadena Z85. Pon A en Base64 o Texto para otras vistas, o usa Guardar bytes para obtener un archivo binario.
Los vectores de prueba de la especificación
La especificación Z85 de ZeroMQ (RFC 32 de la serie de RFC de ZeroMQ) da dos valores de prueba. Esta herramienta reproduce ambos:
| 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 |
El primero muestra la estructura de bloques: 8 bytes, dos bloques, diez caracteres. El segundo es una clave de 32 bytes y su codificación de 40 caracteres, el tamaño que ves en la configuración de CurveZMQ.
Algunos valores límite: cuatro bytes a cero son 00000, y cuatro bytes ff son %nSc0. Z85 no tiene atajo para los bloques de ceros, así que una secuencia de ceros sigue ocupando cinco caracteres por bloque.
Por qué ZeroMQ usa Z85
Las claves CurveZMQ son 32 bytes aleatorios. ZeroMQ necesitaba una forma de ponerlas en archivos de configuración, líneas de comandos y código fuente como cadenas simples. Z85 se diseñó para eso:
- Ocupa un 25 % más que los bytes en bruto, frente al 33 % de Base64, así que una clave de 32 bytes son 40 caracteres en lugar de 44.
- Su alfabeto no tiene
",',\ni backtick, así que una clave puede ir en un literal de cadena de C, Python o shell sin escapes. También evita,y;. - Primero van los dígitos y las letras (
0-9 a-z A-Z), seguidos de 23 signos de puntuación:.-:+=^!/*?&<>()[]{}@%$#.
Aun así contiene <, > y &, así que Z85 dentro de XML o HTML necesita escapes. En JSON no necesita ninguno.
Z85 en Python
Z85 y b85encode de Python comparten la aritmética y solo se diferencian en el alfabeto, así que una traducción de caracteres convierte uno en otro:
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 ya dependes de PyZMQ, zmq.utils.z85.encode y decode hacen lo mismo. En C, libzmq tiene zmq_z85_encode y zmq_z85_decode. Hay más sobre el manejo de bytes en Python en la página de Python.
Problemas habituales
- «Z85 codifica bloques de 4 bytes y los datos tienen N bytes». La entrada no está alineada a bloques. Comprueba que copiaste la clave entera; una clave de 32 bytes que muestra 31 ha perdido un par de dígitos hex.
- «Z85 necesita grupos de 5 caracteres; sobran N». La cadena Z85 está cortada o tiene caracteres de más. Una clave CurveZMQ debe tener exactamente 40 caracteres.
- La cadena se decodifica pero la clave no funciona. Puede ser Ascii85 o Base85 de Git, que comparten las reglas de longitud pero no el alfabeto, así que los mismos caracteres se decodifican en bytes distintos. Pruébala en la página de Base85 con De en otra variante.
Preguntas frecuentes
¿Por qué Z85 exige un múltiplo de 4 bytes?
La especificación solo define Z85 para bloques completos de 4 bytes, así que un decodificador puede contar con que cada 5 caracteres son 4 bytes. Los datos de otra longitud los tiene que rellenar o delimitar la aplicación. Marca Permitir último bloque parcial (no estándar) para codificar el final al estilo de Ascii85 de todos modos.
¿Cuánto mide una clave CurveZMQ en Z85?
40 caracteres. Las claves pública y secreta de CurveZMQ tienen 32 bytes, y 32 / 4 × 5 = 40. Es la longitud que devuelve zmq_curve_keypair(), más un nulo final en C.
¿Z85 es lo mismo que Ascii85?
Misma aritmética, distinto alfabeto. Los dos escriben 4 bytes como 5 dígitos en base 85, pero Z85 pone primero los dígitos y las letras y evita las comillas y la barra invertida, y no tiene el atajo z ni los delimitadores <~ ~>.
¿Cómo codifico Z85 en Python?
La biblioteca estándar no tiene Z85, pero base64.b85encode usa la misma aritmética, así que traducir el alfabeto de su salida da Z85. El fragmento de esta página hace justo eso. PyZMQ también incluye zmq.utils.z85.