Toda vez que você envia uma mensagem, faz um pagamento online ou entra em um serviço seguro, a criptografia está trabalhando nos bastidores para manter seus dados privados. Um dos algoritmos que faz esse trabalho hoje é o ChaCha20: uma cifra rápida, segura e leve, de confiança tanto de gigantes da tecnologia quanto de especialistas em segurança. Veja o que é e como ela mantém seus dados seguros.

ChaCha20

Compreender o algoritmo ChaCha20

Para compreender o algoritmo ChaCha20, é útil decompô-lo nos seus elementos essenciais: a sua origem, o processo que utiliza para produzir dados encriptados e o papel da sua chave, nonce e contador. Cada uma destas partes trabalha em conjunto para proporcionar velocidade, eficiência e segurança, tornando o ChaCha20 uma opção sólida em muitos protocolos de encriptação modernos.

Quem desenvolveu o ChaCha20 e porquê?

ChaCha foi desenvolvido em 2008 por Daniel J. Bernstein, um matemático, cientista da computação e criptógrafo americano-alemão. Baseia-se no seu design anterior, o Salsa20.

Uma das principais razões para criar o ChaCha20 foi oferecer uma alternativa sólida a cifras amplamente utilizadas, como o Advanced Encryption Standard (AES). Embora o AES seja muito seguro, funciona mais rapidamente em dispositivos que suportam aceleração de hardware: instruções especiais da CPU, como as Advanced Encryption Standard New Instructions (AES-NI) da Intel, que aceleram as suas operações. Muitos dispositivos mais antigos, móveis ou de baixo consumo não têm este suporte de hardware, o que torna o AES mais lento e mais exigente em termos de bateria quando implementado apenas em software.

O ChaCha20 foi concebido para evitar este problema. Utiliza apenas operações simples que correm rapidamente em praticamente qualquer processador. Este design leve torna-o especialmente adequado para smartphones, sistemas embebidos e outros ambientes com restrições. Hoje, o ChaCha20 é recomendado em protocolos modernos como o Transport Layer Security (TLS) 1.3 como uma opção fiável juntamente com o AES.

Como funciona o ChaCha20

Digamos que pretende encriptar esta mensagem com o ChaCha20: “ExpressVPN protects my online privacy and helps keep my data safe.” Eis como isto é feito, passo a passo.

1. Transforme a mensagem em bytes.

Os computadores trabalham com bytes, que são unidades de 8 bits capazes de armazenar um número de 0 a 255. Texto como a nossa frase é armazenado ao mapear cada carácter (“E,” “x,” espaço, “.”, etc.) para 1 byte. A nossa frase tem 66 bytes de comprimento, pelo que será necessário um pouco mais do que um pedaço (bloco) de 64 bytes para a encriptar.

2. Em seguida, você precisa de uma chave secreta.

O ChaCha20 é uma cifra simétrica, o que significa que o mesmo segredo é usado para criptografar e descriptografar. Esse segredo é uma chave de 256 bits (32 bytes). Você pode pensar nela como uma senha longa e aleatória que apenas o remetente e o destinatário conhecem. Por que 256 bits? É grande o suficiente para que adivinhá-la por tentativa e erro seja efetivamente impossível.

3. Você também precisa de um nonce (número usado uma vez).

Um nonce é um número público e único escolhido para cada mensagem que você criptografa com uma determinada chave.

Na versão da Internet Engineering Task Force (IETF) do ChaCha20, o nonce tem 96 bits (12 bytes). Ele não precisa ser secreto, mas nunca deve se repetir com a mesma chave. Reutilizar um par chave–nonce revelaria a sua mensagem.

4. O ChaCha20 gera um fluxo de chave.

O ChaCha20 pertence à família das “cifras de fluxo”. Em vez de embaralhar diretamente a sua mensagem, ele primeiro produz um fluxo de bytes pseudoaleatórios chamado fluxo de chave. Em seguida, você combina esse fluxo de chave com os bytes da sua mensagem usando uma operação simples chamada OU exclusivo (XOR) .

Como o ChaCha20 gera o fluxo de chave?

Construir um estado interno

O ChaCha20 mantém uma pequena área de trabalho chamada estado, organizada como uma grade 4×4 de números. Cada número na grade é uma palavra, que aqui significa um inteiro sem sinal de 32 bits (4 bytes) como, por exemplo, 00000000 00000000 00000111 01001001.

