fundo
Um bloco de uso único é uma forma de criptografia que se provou impossível de decifrar se usada corretamente.
A criptografia é realizada usando um texto sem formatação (composto apenas de letras AZ) e gerando uma sequência aleatória no mesmo comprimento (também apenas letras). Essa string atua como a chave. Cada caractere no texto simples é então emparelhado com o caractere correspondente na chave. O texto cifrado é calculado da seguinte forma: Para cada par, os dois caracteres são convertidos em números (A = 0, B = 1, ... Z = 25). Os dois números são adicionados ao módulo 26. Esse número é convertido novamente em um caractere.
Descriptografia é exatamente o oposto. Os caracteres no texto cifrado e na chave são emparelhados e convertidos em números. A chave é então subtraída do módulo de texto cifrado 26 e o resultado é convertido novamente em um caractere AZ.
O desafio
Seu desafio é escrever o programa mais curto possível que possa criptografar e descriptografar um bloco único.
Na primeira linha de entrada (para STDIN), haverá a palavra "ENCRYPT" ou a palavra "DECRYPT".
Se a palavra estiver criptografada, a próxima linha será o texto sem formatação. Seu programa deve gerar duas linhas (para STDOUT), sendo a primeira a chave e a segunda o texto cifrado.
Se a palavra for descriptografada, seu programa receberá mais duas linhas de entrada. A primeira linha será a chave e a segunda linha será o texto cifrado. O programa deve gerar uma linha, que será o texto sem formatação que foi descriptografado.
O texto sem formatação, o texto cifrado e a chave devem sempre consistir em letras maiúsculas AZ. Eles sempre serão uma única linha e não conterão espaços em branco.
A chave deve sempre ser aleatória. Nenhuma parte grande dela deve se repetir entre as execuções e não deve haver padrões que possam ser encontrados no texto.
Dois exemplos simples:
ENCRYPT
HAPPYBIRTHDAY
>ABKJAQLRJESMG
>HBZYYRTICLVME
DECRYPT
ABKJAQLRJESMG
HBZYYRTICLVME
>HAPPYBIRTHDAY
O >
representa quais linhas são enviadas, assim você não precisa imprimir esse símbolo como saída.
/dev/random
, haveged
), criptografe xorando as ordens com os bytes e descriptografando-as com a chave. gist.github.com/5078264 a chave ou a aleatoriedade pode ser lida em stdin, a mensagem ou o cyphertext pode ser um argumento de nome de arquivo.
/dev/hwrng
, em vez de usar pseudo aleatório (que tecnicamente o torna quebrado).