Ostrzejszy czterokwadratowy szyfr

17

tło

Sto trzynaście lat temu amatorski kryptograf Félix Delastelle opublikował swoją pracę na czterokwadratowym szyfrze , cyfrowym szyfrze zastępczym, który przyjmuje dwie kombinacje 25-literowego alfabetu jako klucze i koduje wiadomości składające się z tych liter.

Podobnie jak większość szyfrów na papierze długopisowym, czterokwadratowy szyfr nie ma dziś żadnej wartości kryptograficznej, ale w momencie wynalezienia miał znaczącą przewagę nad monograficznymi odpowiednikami.

Sto trzynaście lat później Alice Delastelle postanawia poprawić czterokwadratowy szyfr, zwiększając rozmiar alfabetu i liczbę kluczy. [wymagany cytat]

Konfiguracja klucza

Alfabet zawiera następujące znaki (zaczynające się od spacji):

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

Biorąc pod uwagę hasło, konstruujemy permutację tego alfabetu w następujący sposób:

  1. Zachowaj tylko pierwsze wystąpienie każdej postaci.

  2. Dodaj nieużywane znaki z alfabetu, w ich naturalnej kolejności.

Po przekształceniu czterech fraz hasła w cztery klawisze, dzielimy każdy klawisz na kwadrat o boku długości 7 i układamy cztery wynikowe kwadraty, tak aby tworzyły jeden duży kwadrat.

Na przykład, jeśli frazami hasła były

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

klucze zostaną zbudowane i ułożone w następujący sposób:

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

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

Szyfrowanie

Biorąc pod uwagę wiadomość tekstową, taką jak

ALICE LOVES BOB.

dodajemy 0 lub 1 spację, aby wyrównać jego długość i dzielimy na pary znaków:

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

Dla każdej pary znaków lokalizujemy pierwszą postać na pierwszym kwadracie (kolejność czytania), a drugą na czwartym.

Następnie wybieramy znaki w pozostałych kwadratach, tak aby cztery wybrane znaki tworzyły prostokąt, którego boki są równoległe do boków kwadratów.

Na koniec zamieniamy parę znaków na wybrane znaki drugiego i trzeciego kwadratu.

Dla naszego przykładowego ciągu daje to

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

w wyniku czego powstaje następujący tekst zaszyfrowany:

PPA@E YTZEEH=T<-

Zadanie

Napisz program lub funkcję, która akceptuje cztery frazy i tekst jawny, używa powyższego wariantu czterokwadratowego szyfru do jego zaszyfrowania i zwraca wynikowy tekst zaszyfrowany.

Detale:

  • Pięć ciągów wejściowych będzie się składać wyłącznie ze znaków wspomnianego alfabetu.

  • Pięć ciągów wejściowych można odczytać w dowolnej kolejności, jako taki, pojedynczy ciąg rozdzielony znakami nowej linii lub jako tablica pięciu ciągów.

  • Możesz założyć, że żaden z łańcuchów nie jest pusty.

  • Dane wyjściowe muszą być pojedynczym ciągiem.

    Jeśli zdecydujesz się wydrukować wyjście do STDOUT, możesz wydrukować tylko znaki tekstu zaszyfrowanego i (opcjonalnie) końcowy znak nowej linii.

  • Obowiązują standardowe zasady .

Przypadki testowe

We wszystkich przypadkach testowych pierwsze cztery ciągi odpowiadają kwadratowym klawiszom w kolejności odczytu, a ostatnie ciągi wejściowe w postaci zwykłego tekstu.

Wejście

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

Wynik

PPA@E YTZEEH=T<-

Wejście

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

Wynik

LALLR)#TROKE !

Wejście

,'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!

Wynik

#>TE,VK+,ZQ(&<[email protected]@DM%NAC&>

Wejście

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

Wynik

GOOD LUCK, HAVE FUN.
Dennis
źródło

Odpowiedzi:

4

CJam, 52 50 49 47 46 44 bajtów

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

Kolejność wprowadzania to wiersze 5, 2, 3, 1, 4. Wypróbuj online .

(-1 bajtów dzięki @ MartinBüttner, -2 bajtów dzięki @Dennis)

Wyjaśnienie

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

W przypadku indeksów chcemy zamienić najmniej znaczące cyfry, podstawa 7. Na przykład w pierwszym przykładzie ALsą odpowiednio indeksy 4i 7klucze 1 i 4. W bazie 7 jest to [0 4]i [1 0]. Zamiana najmniej cyfr znaczących daje [0 0]a [1 4], czyli 0a 11, a ten odpowiada P, a Pw klawisze 2 i 3 odpowiednio.

Jednak zamiast konwertowania bazy kod wykonuje następujące czynności:

[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
źródło
6

Pyth, 74 71 bajtów

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

Prawdopodobnie można go dużo zoptymalizować. Używam dużo zipowania.

Pobiera dane wejściowe w następującej kolejności:

ALICE LOVES BOB.
PROGRAMMING PUZZLES & CODE GOLF
DON'T TELL EVE!!!
POPULARITY CONTESTS & CODE BOWLING
CORRECT HORSE BATTERY STAPLE
orlp
źródło
Czy mogę ukraść pomysł na zamówienie wejściowe?
Maltysen
@Maltysen Sure.
orlp
4

Pyth - 88 86 83 78 76 75 72 bajtów

8 bajtów zapisanych dzięki @orlp .

Za długo, jestem z tego całkiem niezadowolony, ale po prostu publikuję to, szukając lepszego sposobu obsługi kwadratów.

Jm+oxdN{d-+d-CMr33 91`MTd.zsms@VtPJ,+*7hKs.DR7xV,hJeJdeK+*7@[email protected]

Wypróbuj online tutaj .

Maltysen
źródło
Można wymienić c+e.z*%le.z2d2z C.tce.z2d. Nie pytaj :)
orlp