Напишите программу, которая принимает две строки ввода и использует первую в качестве ключевой фразы для шифрования второй в соответствии с техникой шифрования Playfair.
Википедия описывает шифрование Playfair в некоторых деталях , но чтобы избежать двусмысленности, вот краткое резюме:
1. Сгенерируйте таблицу ключей:
Замените все вхождения J
ключевой фразы на I
, затем удалите все не алфавитные и повторные символы. Вставьте в таблицу шифрования 5 × 5, заполнив оставшиеся ячейки оставшейся частью алфавита (за исключением того J
, что нам не нравится J
).
Пример:
S T A C K
O V E R F
Stack Overflow --> STACKOVERFLW --> L W B D G
H I M N P
Q U X Y Z
2. Подготовьте сообщение для шифрования
Замените каждый символом « J
на» I
, удалите все неалфавитные символы и X
разбейте их на пары, используя, чтобы разбить все пары, содержащие одну и ту же букву, дважды. Если вы получите нечетное количество букв, добавьте X
в конце. (Примечание: Цифры должны быть изложены в полном объеме - ONE
, TWO
, THREE
и т.д. , - но вы можете предположить , что это уже сделано для вас.)
Пример:
In:
The cat crept into the crypt, crapped, and crept out again.
Out:
TH EC AT CR EP TI NT OT HE CR YP TC RA PX PE DA ND CR EP TO UT AG AI NX
3. Шифрование
Зашифруйте каждую пару букв по очереди. Если они находятся в разных строках и столбцах таблицы ключей, замените каждую букву из той же строки в столбце, где находится другая буква (например, VM
⇒ EI
, LZ
⇒ GQ
). Если они находятся в одной строке (или столбце), выберите два символа сразу справа (или ниже), при необходимости оборачивая их (например, OE
⇒ VR
, ZG
⇒ KP
).
Пример:
In:
TH EC AT CR EP TI NT OT HE CR YP TC RA PX PE DA ND CR EP TO UT AG AI NX
Out:
SI RA CA RD FM VU IC VS MO RD ZN AK EC MZ MF BC YN RD FM SV TV KB TM MY
Строка, создаваемая этим процессом, является зашифрованным сообщением, которое ваша программа должна вывести.
Правила:
- Входной текст и ключ могут быть получены из
stdin
аргументов командной строки или других подобных источников. Жестко запрограммированный ввод не допускается. - Ваша программа должна принимать как прописные, так и строчные буквы для парольной фразы и сообщения.
- Зашифрованный вывод может быть в верхнем или нижнем регистре.
- Ваша программа должна принимать ключевые фразы длиной не менее 64 символов и тексты сообщений размером не менее 16 КБ.
- Вы не обязаны обрабатывать ввод не-ASCII.
- Вы можете игнорировать возможность появления пары букв
XX
во время шифрования. - Нет необходимости добавлять пробелы в вывод программы.
- Ваш ответ должен включать пример сообщения, ключевой фразы и зашифрованного вывода, созданного вашей программой.
- Это вызов кода для гольфа, поэтому победит ответ с самым коротким кодом (в байтах).
ПРИМЕЧАНИЕ. Помните, что вам нужно разбивать последовательные буквы, только если они появляются в одной паре . Так, например,
MASSACHUSETTS
должно быть зашифровано какMA SX SA CH US ET TS
- двойнойS
должен быть разделен, но двойнойT
не делает.
J
». Вы питаете подобные чувства по поводу APL?