Четырехугольный шифр

17

Фон

Сто тринадцать лет назад криптограф-любитель Феликс Деластель опубликовал свою работу о шифре с четырьмя квадратами, шифре с заменой диграфа, который принимает две перестановки 25-буквенного алфавита в качестве ключей и кодирует сообщения, состоящие из этих букв.

Как и большинство шифров с ручкой и бумагой, шифр с четырьмя квадратами сегодня не имеет никакой криптографической ценности, но на момент его изобретения он имел значительное преимущество перед монографическими аналогами.

Спустя сто тринадцать лет Алиса Деластель решает улучшить шифр с четырьмя квадратами, увеличив размер алфавита и количество ключей. [нужна цитата]

Настройка ключа

Алфавит содержит следующие символы (начиная с пробела):

 !"#$%&'()*+,-./:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ

Для данной парольной фразы мы строим перестановку этого алфавита следующим образом:

  1. Сохраняйте только первое вхождение каждого персонажа.

  2. Добавляйте неиспользуемые символы из алфавита в их естественном порядке.

После превращения четырехпроходных фраз в четыре клавиши мы разбиваем каждую клавишу на квадрат с длиной стороны 7 и располагаем четыре получающихся квадрата так, чтобы они образовывали один большой квадрат.

Например, если парольные фразы были

PROGRAMMING PUZZLES & CODE GOLF
POPULARITY CONTESTS & CODE BOWLING
CORRECT HORSE BATTERY STAPLE
DON'T TELL EVE!!!

ключи будут построены и расположены следующим образом:

PROGAMI  POULARI
N UZLES  TY CNES
&CDF!"#  &DBWG!"
$%'()*+  #$%'()*
,-./:;<  +,-./:;
=>?@BHJ  <=>?@FH
KQTVWXY  JKMQVXZ

CORET H  DON'T E
SBAYPL!  LV!"#$%
"#$%&'(  &()*+,-
)*+,-./  ./:;<=>
:;<=>?@  ?@ABCFG
DFGIJKM  HIJKMPQ
NQUVWXZ  RSUWXYZ

шифрование

Учитывая текстовое сообщение, такое как

ALICE LOVES BOB.

мы добавляем 0 или 1 пробел, чтобы сделать его равным, и разбиваем его на пары символов:

["AL" "IC" "E " "LO" "VE" "S " "BO" "B."]

Для каждой пары символов мы находим первый символ в первом квадрате (порядок чтения) и второй в четвертом.

Затем мы выбираем символы в оставшихся квадратах так, чтобы четыре выбранных символа образовывали прямоугольник, стороны которого параллельны сторонам квадратов.

Наконец, мы заменяем пару символов выбранными символами второго и третьего квадрата.

Для нашего примера строки это дает

["PP" "A@" "E " "YT" "ZE" "EH" "=T" "<-"]

в результате получается следующий зашифрованный текст:

PPA@E YTZEEH=T<-

задача

Напишите программу или функцию, которая принимает четыре проходных фразы и открытый текст, использует вышеупомянутый вариант шифра с четырьмя квадратами для его шифрования и возвращает полученный зашифрованный текст.

Детали:

  • Пять входных строк будут состоять исключительно из символов упомянутого алфавита.

  • Пять входных строк могут быть прочитаны в любом порядке, как таковые, в виде одной строки, разделенной символом новой строки, или в виде массива из пяти строк.

  • Вы можете предположить, что ни одна из строк не пуста.

  • Вывод должен быть одной строкой.

    Если вы решите распечатать вывод в STDOUT, вы можете напечатать только символы зашифрованного текста и (необязательно) завершающий перевод строки.

  • Применяются стандартные правила .

Контрольные примеры

Во всех тестовых случаях первые четыре строки соответствуют квадратам клавиш в порядке чтения, а последняя строка ввода - в виде открытого текста.

вход

PROGRAMMING PUZZLES & CODE GOLF
POPULARITY CONTESTS & CODE BOWLING
CORRECT HORSE BATTERY STAPLE
DON'T TELL EVE!!!
ALICE LOVES BOB.

Выход

PPA@E YTZEEH=T<-

