Validador de reutilização de nonce ChaCha20-Poly1305 | Audite nonces AEAD
Cole uma lista de nonces de ChaCha20-Poly1305 (12 bytes) ou XChaCha20-Poly1305 (24 bytes) e a ferramenta marca cada duplicado, cada entrada com comprimento inválido e o risco de colisão de aniversário em uma única tela. Feita para pegar o erro que quebra por completo a cifra AEAD: um nonce reutilizado com a mesma chave.
💡 Sobre esta ferramenta
Em cifras AEAD como o ChaCha20-Poly1305, o nonce é um "número usado uma única vez", e o nome não é por acaso. Reutilize um com a mesma chave e você vaza o fluxo de chaves do ChaCha20 como o XOR de duas mensagens e, pior, expõe a chave de autenticação de uso único do Poly1305, o que permite a um atacante forjar textos cifrados. Não é um caso de borda acadêmico: é um incidente recorrente em produção, causado por bugs de geração, remetentes sem estado e reinícios que zeram os contadores.
O complicado é que a reutilização de nonce quase nunca aparece na revisão de código. Esquemas aleatórios, baseados em contador ou derivados de timestamp parecem corretos isoladamente e depois colidem entre instâncias. Este validador parte da realidade do dia a dia: cole os nonces direto dos seus logs ou exportação de auditoria e ele lista os valores duplicados exatos, além de contar à parte as entradas que não batem com o comprimento esperado de 12 ou 24 bytes, porque um comprimento inválido costuma indicar uma falha de extração mais do que reutilização.
Ele também calcula o limite de aniversário sob a hipótese de nonces aleatórios: P(colisão) ≈ q² / 2ⁿ⁺¹. Você vê a probabilidade de colisão para a contagem atual e o teto de mensagens seguras em que a probabilidade fica abaixo de 2⁻³² e 2⁻⁶⁴. Na prática: com um nonce de 96 bits, a geração aleatória cruza um risco de colisão relevante perto de 2³² mensagens por chave, e é por isso que remetentes sem estado são orientados ao nonce de 192 bits do XChaCha20.
🧐 Perguntas frequentes
O nonce é secreto? É seguro colar aqui? Não, o nonce é um valor público que viaja em claro junto ao texto cifrado, não é a chave. Mesmo assim são dados operacionais dos seus logs, então a ferramenta processa tudo dentro da aba do navegador e não envia nada. Ao fechar a aba, os dados colados somem.
Qual é a diferença real entre ChaCha20-Poly1305 e XChaCha20-Poly1305? O tamanho do nonce. O ChaCha20-Poly1305 da RFC 8439 usa um nonce de 96 bits (12 bytes). O XChaCha20-Poly1305 acrescenta uma derivação HChaCha20 para suportar um nonce de 192 bits (24 bytes). Com 192 bits, a geração aleatória praticamente nunca colide, ideal para remetentes que não conseguem manter um contador.
Quando uma entrada é marcada como "comprimento inválido"? Quando a quantidade de dígitos hex não corresponde à variante escolhida (24 caracteres hex para ChaCha20, 48 para XChaCha20) ou contém caracteres não hexadecimais. As implementações AEAD as rejeitam de imediato, então um comprimento inválido geralmente aponta para um bug de extração que vale investigar.
Posso colar nonces com prefixo 0x ou dois-pontos?
Pode. O prefixo 0x, os dois-pontos, os espaços e os hífens são removidos automaticamente, e a comparação ignora maiúsculas. Cole suas linhas de log como estão.
O que significa a "contagem de mensagens seguras"? Para nonces aleatórios, é o número máximo de mensagens que você pode enviar com uma chave antes de a probabilidade de colisão cruzar o alvo. Para nonces de 96 bits, o teto de 2⁻³² fica perto de 2³² mensagens. Depois disso, gire a chave em vez de confiar no acaso.
Funciona para nonces baseados em contador (sequenciais)? A detecção de duplicados e a verificação de comprimento funcionam igual. O limite de aniversário assume geração aleatória, então em um esquema de contador estrito trate o campo de probabilidade como informativo e foque em confirmar zero duplicados.
📚 Curiosidades
As falhas de reutilização de nonce mais citadas são as colisões de GCM encontradas em várias pilhas TLS e protocolos caseiros, e como o ChaCha20-Poly1305 compartilha a mesma estrutura AEAD, ele herda a mesma armadilha. É justamente por isso que a implantação do QUIC pelo Google combina ChaCha20-Poly1305 com nonces geridos por contador estrito em vez de deixar ao acaso.
O "X" de XChaCha20 significa extended: um passo HChaCha20 estende o nonce utilizável para 192 bits. O libsodium o popularizou e ele virou a resposta padrão quando alguém pergunta como usar ChaCha20 com segurança sem gerenciar um contador. Jogar 192 bits aleatórios é simplesmente menos sujeito a erros do que vigiar uma sequência de 96 bits.