Фон
Одноразовий блокнот є формою шифрування , що було доведено , неможливо зламати , якщо використовується належним чином.
Шифрування виконується шляхом взяття простого тексту (складається лише з літер 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 ключ або випадковість може бути прочитаний з stdin, повідомлення або cyphertext може бути аргументом імені файлу.
/dev/hwrng
, замість того, щоб використовувати псевдо випадкові (що технічно робить його ламаним.)