sfondo
Centotredici anni fa, il crittografo amatoriale Félix Delastelle pubblicò il suo lavoro sulla cifra di quattro quadrati , una cifra di sostituzione digrafica che accetta due permutazioni di un alfabeto di 25 lettere come chiavi e codifica i messaggi costituiti da quelle lettere.
Come la maggior parte delle cifre in carta e penna, la cifra a quattro quadrati non ha alcun valore crittografico oggi, ma al momento della sua invenzione, aveva un vantaggio significativo rispetto alle sue controparti monografiche.
Centotredici anni dopo, Alice Delastelle decide di migliorare la cifra di quattro quadrati aumentando la dimensione dell'alfabeto e il numero di chiavi. [citazione necessaria]
Impostazione chiave
L'alfabeto contiene i seguenti caratteri (che iniziano con lo spazio):
!"#$%&'()*+,-./:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ
Data una passphrase, costruiamo una permutazione di questo alfabeto come segue:
Mantieni solo la prima occorrenza di ciascun personaggio.
Aggiungi i caratteri inutilizzati dell'alfabeto, nel loro ordine naturale.
Dopo aver trasformato quattro passphrase in quattro chiavi, abbiamo diviso ciascuna chiave in un quadrato di lunghezza laterale 7 e disponiamo i quattro quadrati risultanti in modo che formino un unico grande quadrato.
Ad esempio, se le passphrase fossero
PROGRAMMING PUZZLES & CODE GOLF
POPULARITY CONTESTS & CODE BOWLING
CORRECT HORSE BATTERY STAPLE
DON'T TELL EVE!!!
le chiavi sarebbero costruite e disposte in questo modo:
PROGAMI POULARI
N UZLES TY CNES
&CDF!"# &DBWG!"
$%'()*+ #$%'()*
,-./:;< +,-./:;
=>?@BHJ <=>?@FH
KQTVWXY JKMQVXZ
CORET H DON'T E
SBAYPL! LV!"#$%
"#$%&'( &()*+,-
)*+,-./ ./:;<=>
:;<=>?@ ?@ABCFG
DFGIJKM HIJKMPQ
NQUVWXZ RSUWXYZ
crittografia
Dato un messaggio in chiaro come
ALICE LOVES BOB.
aggiungiamo 0 o 1 spazi per rendere uniforme la sua lunghezza e dividerlo in coppie di caratteri:
["AL" "IC" "E " "LO" "VE" "S " "BO" "B."]
Per ogni coppia di caratteri, individuiamo il primo carattere nel primo quadrato (ordine di lettura) e il secondo nel quarto.
Quindi, scegliamo i caratteri nei quadrati rimanenti in modo tale che i quattro caratteri selezionati formino un rettangolo i cui lati siano paralleli ai lati dei quadrati.
Infine, sostituiamo la coppia di caratteri con i caratteri selezionati del secondo e terzo quadrato.
Per la nostra stringa di esempio, questo produce
["PP" "A@" "E " "YT" "ZE" "EH" "=T" "<-"]
risultante nel seguente testo cifrato:
PPA@E YTZEEH=T<-
Compito
Scrivi un programma o una funzione che accetta quattro passphrase e un testo in chiaro, utilizza la variante sopra della cifra di quattro quadrati per crittografarla e restituisce il testo cifrato risultante.
Dettagli:
Le cinque stringhe di input saranno costituite esclusivamente da caratteri dell'alfabeto menzionato.
Le cinque stringhe di input possono essere lette in qualsiasi ordine, come tale, una singola stringa delimitata da newline o come un array di cinque stringhe.
Si può presumere che nessuna stringa sia vuota.
L'output deve essere una singola stringa.
Se si sceglie di stampare l'output su STDOUT, è possibile stampare solo i caratteri del testo cifrato e (facoltativamente) una nuova riga finale.
Si applicano le regole standard del code-golf .
Casi test
In tutti i casi di test, le prime quattro stringhe corrispondono ai quadrati dei tasti in ordine di lettura e all'ultima stringa di input al testo in chiaro.
Ingresso
PROGRAMMING PUZZLES & CODE GOLF
POPULARITY CONTESTS & CODE BOWLING
CORRECT HORSE BATTERY STAPLE
DON'T TELL EVE!!!
ALICE LOVES BOB.
Produzione
PPA@E YTZEEH=T<-
Ingresso
!"#$%&'()*+,-./:;<=>
!"#$%&'()*+,-./:;<=>?@ABCDE
!"#$%&'()*+,-./:;<=>?@ABCDEFGHIJKL
!"#$%&'()*+,-./:;<=>?@ABCDEFGHIJKLMNOPQRS
HELLO, WORLD!
Produzione
LALLR)#TROKE !
Ingresso
,'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!
Produzione
#>TE,VK+,ZQ(&<F@RA.NL@DM%NAC&>
Ingresso
& %(,-#)$@?/=>'*"<:;!.+
=/$- ?;',@#!(&<")%.:>+*
&%-/<?.;$'#:=!( ,>"+*)@
=,<-*?#.'@/;>%!+:(& ")$
HNRA#JX$H %JAV+"GTS,
Produzione
GOOD LUCK, HAVE FUN.