Modos de cifra e protocolos

ECB, CBC, CTR, AEAD, repetição e acordo de chaves com Diffie-Hellman.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

AES transforma blocos de 16 bytes. A lista de preços da loja ocupa mais do que isso: é preciso proteger vários blocos com a mesma chave. Uma cifra de bloco define a transformação de um bloco; não define sozinha como proteger uma mensagem inteira. Para proteger uma mensagem maior, dividimos a mensagem em blocos e precisamos de uma regra, o modo de operação, que define a relação entre blocos e os valores adicionais usados na cifragem. O XOR compara bits e dá 1 quando são diferentes e 0 quando são iguais: x⊕x=0x\oplus x=0 e x⊕0=xx\oplus0=x; por exemplo, 1010 XOR 1100 = 0110.

ECB, CBC e CTR

ModoRelação entre blocosValor adicionalLimite importante
ECBCada bloco cifra independentementeNenhumBlocos iguais com a mesma chave dão cifras iguais
CBCCada bloco combina-se com a cifra anteriorIV inicial imprevisívelExige blocos completos; sozinho não autentica
CTRXOR da mensagem com blocos de uma sequência cifrada de contadoresContadores que não se repetem sob a mesma chaveReutilização revela relações entre mensagens; sozinho não autentica

Em ECB, cada bloco cifra de forma independente. Uma mensagem de blocos A A B A dá um padrão X X Y X. Um observador não precisa de descobrir A para reconhecer repetições, por isso “usar AES” sem dizer o modo não responde a este problema.

Em CBC, Ci=EK(Pi⊕Ci−1)C_i=E_K(P_i\oplus C_{i-1}), com C0=IVC_0=IV. Aqui PiP_i é um bloco de texto em claro, CiC_i um bloco cifrado e KK a chave. Com dois blocos: primeiro calcula-se X1=P1⊕IVX_1=P_1\oplus IV e C1=EK(X1)C_1=E_K(X_1); depois X2=P2⊕C1X_2=P_2\oplus C_1 e C2=EK(X2)C_2=E_K(X_2). Para decifrar, inverte-se cada passo: P1=DK(C1)⊕IVP_1=D_K(C_1)\oplus IV e P2=DK(C2)⊕C1P_2=D_K(C_2)\oplus C_1, como mostra o diagrama seguinte com estes dois blocos.

Em CTR, Ci=Pi⊕EK(contadori)C_i=P_i\oplus E_K(\text{contador}_i). O IV de CBC e os contadores de CTR têm requisitos distintos. Em CTR, evita repetir qualquer bloco de contador, inclusive entre mensagens: inícios diferentes ainda podem gerar sequências sobrepostas.

CBC convencional recebe blocos completos. Com preenchimento PKCS#7 e blocos de 16 bytes, uma mensagem de 14 bytes recebe dois bytes 02 02. Uma de 16 bytes recebe um bloco completo de dezasseis bytes de valor 16, para distinguir preenchimento de dados. Ao remover, o recetor lê o último byte kk, exige 1≤k≤161\le k\le16 e pelo menos kk bytes disponíveis, e verifica que os últimos kk bytes valem todos kk. Se alguma condição falha, rejeita em vez de remover. O preenchimento não autentica a mensagem. CTR pode usar apenas os bytes necessários do último bloco e não precisa deste preenchimento.

Alterar bits sem conhecer a chave

Em CTR sem autenticação, alterar um bit de CiC_i altera exatamente o bit correspondente de PiP_i. O contador e a sequência cifrada mantêm-se. Se o atacante aplica uma máscara Δ\Delta, o recetor obtém:

Ci′=Ci⊕Δ.C'_i=C_i\oplus\Delta.

Ao retirar a mesma sequência SiS_i, fica:

Pi′=Pi⊕Δ.P'_i=P_i\oplus\Delta.

Com Pi=01000001P_i=01000001 e máscara 00000011, os dois bits finais mudam e o resultado é 01000010. Não há propagação automática aos restantes blocos. Confidencialidade não impede esta alteração; uma etiqueta de autenticação válida é uma condição adicional. AES real tem blocos de 128 bits, ou 16 bytes; um bloco menor num exercício representa apenas um modelo para seguir o XOR.

Reutilizar uma sequência de XOR

Se duas mensagens usam a mesma sequência SS, temos C1=P1⊕SC_1=P_1\oplus S e C2=P2⊕SC_2=P_2\oplus S. Ao combinar as cifras:

C1⊕C2=P1⊕P2,C_1\oplus C_2=P_1\oplus P_2,

porque S⊕S=0S\oplus S=0. Se uma mensagem é conhecida, a outra fica recuperável. Este problema aparece no one-time pad reutilizado e no CTR com contadores repetidos.

