Більш жорстокий чотирикутний шифр


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)

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

Чи можу я вкрасти вашу ідею замовлення на вхід?
Мальтісен

@Maltysen Звичайно.
orlp

4

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

8 байт збережено завдяки @orlp .

Waaay занадто довго, я дуже незадоволений цим, але просто розміщую його, поки шукаю кращого способу впоратися з квадратами.

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

Спробуйте його онлайн тут .


Ви можете замінити c+e.z*%le.z2d2на C.tce.z2d. Не питайте :)
orlp
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.