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.
fonte
urandom
(que pode ser uma entrada separada, se quiser) se você se interessar em "vencer". :-)Python 2 -
373350326317 bytesPyth possivelmente virá mais tarde. Define uma função,
c(p,d,r,m)
que recebe listas de bytes para senha e dados, e int para repetições e modo que criptografa quando 1 e descriptografa quando 0. Isso ocorre porque a única diferença neles é lidar com o IV. Retorna a lista de bytes.Aqui estão algumas funções de código de teste / auxiliar:
fonte
else:v,d=d[:10],d[10:]
peça.Ruby - 263 caracteres
Esta é minha resposta do Ruby à pergunta original sobre stackoverflow em 2010! É um codificador e decodificador, tudo em um programa
Os parâmetros são:
e ou d (para codificar ou descodificar)
chave de
número de vezes
fonte
C, 312 bytes
Aceita uma contagem de iteração de chave e mistura de chaves na linha de comando e, em seguida, criptografa tudo do stdin para o stdout. Isso usa a função de biblioteca BSD / Darwin
arc4random()
, que é um PRNG baseado no RC4. Ele se propaga automaticamente, para que os resultados sejam sempre diferentes.Versão mais ordenada:
Exemplo:
fonte
Python - 266 caracteres
Esta é a minha resposta do Python à pergunta original sobre stackoverflow em 2010! É um codificador e decodificador, tudo em um programa
Os parâmetros são:
e ou d (para codificar ou descodificar)
chave de
número de vezes
Esta versão tenta mesclar os 2 loops do rc4 em um (salva 11 bytes até agora ...)
fonte