Фон
Одноразовый блокнот - это форма шифрования, которую при правильном использовании оказалось невозможно взломать.
Шифрование выполняется путем взятия открытого текста (состоящего только из букв AZ) и генерирования случайной строки одинаковой длины (также только буквы). Эта строка действует как ключ. Каждый символ в текстовом виде затем соединяется с соответствующим символом в ключе. Зашифрованный текст вычисляется следующим образом: для каждой пары оба символа преобразуются в числа (A = 0, B = 1, ... Z = 25). Два числа добавляются по модулю 26. Это число превращается обратно в символ.
Расшифровка с точностью до наоборот. Символы в зашифрованном тексте и ключе соединены в пары и преобразованы в числа. Затем ключ вычитается из зашифрованного текста по модулю 26, и результат преобразуется обратно в символ AZ.
Соревнование
Ваша задача - написать самую короткую из возможных программ, которая может как зашифровать, так и расшифровать одноразовый блокнот.
В первой строке ввода (в STDIN) будет либо слово «ENCRYPT», либо слово «DECRYPT».
Если слово зашифровано, то следующая строка будет открытым текстом. Ваша программа должна вывести две строки (в STDOUT), первая - это ключ, а вторая - зашифрованный текст.
Если слово расшифровано, ваша программа получит еще две строки ввода. Первая строка будет ключом, а вторая строка будет зашифрованным текстом. Ваша программа должна вывести одну строку, которая будет открытым текстом, который был расшифрован.
Открытый текст, зашифрованный текст и ключ всегда должны состоять из заглавных букв AZ. Они всегда будут одной строкой и не будут содержать пробелов.
Ключ всегда должен быть случайным. Никакие его большие части не должны повторяться между прогонами, и не должно быть никаких шаблонов, которые можно найти в тексте.
Два простых примера:
ENCRYPT
HAPPYBIRTHDAY
>ABKJAQLRJESMG
>HBZYYRTICLVME
DECRYPT
ABKJAQLRJESMG
HBZYYRTICLVME
>HAPPYBIRTHDAY
>
Представляет , какие линии вывода, так что вы не должны печатать этот символ в качестве вывода.
/dev/random
, haveged
), зашифруйте, записав ордера в байтах, и расшифруйте, записав их в ключе. gist.github.com/5078264 ключ или случайность могут быть прочитаны из стандартного ввода, сообщение или зашифрованный текст может быть аргумент имени файла.
/dev/hwrng
, вместо использования псевдослучайного (что технически делает его