sfondo
Un pad una tantum è una forma di crittografia che è stata dimostrata impossibile da decifrare se usato correttamente.
La crittografia viene eseguita prendendo un testo in chiaro (composto solo da lettere AZ) e generando una stringa casuale sulla stessa lunghezza (anche solo lettere). Questa stringa funge da chiave. Ogni carattere nel testo in chiaro viene quindi associato al carattere corrispondente nella chiave. Il testo cifrato viene calcolato come segue: per ogni coppia, entrambi i caratteri vengono convertiti in numeri (A = 0, B = 1, ... Z = 25). I due numeri vengono aggiunti al modulo 26. Questo numero viene convertito nuovamente in un carattere.
La decrittazione è esattamente l'opposto. I caratteri nel testo cifrato e nella chiave vengono accoppiati e convertiti in numeri. La chiave viene quindi sottratta dal modulo 26 del testo cifrato e il risultato viene riconvertito in un carattere AZ.
La sfida
La tua sfida è quella di scrivere il programma più breve possibile in grado di crittografare e decrittografare un pad una tantum.
Sulla prima riga di input (verso STDIN), ci sarà la parola "ENCRYPT" o la parola "DECRYPT".
Se la parola è crittografata, la riga successiva sarà il testo in chiaro. Il programma dovrebbe generare due righe (su STDOUT), la prima è la chiave e la seconda il testo cifrato.
Se la parola è decrittografata, il tuo programma otterrà altre due righe di input. La prima riga sarà la chiave e la seconda riga sarà il testo cifrato. Il programma dovrebbe generare una riga, che sarà il testo in chiaro che è stato decifrato.
Il testo in chiaro, il testo cifrato e la chiave devono sempre essere composti da lettere maiuscole AZ. Saranno sempre un'unica riga e non contengono spazi bianchi.
La chiave dovrebbe essere sempre casuale. Nessuna grande parte di essa dovrebbe ripetersi tra le esecuzioni e non dovrebbero esserci motivi che possano essere trovati nel testo.
Due semplici esempi:
ENCRYPT
HAPPYBIRTHDAY
>ABKJAQLRJESMG
>HBZYYRTICLVME
DECRYPT
ABKJAQLRJESMG
HBZYYRTICLVME
>HAPPYBIRTHDAY
La >
rappresenta che le linee sono in uscita, in modo da non dovete stampare quel simbolo come uscita.
/dev/random
, haveged
), crittografare xoring degli ords con i byte e decrittografare xoring con la chiave. gist.github.com/5078264 la chiave o la casualità possono essere lette da stdin, il messaggio o il testo cifrato possono essere argomenti di nome file.
/dev/hwrng
, invece di usare lo pseudo casuale (che tecnicamente lo rende rotto)