Eine wilde Vier-Quadrate-Chiffre

17

Hintergrund

Vor einhundertdreizehn Jahren veröffentlichte der Amateur-Kryptograf Félix Delastelle seine Arbeit über die vierquadratische Chiffre , eine digraphische Substitutionschiffre, die zwei Permutationen eines 25-Buchstaben-Alphabets als Schlüssel akzeptiert und Nachrichten kodiert, die aus diesen Buchstaben bestehen.

Wie die meisten Stift-und-Papier-Chiffren hat die vierquadratische Chiffre heute keinen kryptografischen Wert, hatte aber zum Zeitpunkt ihrer Erfindung einen signifikanten Vorteil gegenüber ihren monografischen Gegenstücken.

Einhundertdreizehn Jahre später beschließt Alice Delastelle, die vierquadratische Chiffre durch Vergrößerung des Alphabets und der Anzahl der Schlüssel zu verbessern. [Zitat benötigt]

Schlüsseleinstellung

Das Alphabet enthält die folgenden Zeichen (beginnend mit Leerzeichen):

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

Mit einer gegebenen Passphrase konstruieren wir eine Permutation dieses Alphabets wie folgt:

  1. Behalte nur das erste Vorkommen jedes Zeichens.

  2. Fügen Sie die nicht verwendeten Zeichen aus dem Alphabet in ihrer natürlichen Reihenfolge hinzu.

Nachdem wir vier Passphrasen in vier Schlüssel umgewandelt haben, teilen wir jeden Schlüssel in ein Quadrat mit der Seitenlänge 7 und ordnen die vier resultierenden Quadrate so an, dass sie ein großes Quadrat bilden.

Zum Beispiel, wenn die Passphrasen waren

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

Die Tasten würden folgendermaßen aufgebaut und angeordnet sein:

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

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

Verschlüsselung

Bei einer Klartextnachricht wie

ALICE LOVES BOB.

Wir fügen 0 oder 1 Leerzeichen hinzu, um die Länge zu vergleichmäßigen und teilen sie in Zeichenpaare auf:

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

Für jedes Zeichenpaar suchen wir das erste Zeichen im ersten Quadrat (Lesereihenfolge) und das zweite im vierten.

Dann wählen wir die Zeichen in den verbleibenden Quadraten so aus, dass die vier ausgewählten Zeichen ein Rechteck bilden, dessen Seiten parallel zu den Seiten der Quadrate sind.

Schließlich ersetzen wir das Zeichenpaar durch die ausgewählten Zeichen des zweiten und dritten Quadrats.

Für unsere Beispielzeichenfolge ergibt dies

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

Daraus ergibt sich der folgende Chiffretext:

PPA@E YTZEEH=T<-

Aufgabe

Schreiben Sie ein Programm oder eine Funktion, die vier Passphrasen und einen Klartext akzeptiert, verschlüsselt es mit der obigen Variante der vierkantigen Chiffre und gibt den resultierenden Chiffretext zurück.

Einzelheiten:

  • Die fünf Eingabezeichenfolgen bestehen ausschließlich aus Zeichen des angegebenen Alphabets.

  • Die fünf Eingabezeichenfolgen können in beliebiger Reihenfolge gelesen werden, dh als einzelne Zeichenfolge, die durch Zeilenumbrüche begrenzt ist, oder als Array mit fünf Zeichenfolgen.

  • Sie können davon ausgehen, dass keine der Zeichenfolgen leer ist.

  • Die Ausgabe muss eine einzelne Zeichenfolge sein.

    Wenn Sie die Ausgabe auf STDOUT drucken möchten, können Sie nur die Zeichen des Chiffretextes und (optional) eine nachgestellte neue Zeile drucken.

  • Es gelten die Standardregeln für .

Testfälle

In allen Testfällen entsprechen die ersten vier Zeichenfolgen den Schlüsselquadraten in Lesereihenfolge und die letzte Eingabezeichenfolge dem Klartext.

Eingang

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

Ausgabe

PPA@E YTZEEH=T<-

Eingang

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

Ausgabe

LALLR)#TROKE !

Eingang

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

Ausgabe

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

Eingang

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

Ausgabe

GOOD LUCK, HAVE FUN.
Dennis
quelle

Antworten:

4

CJam, 52 50 49 47 46 44 Bytes

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

Die Eingabereihenfolge ist Zeilen 5, 2, 3, 1, 4. Probieren Sie es online aus .

(-1 Byte dank @ MartinBüttner, -2 Byte dank @Dennis)

Erläuterung

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

Für die Indizes möchten wir die niedrigstwertigen Ziffern, Basis 7, vertauschen. Zum Beispiel sind für das erste Beispiel ALIndizes 4und 7in den Tasten 1 und 4 jeweils. In der Basis 7 ist dies [0 4]und [1 0]. Das Vertauschen der niedrigstwertigen Ziffern ergibt [0 0]und [1 4], dh 0und 11, und dies entspricht Pund Pin den Tasten 2 und 3.

Anstelle der Basiskonvertierung führt der Code jedoch Folgendes aus:

[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
quelle
6

Pyth, 74 71 Bytes

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

Könnte wohl viel optimiert werden. Ich benutze viel Reißverschluss.

Nimmt Eingaben in der folgenden Reihenfolge vor:

ALICE LOVES BOB.
PROGRAMMING PUZZLES & CODE GOLF
DON'T TELL EVE!!!
POPULARITY CONTESTS & CODE BOWLING
CORRECT HORSE BATTERY STAPLE
orlp
quelle
Kann ich Ihre Idee für eine Eingabereihenfolge stehlen?
Maltysen
@Maltysen Sicher.
Orlp
4

Pyth - 88 86 83 78 76 75 72 Bytes

8 Bytes gespart dank @orlp .

Warte zu lange, ich bin ziemlich unzufrieden damit, aber poste es einfach, während ich nach einer besseren Möglichkeit suche, mit den Quadraten umzugehen.

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

Probieren Sie es hier online aus .

Maltysen
quelle
Sie können ersetzen c+e.z*%le.z2d2mit C.tce.z2d. Fragen Sie nicht :)
Orlp