As 16 palavras da grade são preenchidas com:

  • 4 constantes fixas (elas apenas identificam o algoritmo),
  • 8 palavras da chave de 256 bits (já que 8 × 4 bytes = 32 bytes),
  • 1 contador de bloco (explicado a seguir),
  • 3 palavras do nonce (3 × 4 bytes = 12 bytes).

ChaCha internal state

O contador de bloco

O fluxo de chave é produzido em blocos de 64 bytes de cada vez.

Para tornar cada bloco de 64 bytes diferente, o ChaCha20 usa um contador de 32 bits dentro do estado que começa em 0 no primeiro bloco, 1 no bloco seguinte, e assim por diante.

Misturar o estado (o núcleo ARX)

O ChaCha20 mistura repetidamente as 16 palavras da grade usando apenas três operações: adição (módulo 2³²), rotação (rotação bit a bit de palavras de 32 bits) e XOR (que compara dois bits e produz 1 se forem diferentes e 0 se forem iguais).

Essa mistura, baseada em operações de Adição, Rotação e XOR (ARX), é feita em rodadas (o ChaCha20 faz 20 rodadas). O ponto principal é que essas operações simples e rápidas embaralham completamente o estado de uma forma difícil de reverter sem a chave.

Produzir 64 bytes de fluxo de chave

Após a mistura, o ChaCha20 adiciona o estado original ao estado misturado (palavra por palavra) e então produz o resultado como 64 bytes de keystream. Esse é um bloco de keystream.

5. Gere quantos blocos de keystream forem necessários

Sua mensagem pode ter qualquer comprimento. O ChaCha20 simplesmente usa counter = 0 para gerar os primeiros 64 bytes de keystream, counter = 1 para os próximos 64 bytes, counter = 2 para os próximos 64 bytes, e assim por diante. Como o counter muda, cada bloco de keystream é único (mesmo com a mesma chave e o mesmo nonce).

6. Alinhe o keystream com sua mensagem

Nossa mensagem de exemplo tem 67 bytes, então o bloco 0 cobre os bytes 0–63 da mensagem (64 bytes), e o bloco 1 cobre os bytes 64–66 da mensagem (os últimos 3 bytes). Usamos apenas os primeiros 3 bytes do segundo bloco de keystream e ignoramos o resto.

7. Combine a mensagem com o keystream usando XOR

XOR é uma operação por byte com uma propriedade interessante: fazer o mesmo XOR duas vezes te leva de volta ao ponto de partida:

Encriptação (por byte): plaintext XOR keystream = ciphertext

Desencriptação (por byte, o mesmo keystream): ciphertext XOR keystream = plaintext

Comparando o ChaCha20 com outras cifras

Embora o ChaCha20 seja amplamente usado hoje, ele não é o único algoritmo de criptografia em uso. Outras cifras, como AES e Rivest–Shamir–Adleman (RSA), também são comuns, mas funcionam de formas diferentes e são adequadas para tarefas diferentes. Compará-las ajuda a mostrar onde o ChaCha20 se encaixa e por que certos protocolos o escolhem em vez das alternativas.

ChaCha20 vs. AES

ChaCha20 e AES são ambos algoritmos de criptografia de chave simétrica, o que significa que a mesma chave é usada tanto para criptografia quanto para descriptografia. Para entender melhor várias técnicas criptográficas, incluindo as diferenças entre criptografia e hashing, você pode conferir esta explicação de hashing vs. criptografia.

A principal diferença entre ChaCha20 e AES está na forma como processam os dados. O AES é uma cifra de bloco, criptografando dados em blocos de tamanho fixo, enquanto o ChaCha20 é uma cifra de fluxo, gerando um fluxo contínuo de chaves que é combinado com os dados.

O AES frequentemente se beneficia da aceleração de hardware em processadores modernos, o que o torna extremamente rápido nesses ambientes. O ChaCha20, por outro lado, foi projetado para ter um desempenho consistentemente bom mesmo sem suporte de hardware especializado, tornando-o uma excelente escolha para dispositivos móveis e sistemas de baixo consumo. É por isso que ExpressVPN usa tanto AES-256 quanto ChaCha20 no seu protocolo Lightway, alternando automaticamente para aquele mais adequado ao seu dispositivo (você também pode escolher um ou outro manualmente).