Para ver um byte, toma P1=01000001P_1=01000001 (A), P2=01000010P_2=01000010 (B) e S=00110000S=00110000:

EstadoBits
C1=P1⊕SC_1=P_1\oplus S01110001
C2=P2⊕SC_2=P_2\oplus S01110010
C1⊕C2C_1\oplus C_200000011
(C1⊕C2)⊕P1(C_1\oplus C_2)\oplus P_101000010, o B original

O atacante conhece a primeira mensagem e as duas cifras. A última linha recupera a segunda mensagem sem conhecer previamente SS.

Os bytes deste exemplo só mostram a identidade algébrica; não implementam uma cifra segura. O one-time pad só tem confidencialidade perfeita com chave uniformemente aleatória, tão longa como a mensagem, secreta e usada uma única vez.

Cifragem autenticada

Um MAC autentica dados, mas não os esconde. Cifrar sem autenticar pode permitir alterações controladas ou ataques através das respostas a dados inválidos. AEAD protege a confidencialidade do conteúdo e a integridade do conteúdo e dos dados associados, como um número de sequência. Estes dados associados não ficam cifrados.

Usa construções estudadas, como AES-GCM ou ChaCha20-Poly1305, com os requisitos de nonce da construção. Para GCM, reutilizar um nonce com a mesma chave compromete a segurança. A aplicação deve rejeitar dados cuja etiqueta não verifica, antes de lhes dar significado. Usa uma construção analisada, em vez de combinar por conta própria uma cifra e um hash.

AEAD não elimina automaticamente a repetição. Uma mensagem válida antiga continua a ter uma etiqueta válida, porque a etiqueta prova que alguém com a chave protegeu aquele conteúdo e dados associados. Não prova que a mensagem é nova. A frescura precisa de mecanismo próprio, conforme o protocolo: por exemplo incluir um número de sequência nos dados associados e manter estado de receção com janela que tolera reordenação legítima, ou usar um desafio fresco por operação e rejeitar respostas fora do desafio pendente.

No esquema, o identificador 7 está autenticado com a mensagem. O atacante só copia os bytes; a segunda receção é recusada pelo estado da aplicação, não por uma falha da etiqueta.

A verificação de unicidade e o efeito têm de ficar ligados atomicamente. Caso contrário, dois pedidos concorrentes podem observar o identificador como novo antes de qualquer um o registar. Este exemplo não define um protocolo completo.

Ordem entre cifragem e MAC

Os nomes indicam que dados se autenticam e quando. Escrevemos EE para cifragem, MM para MAC e ∥\Vert para concatenação; KEK_E e KMK_M têm funções separadas.

  • Encrypt-then-MAC: calcula c=EKE(m)c=E_{K_E}(m), depois t=MKM(c)t=M_{K_M}(c), e envia (c,t)(c,t).
  • MAC-then-Encrypt: calcula t=MKM(m)t=M_{K_M}(m), depois c=EKE(m∥t)c=E_{K_E}(m\Vert t), e envia cc.
  • Encrypt-and-MAC: calcula separadamente c=EKE(m)c=E_{K_E}(m) e t=MKM(m)t=M_{K_M}(m), e envia (c,t)(c,t).

No primeiro caso, o recetor pode verificar a etiqueta antes de decifrar. No segundo, precisa de decifrar para chegar à etiqueta. Se diferenças de resposta revelarem erros de preenchimento antes da autenticação, essa ordem pode criar um oráculo: o atacante aprende algo pelas respostas a cifras alteradas. No terceiro, um MAC sobre o texto em claro pode revelar relações que a cifra pretendia esconder.

Estes esquemas distinguem composições, não provam segurança de qualquer implementação. É preciso proteger também IV/nonce e contexto conforme a construção, separar chaves e cumprir os requisitos das primitivas. Usar AEAD analisada evita inventar esse protocolo. Enviar só uma etiqueta MAC não envia a mensagem; enviar a chave MAC em claro permite ao observador criar etiquetas para mensagens alteradas.

Diffie-Hellman em números pequenos

A conta usa a aritmética modular, com números pequenos para permitir refazer as contas; não são parâmetros seguros.

Ana e Bruno publicam p=23p=23 e g=5g=5. Ana escolhe a=6a=6 e envia A=ga mod p=8A=g^a\bmod p=8. Bruno escolhe b=15b=15 e envia B=gb mod p=19B=g^b\bmod p=19. Ana calcula Ba mod p=2B^a\bmod p=2 e Bruno calcula Ab mod p=2A^b\bmod p=2.

A igualdade vem de aplicar os dois expoentes à mesma base:

