Contexte
Un tampon à usage unique est une forme de cryptage qui s'est avérée impossible à casser s'il est utilisé correctement.
Le chiffrement est effectué en prenant un texte en clair (composé uniquement de lettres AZ) et en générant une chaîne aléatoire sur la même longueur (également uniquement des lettres). Cette chaîne sert de clé. Chaque caractère du texte en clair est ensuite associé au caractère correspondant dans la clé. Le texte chiffré est calculé comme suit: Pour chaque paire, les deux caractères sont convertis en nombres (A = 0, B = 1, ... Z = 25). Les deux nombres sont ajoutés modulo 26. Ce nombre est reconverti en caractère.
Le déchiffrement est exactement le contraire. Les caractères du texte chiffré et de la clé sont appariés et convertis en nombres. La clé est ensuite soustraite du module de texte chiffré 26, et le résultat est reconverti en un caractère AZ.
Le défi
Votre défi est d'écrire le programme le plus court possible qui peut à la fois crypter et décrypter un pad à usage unique.
Sur la première ligne d'entrée (vers STDIN), il y aura soit le mot "ENCRYPT" soit le mot "DECRYPT".
Si le mot est crypté, la ligne suivante sera le texte en clair. Votre programme doit produire deux lignes (vers STDOUT), la première étant la clé et la seconde le texte chiffré.
Si le mot est déchiffré, votre programme recevra deux lignes d'entrée supplémentaires. La première ligne sera la clé et la deuxième ligne sera le texte chiffré. Votre programme doit sortir une ligne, qui sera le texte en clair qui a été déchiffré.
Le texte en clair, le texte chiffré et la clé doivent toujours être constitués de lettres majuscules AZ. Ils seront toujours une seule ligne et ne contiendront aucun espace.
La clé doit toujours être aléatoire. Aucune grande partie de celui-ci ne doit se répéter entre les exécutions et aucun motif ne doit être trouvé dans le texte.
Deux exemples simples:
ENCRYPT
HAPPYBIRTHDAY
>ABKJAQLRJESMG
>HBZYYRTICLVME
DECRYPT
ABKJAQLRJESMG
HBZYYRTICLVME
>HAPPYBIRTHDAY
Le >
représente les lignes qui sont sorties, vous n'avez donc pas besoin d'imprimer ce symbole comme sortie.
/dev/random
, haveged
), chiffrer en xorant les ords avec les octets et déchiffrer en les xorant avec la clé. gist.github.com/5078264 la clé ou l'aléatoire peut être lu depuis stdin, le message ou le cryptogramme peut être un argument de nom de fichier.
/dev/hwrng
, au lieu d'utiliser un pseudo aléatoire (ce qui le rend techniquement cassé))