Outra diferença prática está na implementação. O AES pode ser mais complexo de programar de forma segura, pois pode ser vulnerável a ataques de temporização se não for implementado com cuidado. O ChaCha20 usa operações ARX simples que naturalmente são executadas em tempo constante, ajudando a reduzir esse risco.

Ambas as cifras são consideradas seguras quando implementadas corretamente, e protocolos modernos como o TLS 1.3 incluem suporte para cada uma. A escolha entre elas depende do hardware do dispositivo e dos requisitos de desempenho, e não de questões de segurança.

Recurso ChaCha20 AES
Tipo de cifra Cifra de fluxo Cifra de bloco
Aceleração de hardware Rápido em todos os dispositivos Melhor com AES‑NI (instruções de hardware dedicadas)
Facilidade de implementação Operações mais simples e de tempo constante Mais complexo, exige programação cuidadosa
Velocidade sem AES‑NI (instruções de hardware dedicadas) Muito rápido Mais lento

ChaCha20 vs. RSA

O ChaCha20 e o RSA não são concorrentes diretos: desempenham funções diferentes na comunicação segura.

O RSA é um algoritmo de criptografia assimétrica, o que significa que usa um par de chaves: uma pública e uma privada. Geralmente é usado no início de uma conexão segura para trocar chaves de criptografia ou verificar identidades. No TLS, o algoritmo de chave simétrica costuma ser o AES, com a troca de chaves protegida pelo RSA.

Como o RSA envolve matemática mais complexa e opera com tamanhos de chave maiores, é mais lento e menos eficiente para a criptografia contínua de dados.

O ChaCha20, por outro lado, é uma cifra de fluxo simétrica. Usa uma única chave compartilhada tanto para criptografia quanto para descriptografia, o que o torna mais rápido e mais adequado para a transferência contínua de dados.

Na prática, muitos protocolos seguros combinam as duas abordagens: RSA (ou outro algoritmo assimétrico) para o handshake inicial e ChaCha20 ou outra cifra simétrica para o restante da sessão.

Vantagens do ChaCha20

O ChaCha20 é popular não apenas porque é seguro, mas também porque funciona bem em situações reais. É rápido em todos os tipos de dispositivos, inclusive telemóveis e aparelhos com menos potência. O seu design é simples, o que ajuda a evitar erros comuns que podem enfraquecer a encriptação.

Velocidade e desempenho em dispositivos móveis e de baixo consumo

O ChaCha20 foi concebido para funcionar de forma eficiente em todos os tipos de hardware, não apenas em processadores de alto desempenho. Em dispositivos sem aceleração de hardware AES, como muitos smartphones, tablets ou dispositivos IoT, pode ser visivelmente mais rápido.

Simplicidade e resistência a ataques de temporização

O ChaCha20 é construído em torno de operações ARX simples. Estas são executadas em tempo constante, o que significa que a velocidade de execução não muda com base nos dados processados: todas as operações levam exatamente o mesmo tempo.

Este design facilita uma implementação segura e ajuda a proteger contra ataques de temporização, que tentam extrair informações medindo quanto tempo as etapas de encriptação levam.

Quais são as limitações conhecidas do ChaCha20?

O ChaCha20 tem sido estudado há anos, e nenhuma quebra no mundo real da versão completa de 20 rondas foi publicada. No geral, é a alternativa ao AES mais minuciosamente testada que existe hoje. No entanto, tem alguns limites claros que os programadores devem ter em mente. Usá-lo fora destes limites pode enfraquecer a sua proteção.

  • A reutilização de nonce é um risco grave: Usar o mesmo nonce com a mesma chave quebra imediatamente a confidencialidade. Cada par nonce–chave deve ser único.
  • Sem autenticação integrada: O ChaCha20 apenas encripta dados. Para verificar que os dados não foram alterados, deve ser utilizado com o Poly1305.
  • Limite de dados encriptados por chave/nonce: O ChaCha20 consegue processar até 2³² blocos de 64 bytes (cerca de 256 GB) com a mesma chave e nonce. Ultrapassar este limite resultaria na reutilização do keystream e comprometeria completamente a segurança da encriptação.

ChaCha20-Poly1305 explicado

