Implemente um programa de criptografia CipherSaber , conforme descrito abaixo. Diretrizes:
- A menor entrada, em bytes, vence.
- No entanto, ao se afastar das normas do code-golf , você pode publicar entradas interessantes, mesmo que não sejam sérias.
- Uma entrada normalmente seria um programa que pega o texto sem formatação da entrada padrão e grava o texto cifrado na saída padrão, com a chave especificada (pelo usuário) da maneira que você preferir.
- No entanto, se você deseja implementar isso como um procedimento, tudo bem também.
- O IV deve vir de um gerador de números pseudoaleatórios criptograficamente seguro. Se o seu idioma não suportar isso, escolha um idioma diferente. ;-)
- Por favor, não use bibliotecas, chamadas de sistema ou instruções específicas para criptografia (exceto o PRNG, conforme estipulado acima). Obviamente, operações bit a bit de baixo nível genéricas estão bem.
O CipherSaber é uma variante do RC4 / Arcfour, então vou começar descrevendo o último, depois as alterações que o CipherSaber faz nele.
0. RC4 / Arcfour
Arcfour é totalmente especificado em outro lugar , mas para ser completo, eu descreverei aqui. (No caso de discrepâncias entre o rascunho da Internet e essa descrição, o primeiro é normativo.)
Configuração de teclas
Configure duas matrizes S
e S2
, ambas com comprimento 256, onde k_1
é o primeiro byte da chave e k_n
o último.
S = [0, ..., 255]
S2 = [k_1, ..., k_n, k_1, ...]
( S2
é preenchido com os bytes da chave, repetidamente, até que todos os 256 bytes sejam preenchidos.)
Em seguida, inicialize j
para 0 e embaralhe 256 vezes:
j = 0
for i in (0 .. 255)
j = (j + S[i] + S2[i]) mod 256
swap S[i], S[j]
end
Isso completa a configuração da chave. A S2
matriz não é mais usada aqui e pode ser limpa.
Geração de fluxo cifrado
Inicialize i
e j
para 0, gere o fluxo de chaves da seguinte maneira:
i = 0
j = 0
while true
i = (i + 1) mod 256
j = (j + S[i]) mod 256
swap S[i], S[j]
k = (S[i] + S[j]) mod 256
yield S[k]
end
Criptografar / descriptografar dados
- Para criptografar, XOR a saída do fluxo de chaves com o texto sem formatação
- Para descriptografar, XOR a saída do fluxo de chaves com o texto cifrado
1. CipherSaber
O CipherSaber (que é o que estamos implementando nesta pergunta) é uma variação do RC4 / Arcfour de duas maneiras:
10 bytes IV / nonce
Ao criptografar uma mensagem, 10 bytes aleatórios devem ser obtidos, como via /dev/urandom
, e gravados nos primeiros 10 bytes da saída criptografada. Ao descriptografar uma mensagem, os 10 primeiros bytes da entrada são os IV usados para criptografá-la.
O estágio de configuração da chave RC4 / Arcfour é executado com passphrase || IV
a chave, onde passphrase
está a senha especificada pelo usuário, IV
é como descrito acima e ||
é concatenação. Então, uma senha de "Olá, mundo!" e um IV de "supercalif" (por mais improvável que seja :-P) resultaria em uma chave de "Hello, world! supercalif".
Várias iterações da configuração da chave
Para ajudar a evitar a vulnerabilidade que quebrou completamente a criptografia WEP, o ciclo de embaralhamento do estágio de configuração de chave do RC4 é executado um número de vezes especificado pelo usuário. O valor de j
deve ser retido entre as iterações.
2. Vetores de teste
Aqui estão alguns vetores de teste que você pode usar para testar seus programas. Além disso, ossifrage melindroso criou uma ferramenta de criptografia e descriptografia CipherSaber que você pode usar para validar seus resultados.
Você só precisa implementar o programa de criptografia. Você não precisa fornecer o programa de descriptografia, mas a saída do programa de criptografia deve retornar corretamente à entrada original quando processada com um programa de descriptografia implementado corretamente, usando a chave correta.
urandom
(que pode ser uma entrada separada, se quiser) se você se interessar em "vencer". :-)