Ataque de texto conhecido
Quem sabe um pedaço da mensagem original consegue tirar dele a chave.
Muitas vezes quem ataca não conhece a chave, mas conhece (ou adivinha) um pedaço do texto original: o começo padrão de uma carta, o cabeçalho de um arquivo, uma assinatura que sempre se repete. Isso se chama texto conhecido (known plaintext), e em cifras simples ele entrega a chave.
A ideia é sempre a mesma: a cifra combina o texto com a chave. Se você tem o texto e o cifrado, desfaz a combinação e sobra a chave.
- César e Vigenère: cifrado menos original dá a letra da chave. Se
BvirouN, a chave andou 12 casas, e a letra da chave ém. - XOR: cifrado XOR original dá a chave, porque
(m XOR k) XOR m = k.
Exemplo com Vigenère. Toda mensagem de uma estância começa com BOMDIA, e uma delas foi cifrada assim:
cifrado: N O F H U A
original: B O M D I A
chave: m a t e m a (N - B = 12 = m, O - O = 0 = a, ...)
A chave é mate: depois do e, ela recomeça em m. Com seis letras conhecidas, deu para ver a chave inteira e até o tamanho dela. Se a chave fosse maior que o pedaço conhecido, você teria só o começo dela e precisaria completar o resto de outro jeito.
No CyberChef dá para fazer essa conta de uma vez: Vigenère Decode no cifrado, usando o texto conhecido como chave. Nas posições que você conhecia, a saída mostra as letras da chave. Para XOR, em Python: bytes(c ^ m for c, m in zip(cifrado, conhecido)) devolve os bytes da chave.
Cifras modernas, como o AES, são feitas para resistir a esse ataque, porque quase toda comunicação tem partes previsíveis (cabeçalhos de protocolo, formatos de arquivo). Na Segunda Guerra, quem decifrava a Enigma partia justamente de palavras que sabia que estariam nas mensagens, como a previsão do tempo.