вход

 !"#$%&'()*+,-./:;<=>
 !"#$%&'()*+,-./:;<=>?@ABCDE
 !"#$%&'()*+,-./:;<=>?@ABCDEFGHIJKL
 !"#$%&'()*+,-./:;<=>?@ABCDEFGHIJKLMNOPQRS
HELLO, WORLD! 

Выход

LALLR)#TROKE !

вход

,'K AB-Q=?@("W$>XM).C#<I:G!OLP*+;SZJTU%NED/&VFHRY
:,-D$C<SU=IYHFVA;! JG/M&L+WT%#.Q@(N*R")EZOBKX?'>P
L()JX,BND?Z<>P*FU%=O@&KIC+A!Y:;$SWHR.EMG'/T"QV #-
<->CI")AP Q:+U;O/F(KH&ER!MW?X'VJLZ#.$,BSGN@TD%*Y=
SPIN THE PPCG WHEEL OF BLAME!

Выход

#>TE,VK+,ZQ(&<F@RA.NL@DM%NAC&>

вход

& %(,-#)$@?/=>'*"<:;!.+
=/$- ?;',@#!(&<")%.:>+*
&%-/<?.;$'#:=!( ,>"+*)@
=,<-*?#.'@/;>%!+:(& ")$
HNRA#JX$H %JAV+"GTS,

Выход

GOOD LUCK, HAVE FUN.
Деннис
источник

Ответы:

4

CJam, 52 50 49 47 46 44 байта

l2/qN/'[,32>A,s-f|2/f{~@S+2<.#_7f%_W%.m.m.=}

Порядок ввода - строки 5, 2, 3, 1, 4. Попробуйте онлайн .

(-1 байт благодаря @ MartinBüttner, -2 байт благодаря @Dennis)

объяснение

l2/           Read the message and split into chunks of 2
qN/           Read rest of input and split by newlines (pass phrases)
'[,32>        Generate " !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ"
A,s-          Remove digits 0123456789
f|            Setwise OR with each pass phrase to remove duplicates, giving keys
2/            Split keys into two pairs
f{ ... }      For each message chunk...
  ~             Unwrap key pairs
  @S+2<         Add a space to the message chunk then cap to length 2
  .#            Find the two chars in keys 1, 4
  _7f%          Copy indices and perform modulo 7 on both
  _W%           Copy and reverse
  .m.m          Vectorised subtraction twice
  .=            Apply both indices to keys 2, 3

Для индексов мы хотим поменять местами младшие значащие цифры, основание 7. Например, для первого примера ALэто индексы 4и 7ключи 1 и 4 соответственно. В базе 7 это [0 4]и есть [1 0]. Замена младших значащих цифр дает [0 0]и [1 4], т. Е. 0И 11, и это соответствует Pи Pв ключах 2 и 3 соответственно.

Однако вместо базового преобразования код выполняет следующее:

[4 7]     A: Initial indices
[4 0]     B: Indices mod 7
[0 4]     C: Reverse of B

[4 -4]    B-C
[0 11]    A-(B-C)
Sp3000
источник
6

Pyth, 74 71 байт

L+%eb7*7/hb7Jcms+oxdN{d--CMr33 91`MTd.z2ssm@VeJ,ydy_dCmxLhdedC,hJ.tcz2d

Вероятно, может быть много оптимизировано. Я много использую молний.

Принимает ввод в следующем порядке:

ALICE LOVES BOB.
PROGRAMMING PUZZLES & CODE GOLF
DON'T TELL EVE!!!
POPULARITY CONTESTS & CODE BOWLING
CORRECT HORSE BATTERY STAPLE
orlp
источник
Могу ли я украсть вашу идею заказа ввода?
Maltysen
@ Малтисен Конечно.
orlp
4

Pyth - 88 86 83 78 76 75 72 байта

8 байтов сохранено благодаря @orlp .

Ваае слишком долго, я довольно недоволен этим, но просто публикую его, пока ищу лучший способ обработки квадратов.

Jm+oxdN{d-+d-CMr33 91`MTd.zsms@VtPJ,+*7hKs.DR7xV,hJeJdeK+*7@K2@K1C.tcz2d

Попробуйте это онлайн здесь .

Maltysen
источник
Вы можете заменить c+e.z*%le.z2d2на C.tce.z2d. Не спрашивайте :)
orlp