Pular para o conteúdo
Todos os conceitos

XOR com chave repetida

Uma chave de vários bytes repetida ao longo da mensagem, como a Vigenère, só que com bytes.

O XOR de um byte usa o mesmo número em todos os bytes e cai com 256 tentativas. A versão "melhorada" usa uma chave de vários bytes, repetida do começo ao fim: o 1º byte da mensagem faz XOR com o 1º byte da chave, o 2º com o 2º, e quando a chave acaba ela recomeça. É a Vigenère, só que com bytes em vez de letras.

Com uma chave de 8 bytes há 256⁸ (cerca de 1,8 × 10¹⁹) chaves possíveis, e testar todas deixa de ser viável. Mas o ponto fraco da Vigenère continua aqui: a chave se repete. E basta conhecer tantos bytes do original quanto o tamanho da chave para tirá-la inteira (veja o conceito Ataque de texto conhecido).

Onde arranjar bytes conhecidos? Nos arquivos. Cada tipo de arquivo começa com uma assinatura fixa (veja o conceito Assinatura de arquivo). Um ZIP começa sempre com 50 4B 03 04. Se um ZIP foi cifrado com a chave sol:

cifrado:      23 24 6f 77
assinatura:   50 4b 03 04     (todo ZIP começa assim)
XOR:          73 6f 6c 73  =  s  o  l  s

Quatro bytes conhecidos deram sols: a chave tem 3 letras, sol, e recomeçou no quarto byte. Quando o resultado mostra um trecho que se repete, você achou o tamanho da chave.

cifrado XOR assinatura dá a chave 23 24 6f 77 o resto do arquivo 50 4b 03 04 todo ZIP começa assim 73s 6fo 6cl 73s 6fo 6cl 73s 6fo 6cl a chave: sol, 3 bytes recomeça e se repete até o fim
A assinatura conhecida do ZIP, com XOR no começo do cifrado, revela a chave sol; como a chave se repete, esses 3 bytes servem para o arquivo inteiro.

No CyberChef, a operação XOR aceita a chave em formato Hex (para bytes, como uma assinatura) ou UTF8 (para uma senha em texto) e já repete a chave sozinha. Take bytes recorta só o começo do arquivo, e Render Image mostra o resultado quando ele é uma imagem. Em Python: bytes(b ^ chave[i % len(chave)] for i, b in enumerate(dados)).

Aparece nestes desafios