Una cifra di quattro quadrati più accanita


17

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:

  1. Mantieni solo la prima occorrenza di ciascun personaggio.

  2. 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 .

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.

Risposte:


4

CJam, 52 50 49 47 46 44 byte

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

L'ordine di input è linee 5, 2, 3, 1, 4. Provalo online .

(-1 byte grazie a @ MartinBüttner, -2 byte grazie a @Dennis)

Spiegazione

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

Per gli indici, vogliamo scambiare le cifre meno significative, base 7. Ad esempio, per il primo esempio ALsono gli indici 4e 7nei tasti 1 e 4 rispettivamente. Nella base 7, questo è [0 4]e [1 0]. Scambiare le cifre meno significative dà [0 0]e [1 4], cioè 0e 11, e questo corrisponde rispettivamente a Pe Pnei tasti 2 e 3.

Tuttavia, anziché la conversione di base, il codice procede come segue:

[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 byte

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

Probabilmente potrebbe essere ottimizzato molto. Uso un sacco di zip.

Accetta input nel seguente ordine:

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

Posso rubare la tua idea dell'ordine di input?
Maltysen,

@Maltysen Certo.
orlp

4

Pyth - 88 86 83 78 76 75 72 byte

8 byte salvati grazie a @orlp .

Waaay troppo a lungo, sono piuttosto scontento di questo, ma sto solo pubblicandolo mentre cerco un modo migliore per gestire i quadrati.

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

Provalo online qui .


È possibile sostituire c+e.z*%le.z2d2con C.tce.z2d. Non chiedere :)
orlp
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.