Ba=(gb)a=gab=(ga)b=Ab(modp).B^a=(g^b)^a=g^{ab}=(g^a)^b=A^b\pmod p.

Ana não precisa de conhecer bb: usa o valor público BB e o seu aa. Bruno faz a operação correspondente com AA e bb.

Num protocolo real, os parâmetros e a validação dos valores recebidos têm requisitos de segurança, e uma função de derivação transforma o segredo em chaves adequadas. A igualdade anterior explica a coincidência dos resultados no grupo usado, não a autenticação dos participantes.

Sem autenticação, um intermediário pode substituir A e B pelos seus valores e estabelecer um segredo com cada lado. O acordo não prova com quem falamos. No diagrama seguinte, o intermediário combina um segredo com Ana e outro segredo com Bruno; Ana e Bruno veem trocas aparentemente normais, mas partilham segredos diferentes com o intermediário.

Certificados e assinaturas sobre o contexto da troca, ou uma chave previamente partilhada, podem autenticar o acordo.

Chaves efémeras corretamente usadas e apagadas podem dar sigilo futuro: comprometer mais tarde a chave de autenticação de longo prazo não permite recuperar sessões antigas gravadas. Isso não protege uma sessão cujo próprio segredo efémero foi comprometido.

O vídeo acompanha a troca de valores públicos. Compara-a com os dois diagramas: obter um segredo comum e verificar a identidade do interlocutor continuam a ser problemas diferentes.

Abrir no YouTube

Exercícios

O segredo de Diffie-Hellman

Num acordo de brinquedo com p=23,g=5p=23,g=5, Ana tem a=4a=4 e recebe B=19B=19. Qual segredo calcula Ana? Não uses estes parâmetros numa comunicação real.

Pista

Usa o valor público recebido com o expoente privado da Ana.

Solução

192=361≡16(mod23)19^2=361\equiv16\pmod{23}. Logo 194≡162=256≡3(mod23)19^4\equiv16^2=256\equiv3\pmod{23}. Ana calcula 3.

Erros frequentes

O valor B é público. Não o confundas com o expoente privado b.

Voltar à explicação
Uma transferência repetida

Uma aplicação usa AEAD corretamente, mas aceita a mesma mensagem válida de transferência várias vezes. A etiqueta verifica em todas. Explica a falha e propõe uma regra adicional.

Pista

O atacante mudou algum byte da mensagem?

Solução

A aplicação não verifica frescura ou unicidade da operação. Deve autenticar também o contexto relevante e recusar operações já usadas, por exemplo com identificador e estado transacional. AEAD sozinha não define essa política.

Confere a tua resposta:

  • Distingue autenticidade/integridade de frescura.
  • Explica que uma cifra e etiqueta antigas podem continuar válidas.
  • Propõe número de sequência/identificador de operação e rejeição de repetição com estado adequado.

Erros frequentes

Não alegues que a etiqueta tem de falhar: a mensagem repetida não foi alterada.

Voltar à explicação
Duas cifras, uma sequência

Temos C1=P1⊕SC_1=P_1\oplus S e C2=P2⊕SC_2=P_2\oplus S. O atacante conhece P1P_1, C1C_1 e C2C_2. Deriva uma expressão para recuperar P2P_2.

Pista

XOR de um valor consigo próprio dá zero.

Mais uma pista

Combina a primeira cifra com a primeira mensagem conhecida.

Solução

C1⊕P1=SC_1\oplus P_1=S. Assim, C2⊕C1⊕P1=P2⊕S⊕S=P2C_2\oplus C_1\oplus P_1=P_2\oplus S\oplus S=P_2. A defesa depende de não repetir a sequência sob a mesma chave.

Confere a tua resposta:

  • Usa C1 XOR P1 = S.
  • Obtém P2 = C2 XOR C1 XOR P1.
  • Explica que a repetição da sequência elimina o segredo na relação entre cifras.

Erros frequentes

Ter mensagens diferentes não evita o problema. O nonce pode ser público, mas tem de cumprir o requisito da construção.

Voltar à explicação
Inícios diferentes, blocos repetidos

Num CTR de brinquedo, a primeira mensagem usa os contadores 10, 11, 12 e 13; a segunda usa 12, 13 e 14, sob a mesma chave. A equipa afirma que não há reutilização porque os contadores iniciais são diferentes. Avalia a afirmação.

Pista

Compara todos os blocos de contador, não só os primeiros.

Solução

A afirmação é falsa. Os valores 12 e 13 geram a mesma sequência em duas posições de mensagens distintas, ou seja o XOR das cifras dessas posições revela o XOR dos textos em claro; conhecer um deles permite recuperar o outro. A regra precisa de impedir sobreposição de todos os contadores sob a chave, incluindo o retorno a valores antigos por overflow.

