La cifra VIC è una delle cifre più complicate mai realizzate per matita e carta. Utilizzato negli anni '50 dalla spia sovietica Reino Häyhänen, nome in codice "VICTOR", il suo principio principale è la sicurezza attraverso l'offuscamento; un sacco di confusione.
Il tuo compito è scrivere un programma o una funzione che prenderà un messaggio e lo codifichi usando il codice VIC. Ho anche pubblicato una sfida decodificatore di cifratura VIC qui . Se una delle seguenti istruzioni non è chiara, non esitare a chiedere informazioni nei commenti. Le istruzioni sono adattate da questo sito .
Codifica del codice VIC
Preparazione
Avrai bisogno di cinque input:
- il messaggio in chiaro
- una breve parola chiave o frase contenente le lettere più comuni nella tua lingua
- una frase chiave, come una citazione o una riga di una canzone (almeno 20 caratteri)
- una data (o un altro numero di almeno sei cifre)
- un numero di agente personale
In pratica, questi ultimi quattro dovrebbero essere concordati preventivamente dal mittente e dal destinatario, incluso se il codice agente del mittente o del destinatario viene utilizzato nella codifica.
Il mio messaggio di esempio sarà: We are discovered. Take what you can. Burn everything else. Move to Safehouse Foxtrot 3.
Codificheremo in inglese (anche se puoi usare la lingua e l'alfabeto che preferisci) e le lettere più comuni dell'alfabeto inglese A, E, I, N, O, R, S, T
. Userò la parola chiave SENATORI
.
La mia frase chiave è una citazione di Richard Feynman: "Il primo principio è che non devi ingannare te stesso e sei la persona più facile da ingannare".
Come data, userò il 31 luglio 2016 (nel formato 3172016
), che è il giorno in cui ho scritto questa descrizione.
Il numero personale che ho scelto per me stesso è 9
.
Riepilogo dei passaggi
- Derivare le chiavi intermedie per l'uso nei seguenti passaggi.
- Costruisci e applica la scacchiera a cavallo.
- Costruisci e applica la prima tabella di trasposizione.
- Costruisci e applica la seconda tabella di trasposizione (interrotta).
- Finalizza il messaggio inserendo il gruppo di indicatori del messaggio.
Submechanisms
Altre due cose da spiegare prima di entrare nella carne della questione: i processi di aggiunta e sequenziamento della catena.
L'aggiunta di catena, nota anche come generatore di Fibonacci ritardato, funziona prendendo una sequenza di cifre iniziale, aggiungendo le prime due cifre senza riportarle (aggiungendole poi insieme mod 10
) e aggiungendo il risultato alla fine. Per esempio:
79081
7 + 9 = 6
790816
9 + 0 = 9
7908169
0 + 8 = 8
79081698
8 + 1 = 9
790816989
1 + 6 = 7
7908169897
... and so on
Il sequenzialismo consiste essenzialmente nel prendere una sequenza di lettere o cifre ed etichettarle in base al loro ordine alfabetico / numerico. I duplicati sono etichettati da sinistra a destra. Per esempio:
E X A M P L E
0 # A
1 0 2 # Es
1 0 3 2 # L
1 0 4 3 2 # M
1 0 4 5 3 2 # P
1 6 0 4 5 3 2 # X
3 3 0 5 8 4 2 0 4 7 5 4 8 1
0 1 # 0s
0 1 2 # 1
0 3 1 2 # 2
4 5 0 3 1 2 # 3s
4 5 0 6 3 1 7 8 2 # 4s
4 5 0 9 6 3 1 7 10 8 2 # 5s
4 5 0 9 6 3 1 7 11 10 8 2 # 7
4 5 0 9 12 6 3 1 7 11 10 8 13 2 # 8s
Uso l'indicizzazione zero qui, ma indicizza come preferisci.
1. Tasti intermedi
Dividi le prime 20 lettere della frase chiave in due gruppi di 10 e sequenzialmente ciascuna individualmente, che chiameremo S1
e S2
.
THEFIRSTPR
S1: 8201357946
INCIPLEIST
S2: 2603751489
Scegli un identificatore di messaggio a 5 cifre casuale, M
(questo può essere uno degli input se preferisci):
M = 47921
Sottrai, senza prendere in prestito (sottrai mod 10
), le prime cinque cifre della data chiave 3172016
da M
:
M 47921
date - 31720
= 16201
La catena aggiunge il risultato fino a quando non hai dieci cifre:
1620178218
Aggiungi queste cifre a S1
, senza portare o mod 10
, per ottenere G
:
1620178218
S1 + 8201357946
G = 9821425154
Sopra S2
, scrivi la sequenza 0123456789. Individua ogni cifra di G
nella sequenza 0123456789 e sostituiscila con la cifra direttamente sotto di essa in S2
. Il risultato è T
.
0123456789
S2 2603751489
G 9821425154
T 9806705657
Utilizzare l'aggiunta catena per espandere T
a 60 cifre.
9806705657
becomes
980670565778637511245490262369939288595822106344304316978734
Queste ultime 50 cifre, in cinque file di dieci cifre ciascuna, formano il U
blocco.
T 9806705657
U 7863751124
5490262369
9392885958
2210634430
4316978734
Le ultime due cifre non uguali del U
blocco vengono aggiunte singolarmente al numero personale dell'agente per fornire le larghezze delle due trasposizioni, p
e q
.
9 + 3 = 12 (p, prima larghezza di trasposizione) 9 + 4 = 13 (q, seconda larghezza di trasposizione)
Sequentialize T
e utilizzare questa sequenza per copiare largo delle colonne del U
blocco, dall'alto verso il basso, in una nuova fila di cifre, V
.
T 9806705657
seqT 9804612537
U 7863751124
5490262369
9392885958
2210634430
4316978734
V 69911 56837 12548 26533 30206 13947 72869 49804 84323 75924
Sequenzializza le prime p
cifre per ottenere la chiave per la prima trasposizione K1
e le q
cifre seguenti per la chiave per la seconda K2
.
First 12 6 9 9 1 1 5 6 8 3 7 1 2
K1 6 10 11 0 1 5 7 9 4 8 2 3
Next 13 5 4 8 2 6 5 3 3 3 0 2 0 6
K2 8 7 12 2 10 9 4 5 6 0 3 1 11
Infine, in sequenza l'ultima riga del U
blocco da ottenere C
, le intestazioni di colonna per la scacchiera a cavallo:
U5 4316978734
C 3105968724
2. Scacchiera a cavallo
In primo luogo, darò la mia scacchiera di esempio, quindi spiegherò i principi per crearlo in quel modo:
3 1 0 5 9 6 8 7 2 4
S E N A T O R I
2 B D G J L P U W Y .
4 C F H K M Q V X Z #
La prima riga di lettere è la nostra parola chiave breve SENATORI
. La tua parola chiave può essere qualsiasi stringa senza duplicati, ma poiché definisce la riga superiore della tua scacchiera, scegli saggiamente. Sopra la parola chiave è C
, e le altre righe sono il resto dell'alfabeto nell'ordine che scegli. Nel mio caso, ho riempito la scacchiera con il resto dell'alfabeto latino, un segno di punteggiatura .
e un segno di demarcazione dei numeri #
. In sostanza, la scacchiera è un elaborato codice di sostituzione. Ad esempio, "E" verrà sostituito con 1
"W" verrà sostituito con 27
.
Una volta che abbiamo codificato il nostro messaggio in chiaro con questa scacchiera, ma prima, dobbiamo rendere meno evidente l'inizio del nostro messaggio suddividendolo in una posizione casuale e rendendolo tutto maiuscolo. Per indicare l'altro inizio originale, usiamo due arresti completi..
We are discovered. Take what you can. Burn everything else. Move to Safehouse Foxtrot 3.
diventa
HING ELSE. MOVE TO SAFEHOUSE FOXTROT#3#.. WE ARE
DISCOVERED. TAKE WHAT YOU CAN. BURN EVERYT
Codifichiamo con la scacchiera, dandoci:
407020 1293124 496481 96 354114062831 416479869443442424 271 581
2173436481812124 95451 274059 22628 435024 232880 14818229
Se la lunghezza del messaggio non è divisibile per 5, aggiungiamo alcuni caratteri null per completare il messaggio. Il nostro messaggio è lungo 109 cifre, quindi aggiungerò uno null: "4".
40702 01293 12449 64819 63541 14062 83141 64798 69443 44242 42715
81217 34364 81812 12495 45127 40592 26284 35024 23288 01481 82294
Nota: poiché il mio messaggio di esempio non contiene numeri, qui dirò che potresti designare, diciamo, come #3#
, che è codificato come 44344
qui.
3. Prima trasposizione
Crea la tabella di trasposizione scrivendo K1
(dalla sezione Chiavi intermedie) seguita dal messaggio codificato del passaggio precedente, in file della stessa lunghezza, sotto la chiave:
K1 6 10 11 0 1 5 7 9 4 8 2 3
4 0 7 0 2 0 1 2 9 3 1 2
4 4 9 6 4 8 1 9 6 3 5 4
1 1 4 0 6 2 8 3 1 4 1 6
4 7 9 8 6 9 4 4 3 4 4 2
4 2 4 2 7 1 5 8 1 2 1 7
3 4 3 6 4 8 1 8 1 2 1 2
4 9 5 4 5 1 2 7 4 0 5 9
2 2 6 2 8 4 3 5 0 2 4 2
3 2 8 8 0 1 4 8 1 8 2 2
9 4
Prendendo le colonne numerate in ordine di numero, otteniamo:
060826428 246674580 151411542 246272922 961311401 082918141
4414434239 118451234 334422028 293488758 0417249224 794943568
4. Seconda trasposizione
La prima trasposizione era relativamente semplice. Questo, tuttavia, è una trasposizione interrotta. Il modello di interruzione è determinato dalla larghezza della tabella e dalla chiave. Nel nostro esempio, abbiamo 110 cifre e 13 colonne, il che significa che avremo 8 righe complete e 6 rimanenti. Iniziamo a compilare la prima riga, ma ci fermiamo alla colonna 0 e continuiamo come segue:
K2 8 7 12 2 10 9 4 5 6 0 3 1 11
0 6 0 8 2 6 4 2 8 stop at 0
2 4 6 6 7 4 5 8 0 1 continue in a triangle pattern
5 1 4 1 1 5 4 2 2 4 6
2 7 2 9 2 2 9 6 1 3 1 1
4 0 1 0 8 2 9 1 8 1 4 1 4 until the end
4 1 4 4 3 4 2 3 9 1 1 restart and stop at 1
8 4 5 1 2 3 4 3 3 4 4 2
2 0 2 8 2 9 3 4 8 8 7 5 8
0 4 1 restart and stop at 2
Quindi riempiamo gli ultimi spazi con le cifre rimanenti.
K2 8 7 12 2 10 9 4 5 6 0 3 1 11
0 6 0 8 2 6 4 2 8 7 2 4 9
2 4 6 6 7 4 5 8 0 1 2 2 4
5 1 4 1 1 5 4 2 2 4 6 7 9
2 7 2 9 2 2 9 6 1 3 1 1 4
4 0 1 0 8 2 9 1 8 1 4 1 4
4 1 4 4 3 4 2 3 9 1 1 9 4
8 4 5 1 2 3 4 3 3 4 4 2 3
2 0 2 8 2 9 3 4 8 8 7 5 8
0 4 1 5 6 8
Ora leggiamo le colonne esattamente nello stesso modo in cui abbiamo fatto nella prima trasposizione.
71431148 42711925 861904185 22614147 45499243 28261334 80218938
641701404 025244820 645224398 271283226 94944438 064214521
E dividi tutto in gruppi di 5 cifre:
71431 14842 71192 58619 04185 22614 14745 49924 32826 13348 02189
38641 70140 40252 44820 64522 43982 71283 22694 94443 80642 14521
5. Finalizzare il messaggio
Il passaggio finale consiste nell'inserire il nostro identificatore di messaggio casuale 47921
, nel messaggio stesso. La cifra finale della data chiave 6
indica la distanza che il gruppo dovrebbe raggiungere dalla fine.
71431 14842 71192 58619 04185 22614 14745 49924 32826 13348 02189 38641
70140 40252 44820 64522 43982 47921 71283 22694 94443 80642 14521
Note per questa sfida
- Ti vengono dati almeno cinque input: il messaggio, la parola chiave lettera, la frase chiave, la data e un numero personale. È possibile includere due input aggiuntivi: l'identificatore di messaggio casuale e gli null necessari per completare il messaggio, oppure la funzione può generare alcuni numeri casuali da sola.
- Si può presumere che tutti gli input siano validi, con il numero corretto di cifre e lettere (identificativo del messaggio a 5 cifre, almeno 20 cifre per la frase chiave e così via). Puoi presumere che le tue stringhe (il messaggio e le parole chiave) abbiano già rimosso tutta la punteggiatura e gli spazi tranne quelli consentiti nella tua versione e che i numeri siano già delimitati da segni numerici.
- La prima parola chiave non deve contenere lettere duplicate e, nel tuo codice, puoi presumere che non abbia mai lettere duplicate.
- La lingua che usi per codificare non ha importanza, purché la lingua sia preesistente, l'alfabeto sia preesistente e specifichi quale lingua utilizzare nella tua risposta.
- Qualunque alfabeto usi per la tua scacchiera a cavallo, puoi aggiungere o rimuovere simboli per riempire la scacchiera. Specificare per cosa si utilizzano questi simboli (ad esempio, punteggiatura, un simbolo "inizio messaggio" separato, simboli per parole comuni). Puoi rinunciare del tutto al segno del numero e precisare i numeri o includere ogni cifra nella scacchiera, usando lo slot in cui il segno del numero era per qualcos'altro. Si prega di specificare quale scacchiera hai usato nella tua risposta.
- L'output dovrebbe essere una stringa di gruppi di cinque cifre separati da spazio, un elenco di numeri interi di cinque cifre o qualcosa di simile.
- Ho usato l'indicizzazione zero e
0123456789
nel mio esempio. Puoi utilizzare l'indicizzazione 1 e1234567890
, o qualche altro sistema nella tua risposta, purché specifichi ciò che hai usato.
Ecco un'implementazione di esempio su Ideone .
Questo è un post lungo e ho scritto la maggior parte a mano, quindi se ci sono parti confuse in questo post o errori nel mio conteggio e trasposizione, per favore fatemelo sapere. Buona fortuna e buon golf!
without borrowing
e without carrying
? Intendi aggiungere e sottrarre mod 10
, ovvero (6+7) mod 10 = 3
e (6-8) mod 10 = 8
?
adding the first two digits without adding
Intendi portare?