O ChaCha20‑Poly1305 é uma combinação de dois componentes criptográficos que trabalham em conjunto para proteger dados:

  • O ChaCha20 encripta informação com uma chave secreta partilhada, transformando texto legível em algo que parece dados aleatórios para quem não tem a chave. No entanto, não deteta adulterações.
  • O Poly1305 produz um código de autenticação de mensagem (MAC) que permite ao recetor confirmar que os dados não foram alterados e que vieram da fonte correta.

Juntos, formam o que se conhece como Encriptação Autenticada com Dados Adicionais (AEAD). Isto significa que o processo de encriptação não só oculta o conteúdo da mensagem, como também verifica a sua integridade.

O Poly1305 não é a única opção, mas é a escolha mais comum quando o ChaCha20 é utilizado em protocolos modernos. Isto deve-se ao facto de o ChaCha20‑Poly1305 ter sido padronizado pelo IETF (RFC 8439) e ser amplamente suportado em TLS, SSH, WireGuard e outros protocolos, pelo que é o de facto padrão.

ChaCha20 em 2025: Onde é utilizado em sistemas modernos

O ChaCha20 tornou-se uma escolha padrão em muitas aplicações focadas em segurança. Na segurança da internet, é usado em conexões TLS, frequentemente juntamente com o Poly1305, para proteger o tráfego HTTPS, especialmente em dispositivos que não têm suporte de hardware para AES. Navegadores principais como o Chrome e o Firefox, e servidores web como o nginx e o Apache, suportam este conjunto de cifras.

ChaCha20 used in modern systems

Também é amplamente usado em redes privadas virtuais (VPNs). O Protocolo VPN WireGuard, por exemplo, define o ChaCha20‑Poly1305 como padrão para proteger os dados, mantendo alto desempenho em dispositivos móveis e embarcados. O suporte também está integrado aos principais sistemas operacionais, incluindo Linux, Android, iOS e Windows.

Resumo

O ChaCha20 é uma cifra de fluxo moderna e otimizada para software, criada por Daniel J. Bernstein como uma alternativa rápida e segura ao AES, especialmente em dispositivos móveis e de baixo consumo sem aceleração por hardware. Ele criptografa os dados usando uma chave de 256 bits, um nonce único de 96 bits e um contador de blocos para gerar um fluxo de chaves pseudoaleatório, que é combinado com o texto em claro por meio de XOR. Seu projeto ARX (Addition‑Rotation‑XOR) é simples, eficiente e naturalmente resistente a ataques de temporização. O ChaCha20 é simétrico (a mesma chave para criptografia e descriptografia) e difere das cifras de bloco como o AES e dos algoritmos assimétricos como o RSA, que normalmente são usados apenas para troca de chaves ou autenticação. Embora seja considerado altamente seguro e amplamente implantado em TLS, VPNs e grandes plataformas, o ChaCha20 deve ser usado com unicidade rigorosa do nonce e um limite de dados por par chave/nonce, e não oferece autenticação integrada — por isso geralmente é combinado com o Poly1305 na construção AEAD padronizada ChaCha20‑Poly1305 para fornecer confidencialidade e integridade.

FAQ: Perguntas comuns sobre o ChaCha20

O Google usa ChaCha20?

Sim. O Google adotou o ChaCha20 com Poly1305 em 2014 como parte de seus protocolos Transport Layer Security (TLS) / Secure Sockets Layer (SSL). O objetivo era melhorar o desempenho e a segurança de dispositivos móveis e servidores que não possuem aceleração por hardware do Advanced Encryption Standard (AES), tornando as conexões seguras mais rápidas e eficientes nesses ambientes.

O ChaCha20 é resistente à computação quântica?

Sim. As cifras simétricas, como o ChaCha20, são geralmente consideradas seguras contra computação quântica, desde que usem chaves suficientemente longas (por exemplo, 256 bits).

O ChaCha20 pode ser usado para criptografia de arquivos?

Sim. O ChaCha20 pode ser usado em ferramentas de criptografia de arquivos para proteger dados sensíveis armazenados em dispositivos. Sua velocidade e eficiência o tornam adequado tanto para arquivos grandes quanto para dispositivos com poder de processamento limitado.

O ChaCha20 pode ser quebrado?

Não há ataques publicados no mundo real que quebrem a cifra ChaCha20 completa de 20 rodadas. Especialistas em segurança continuam a estudá-la e, quando usada corretamente dentro de seus limites, é considerada segura para as necessidades modernas de criptografia.