Confere a tua resposta:

  • Identifica os contadores 12 e 13 como repetidos.
  • Relaciona os blocos repetidos com a mesma sequência XOR sob a mesma chave.
  • Exige intervalos de contadores sem sobreposição e sem retorno ao início por overflow.

Erros frequentes

Inícios únicos não bastam quando as sequências podem sobrepor-se. Tornar os contadores secretos não corrige a reutilização.

Voltar à explicação
Decifrar dois blocos CBC

Com C0=IVC_0=IV, C1C_1 e C2C_2 recebidos, escreve as expressões de P1P_1 e P2P_2 em CBC e explica a dependência entre blocos. Uma mensagem de 16 bytes com blocos de 16 bytes recebe quantos bytes de preenchimento PKCS#7 e com que valor?

Pista

Inverte cada passo da cifragem por ordem.

Mais uma pista

O preenchimento tem de distinguir dados de enchimento mesmo quando a mensagem já é múltipla do bloco.

Solução

P1=DK(C1)⊕IVP_1=D_K(C_1)\oplus IV e P2=DK(C2)⊕C1P_2=D_K(C_2)\oplus C_1. A decifragem de P2P_2 precisa de C1C_1, porque a cifragem combinou P2P_2 com C1C_1 antes da cifra de bloco. Com 16 bytes em blocos de 16, acrescenta-se um bloco completo de dezasseis bytes de valor 16.

Confere a tua resposta:

  • Escreve P1=D(C1) XOR IV e P2=D(C2) XOR C1.
  • Explica que P2 precisa da cifra anterior.
  • Calcula o preenchimento PKCS#7 para 16 bytes em bloco de 16.

Erros frequentes

Não confundas o IV, que só entra no primeiro bloco, com a cifra anterior de cada bloco seguinte.

Voltar à explicação
A cifra mudou, a etiqueta ficou

Num modelo de um byte em CTR, o texto em claro é 00110000. O atacante aplica XOR com 00000101 à cifra, mantendo o contador. Sem autenticação, que texto recebe o destinatário? O protocolo passa depois a enviar a cifra c=EKE(m)c=E_{K_E}(m) e uma etiqueta MAC sobre o contador, o contexto e a cifra, nessa ordem. O contador e o contexto não precisam de ser secretos. O atacante muda a cifra e conserva a etiqueta antiga. Assume que não consegue forjar uma etiqueta válida. Identifica a composição e a decisão do recetor. Como mudaria a ordem se a etiqueta estivesse dentro da mensagem cifrada?

Solução

Retirar a sequência CTR deixa a mesma máscara aplicada ao texto: 00110000 XOR 00000101 = 00110101. Mudam dois bits, sem necessidade de conhecer a chave. O novo protocolo é Encrypt-then-MAC: a etiqueta autentica a cifra e verifica-se antes de decifrar. A cifra alterada com etiqueta antiga falha, nas hipóteses dadas, e o recetor rejeita-a. Em MAC-then-Encrypt, calcula-se o MAC do texto em claro, concatena-se a etiqueta e cifra-se tudo; o recetor precisa de decifrar antes de obter essa etiqueta. A comparação das ordens não dispensa uma construção analisada.

Confere a tua resposta:

  • Obtive 00110101 ao aplicar a máscara ao texto em claro.
  • Identifiquei Encrypt-then-MAC e verificação antes da decifragem.
  • Distingui MAC-then-Encrypt pela etiqueta dentro do conteúdo cifrado.
Voltar à explicação

À tua maneira

Aparência

Modo de cor
Tema
Cor de destaque

Leitura

Fonte de leitura

Álgebra, lógica e uma ideia de cada vez.

Código

Fonte do código

Navegação

Cursor de leitura, sem edição. h, j, k, l movem; / pesquisa nesta página. v seleciona caracteres; V seleciona linhas; y copia. Tab permite destacar ou comentar. Espaço ou Enter abre blocos recolhíveis. Nos cartões, h, j, k, l mudam o foco.

CSS personalizado

Ativa uma sugestão ou guarda o teu CSS. Só muda este navegador.

Usa --page, --text e --accent para acompanhar o tema.

Seletores e recuperação

.site-header, .prose, .course-card, [data-reading-history], [data-playground] e .page-actions.

Abre a aparência com a tecla vírgula ou no rodapé. Se o CSS esconder os controlos, abre esta página sem CSS personalizado.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Copiar fórmula

A cópia automática não está disponível. Copia o LaTeX abaixo.

Pesquisar nesta página

Enter procura · n / N repetem · Esc cancela. Ctrl / Cmd K pesquisa todo o site.

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.