Antecedentes
Un pad de una sola vez es una forma de cifrado que se ha demostrado que es imposible de descifrar si se usa correctamente.
El cifrado se realiza tomando un texto sin formato (compuesto solo por letras AZ) y generando una cadena aleatoria en la misma longitud (también solo letras). Esta cadena actúa como la clave. Cada carácter en el texto sin formato se empareja con el carácter correspondiente en la clave. El texto cifrado se calcula de la siguiente manera: para cada par, ambos caracteres se convierten en números (A = 0, B = 1, ... Z = 25). Los dos números se suman módulo 26. Este número se convierte de nuevo en un carácter.
El descifrado es exactamente lo contrario. Los caracteres en el texto cifrado y la clave se emparejan y se convierten en números. La clave se resta del módulo 26 de texto cifrado y el resultado se convierte de nuevo en un carácter AZ.
El reto
Su desafío es escribir el programa más corto posible que pueda cifrar y descifrar una libreta de una sola vez.
En la primera línea de entrada (a STDIN), habrá la palabra "ENCRYPT" o la palabra "DECRYPT".
Si la palabra está encriptada, la siguiente línea será el texto sin formato. Su programa debe generar dos líneas (a STDOUT), la primera es la clave y la segunda el texto cifrado.
Si la palabra se descifra, su programa obtendrá dos líneas más de entrada. La primera línea será la clave, y la segunda línea será el texto cifrado. Su programa debe generar una línea, que será el texto sin formato que se ha descifrado.
El texto sin formato, el texto cifrado y la clave siempre deben consistir en letras mayúsculas AZ. Siempre serán una sola línea y no contendrán espacios en blanco.
La clave siempre debe ser aleatoria. No se deben repetir partes grandes entre las ejecuciones, y no debe haber patrones que se puedan encontrar en el texto.
Dos ejemplos simples:
ENCRYPT
HAPPYBIRTHDAY
>ABKJAQLRJESMG
>HBZYYRTICLVME
DECRYPT
ABKJAQLRJESMG
HBZYYRTICLVME
>HAPPYBIRTHDAY
El >
representa lo que las líneas son de salida, por lo que no tiene que imprimir ese símbolo como salida.
/dev/random
, haveged
), cifrar xorreando los ords con los bytes y descifrar xormentándolos con la clave. gist.github.com/5078264 la clave o la aleatoriedad se pueden leer desde stdin, el mensaje o el texto cifrado pueden ser un argumento de nombre de archivo.
/dev/hwrng
, en lugar de usar pseudoaleatorio (lo que técnicamente hace que se rompa))