Como codificar e decodificar Z85
- Cole os bytes em hex em Entrada · Hex. Espaços, dois-pontos e prefixos
0xsão aceitos, então um dump hex pode ser colado como está. - Leia o Z85 em Saída · Z85 (ZeroMQ).
- Se a quantidade de bytes não for múltipla de 4, aparece um erro que informa a quantidade. Marque Permitir último bloco parcial (fora do padrão) só se os dois lados concordarem com essa extensão.
- Para decodificar, clique em Z85 (ZeroMQ) → Hex no seletor de direção e cole a string Z85. Ajuste Para em Base64 ou Texto para outras visualizações, ou use Salvar bytes para um arquivo binário.
Os vetores de teste da especificação
A especificação Z85 do ZeroMQ (RFC 32 na série de RFCs do ZeroMQ) traz dois valores de teste. Esta ferramenta reproduz os dois:
| 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 |
O primeiro mostra a estrutura de blocos: 8 bytes, dois blocos, dez caracteres. O segundo é uma chave de 32 bytes e a sua codificação de 40 caracteres, o tamanho que você vê em configurações do CurveZMQ.
Alguns valores extremos: quatro bytes zero são 00000, e quatro bytes ff são %nSc0. O Z85 não tem atalho para blocos de zeros, então uma sequência de zeros continua ocupando cinco caracteres por bloco.
Por que o ZeroMQ usa Z85
Chaves CurveZMQ são 32 bytes aleatórios. O ZeroMQ precisava de um jeito de colocá-las em arquivos de configuração, linhas de comando e código-fonte como strings simples. O Z85 foi criado para isso:
- Ele é 25% maior que os bytes brutos, contra 33% do Base64, então uma chave de 32 bytes tem 40 caracteres em vez de 44.
- O alfabeto não tem
",',\nem crase, então uma chave pode entrar em um literal de string em C, Python ou shell sem escape. Ele também evita,e;. - Dígitos e letras vêm primeiro (
0-9 a-z A-Z), seguidos de 23 caracteres de pontuação:.-:+=^!/*?&<>()[]{}@%$#.
Ele ainda contém <, > e &, então Z85 dentro de XML ou HTML precisa de escape. Em JSON, não precisa de nenhum.
Z85 em Python
O Z85 e o b85encode do Python compartilham a aritmética e só diferem no alfabeto, então uma tradução de caracteres converte um no outro:
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'
Se você já depende do PyZMQ, zmq.utils.z85.encode e decode fazem o mesmo. Em C, a libzmq tem zmq_z85_encode e zmq_z85_decode. Mais sobre manipulação de bytes em Python na página de Python.
Problemas comuns
- “O Z85 codifica blocos de 4 bytes e os dados têm N bytes”. A entrada não está alinhada em blocos. Confira se você copiou a chave inteira; uma chave de 32 bytes que aparece com 31 perdeu um par de dígitos hex.
- “O Z85 precisa de grupos de 5 caracteres; sobraram N”. A string Z85 foi cortada ou tem caracteres a mais. Uma chave CurveZMQ precisa ter exatamente 40 caracteres.
- A string decodifica, mas a chave não funciona. Ela pode ser Ascii85 ou Base85 do Git, que seguem as mesmas regras de comprimento, mas não o mesmo alfabeto, então os mesmos caracteres decodificam para bytes diferentes. Teste na página de Base85 com De em outra variante.
Perguntas frequentes
Por que o Z85 exige um múltiplo de 4 bytes?
A especificação só define o Z85 para blocos inteiros de 4 bytes, então um decodificador pode contar com cada 5 caracteres valendo 4 bytes. Dados de outro comprimento precisam ser completados ou delimitados pela aplicação. Marque Permitir último bloco parcial (fora do padrão) para codificar o final no estilo Ascii85 mesmo assim.
Qual o comprimento de uma chave CurveZMQ em Z85?
40 caracteres. Chaves pública e secreta do CurveZMQ têm 32 bytes, e 32 / 4 × 5 = 40. É o comprimento que zmq_curve_keypair() retorna, mais um terminador nulo em C.
Z85 é a mesma coisa que Ascii85?
Mesma aritmética, alfabeto diferente. Os dois escrevem 4 bytes como 5 dígitos em base 85, mas o Z85 coloca dígitos e letras primeiro e evita aspas e barras invertidas, e não tem o atalho z nem os delimitadores <~ ~>.
Como codificar Z85 em Python?
A biblioteca padrão não tem Z85, mas o base64.b85encode usa a mesma aritmética, então traduzir o alfabeto da saída dele gera Z85. O snippet desta página faz isso. O PyZMQ também traz zmq.utils.z85.