L'articolo tratta un algoritmo di crittografia rivelato pochissimi anni fa (nel 2010 circa). La trattazione di questo algoritmo si focalizzerà più sul suo funzionamento in termini pratici.
Cercherò di non perdermi in chiacchiere (ed i pochi lettori dei miei articoli riguardanti Java, sanno che questo è assai frequente).
Nel periodo della Prima Guerra Mondiale, e più precisamente nel 1918, John F. Byrne creò un cifrario. Questo cifrario è conosciuto come
Chaocipher.
L'algoritmo fu presentato per la prima volta in un modo... singolare, ovvero proponendo un messaggio cifrato e lanciando questa "sfida" attraverso la sua biografia
personale.
Nel corso degli anni nessuno riuscì a decifrarlo; l'algoritmo era a conoscenza di un numero ristretto di persone, e solo nel 2010 (circa) la famiglia Byrne decise
di svelarne il funzionamento.
Introduzione all'Algoritmo
Il materiale sull'algoritmo, come detto in precedenza, è stato svelato di recente. Per essere precisi e corretti, è necessario dire che è stato donato al National Cryptologic Museum.
Il procedimento di codifica e decodifica si basa su due "ruote" (dischi). Queste hanno delle lettere incise sopra. Il punto di forza è che ogni volta che una lettera viene "prelevata" gli alfabeti di entrambe le stringhe vengono permutati.
La nostra rappresentazione, come annunciato ad inizio articolo, sarà differente. Ci accontenteremo di due stringhe! Per altro risulterà comodo creare un programma che compia questi passaggi al posto suo. In realtà mi sentirei di consigliare la creazione di un software, o l'utilizzo di un software già scritto... per quanto divertente possa essere smanettare sugli alfabeti, oltre che piuttosto lungo, è anche soggetto ad errori!
Nota personale: trovo molto più interessante l'analisi dell'algoritmo rispetto all'implementazione dello stesso in codice.Primi cenni sull'Algoritmo
Noi ovviamente non utilizzeremo 2 dischi, ma ci accontenteremo di due stringhe di 26 caratteri (l'intero alfabeto). Oltre alle stringhe, che chiameremo
L quella che rappresenterà il
Testo Cifrato ed
R, quella che rappresenterà il
Testo in Chiaro, utilizzeremo - proprio come Byrne - due simboli che indicheranno la prima e la quattordicesima lettera delle stringhe. Questi due simboli prendono il nome di
zenith (il simbolo in posizione 1),
e
nadir (simbolo in posizione 14); io sarò costretto ad utilizzare una formattazione meno intuitiva, ma pur sempre efficace: colorare i 2 caratteri in questione di colore arancione.
Ecco le due stringhe che utilizzeremo nel corso di questo Articolo per cifrare il testo e per spiegare l'algoritmo:
CODICE
L: QWERTYUIOPASDFGHJKLZXCVBNM <------- Testo Cifrato
R: MNBVCXZASDFGHJKLYTREWQUIOP <------- Testo Chiaro
La particolarità di questo algoritmo, è che ogni qual volta prenderemo un carattere cifrato (che corrisponderà al nostro in chiaro), applicheremo anche ad entrambe le stringhe una permutazione; vedremo tra breve in che modo verrà effettuata.
Il Funzionamento di Chaocipher
Come detto poco fa, si effettueranno delle permutazioni sulle 2 stringhe. Queste permutazioni ovviamente saranno uguali... invece no. Le differenze sono poche, ma comunque importanti. Analizzeremo quindi singolarmente prima la parte L e poi la parte R. Tenete bene a mente le due "parole chiave" utilizzate in precedenza per rappresentare il
primo ed il quattordicesimo elemento, qui le utilizzeremo.
La permutazione di L
La permutazione di
L sarà la prima che effettueremo dopo l'aver prelevato il carattere dalla stringa. I passi da compiere sono i seguenti:
- Far scorrere il testo verso sinistra, sino a che il carattere prelevato da L non si trovi in posizione zenith (la parte che è stata shiftata, verrà ovviamente messa alla fine di L);
- Prelevare il carattere in posizione zenith+1, e tenerlo da parte;
- Far scorrere i caratteri dalla posizione zenith+2 alla posizione nadir verso sinistra di un posto;
- Inserire in nadir il carattere prelevato in precedenza
Dopo chiariremo con un esempio l'aspetto appena illustrato.
La permutazione di R
Prima si è accennato alla differenza di R rispetto ad L; ora le differenze verranno sottolineate.
- Far scorrere il testo verso sinistra, sino a che il carattere prelevato da R non si trovi in posizione zenith (la parte che è stata
shiftata, verrà ovviamente messa alla fine di R);
- Far scorrere di una posizione i caratteri verso sinistra, così da portare il carattere in posizione 1 in ultima posizione;
- Prelevare il carattere in posizione zenith+2, e tenerlo da parte;
- Far scorrere i caratteri dalla posizione zenith+3 alla posizione nadir verso sinistra di un posto;
- Inserire in posizione nadir il carattere prelevato in precedenza.
Come per la parte L, anche quesat parte verrà spiegata tra poco. Un esempio infatti chiarirà questi 2 aspetti.
Permutazione di L ed R in modo pratico
Facendo riferimento alle stringhe mostrate in precedenza, e che riporterò qui per una maggior comodità
CODICE
L: QWERTYUIOPASDFGHJKLZXCVBNM <------- Testo Cifrato
R: MNBVCXZASDFGHJKLYTREWQUIOP <------- Testo Chiaro
ci occuperemo di cifrare due soli caratteri, la lettere
SO.
NOTA: Ho pensato di colorare la parte di caratteri permutata, quindi dovremmo fare a meno dei marcatori nadir e zenith; voi ricordate sempre che
occupano le posizioni 1 e 14 (li citeremo comunque spesso).
Come prima cosa, dobbiamo individuare il carattere da cifrare all'interno della stringa
R, dedicata al testo in chiaro. Successivamente, si preleverà il
carattere posto nella stringa
L allo stesso indice del carattere desiderato.
Il carattere
S viene semplicemente cifrato con il carattere
O; in altre parole, il carattere
O sarà proprio il nostro testo cifrato.
Ora dobbiamo permutare le due stringhe; iniziamo come detto in precedenza da L.
CODICE
QWERTYUIOPASDFGHJKLZXCVBNM
Applicando il passo 1)
CITAZIONE
OPASDFGHJKLZXCVBNMQWERTYUI
Applicando ora il passo 2), preleveremo il carattere in posizione
zenith+1 (quindi posizione 2):
CITAZIONE
O.ASDFGHJKLZXCVBNMQWERTYUI
Mettiamo da parte
P, e continuiamo a seguire i passaggi rimanenti. Ora dobbiamo applicare il passo 3).
CITAZIONE
OASDFGHJKLZXC.VBNMQWERTYUI
Ed infine il passo 4); mettere in posizione
nadir il carattere precedentemente prelevato.
CITAZIONE
OASDFGHJKLZXCPVBNMQWERTYUI
Applichiamo ora il procedimento alla parte
R.
CODICE
MNBVCXZASDFGHJKLYTREWQUIOP
Procediamo quindi alla permutazione della stringa:
1)
CITAZIONE
SDFGHJKLYTREWQUIOPMNBVCXZA
Come richiesto dal punto 2) dobbiamo shiftare ancora una volta di 1 solo posto verso sinistra la stringa:
CITAZIONE
DFGHJKLYTREWQUIOPMNBVCXZAS
Ora, come indicato dal punto 3) preleviamo il carattere in posizione
zenith+2, e lo sostituiremo con il Punto.
CITAZIONE
DF.HJKLYTREWQUIOPMNBVCXZAS
Il carattere prelevato è
G.
Ora applichiamo il passo 4) e facciamo scorrere il testo verso sinistra di una sola posizione, partendo da
nadir.
CITAZIONE
DFHJKLYTREWQU.IOPMNBVCXZAS
Come segnalato dal colore verde, abbiamo traslato da
zenith+3 a
nadir. Ora il Punto si trova proprio in posizione
nadir, come accade per l'altro alfabeto.
Allo stesso modo ora inseriamo
G in posizione
nadir.
CITAZIONE
DFHJKLYTREWQUGIOPMNBVCXZAS
Il carattere successivo, ovvero
O viene cifrato con la lettera
B.
Ora il procedimento può dirsi concluso! Nel prossimo paragrafo noteremo alcuni aspetti interessanti...
Post-permutazioni
Titolo ambiguo, debbo darvene atto. Ma un motivo c'è! Voglio portare la vostra attenzione sui risultati che abbiamo ottenuto dalle precedenti permutazioni. Ecco le stringhe, riportando sempre
zenith e
nadir.
CODICE
L: OASDFGHJKLZXCPVBNMQWERTYUI
R: DFHJKLYTREWQUGIOPMNBVCXZAS
Questi sono i risultati precedenti, dopo all'aver eseguito le permutazioni. Il carattere da cifrare era
S, ed il suo corrispondente (come potrete verificare tornando sopra) era
O. Nulla di strano? No... tranne il fatto che
L come primo carattere presenta il nostro testo cifrato, ed
R come ultimo carattere presenta proprio il testo in chiaro.
Questa caratteristica, la si ha solo se la procedura di crittazione è corretta (quindi è proprio una verifica che possiamo fare per esserne certi).
Continuiamo la parola...
Il testo da cifrare originariamente era
SO. Ora, mostrerò in una tabella i passaggi per cifrare "SOLOPC" avvalendomi del testo mostrato ad inizio Articolo.
Ricordiamo sempre che per cifrare è necessario cercare il carattere "in chiaro" all'interno di R e poi prendere il corrispondente in L.
Ecco i passi per cifrare SOLOPC.
L (Cifrato) | R (Chiaro) | Chiaro | Cifrato |
QWERTYUIOPASDFGHJKLZXCVBNM | MNBVCXZASDFGHJKLYTREWQUIOP | S | O |
OASDFGHJKLZXCPVBNMQWERTYUI | DFHJKLYTREWQUGIOPMNBVCXZAS | O | B |
BMQWERTYUIOASNDFGHJKLZXCPV | PMBVCXZASDFHJNKLYTREWQUGIO | L | F |
FHJKLZXCPVBMQGWERTYUIOASND | YTEWQUGIOPMBVRCXZASDFHJNKL | O | P |
PBMQGWERTYUIOVASNDFHJKLZXC | PMVRCXZASDFHJBNKLYTEWQUGIO | P | P |
PMQGWERTYUIOVBASNDFHJKLZXC | MVCXZASDFHJBNRKLYTEWQUGIOP | C | Q |
Il testo cifrato e' quindi:
OBFPPQ.
Attenzione! Le ultime 2 righe della tabella, si fermano a P e P, ma non riportano il testo per C e Q. Questo perchè ovviamente quando abbiamo cifrato l'ultimo carattere (
C), avevamo appena permutato gli alfabeti... quindi essendo gli ultimi, ci si ferma.
Decifrare Chaocipher
A questo punto una domanda è lecita: come si può decifrare un testo cifrato in questo modo? Il procedimento è molto semplice, ed è praticamente l'opposto della codifica. O meglio, la differenza è che la stringa
L verrà cifrata con le regole usate in precedenza per la stringa
R e viceversa.
Iniziando quindi dalle ultime stringhe ottenute, e ricordando il testo cifrato che è
OBFPPQ:
cerco in
L il carattere cifrato
Q (ovviamente si parte dalla fine):
CODICE
PMQGWERTYUIOVBASNDFHJKLZXC <-------- Testo Cifrato
MVCXZASDFHJBNRKLYTEWQUGIOP <-------- Testo in Chiaro
Il carattere corrispondente è
C, proprio l'ultimo carattere del testo in chiaro.
Applicando il procedimento a L (mostrerò tutti i passaggi di seguito, lasciando una riga l'uno dall'altro... ormai dovrebbe essere chiaro):
CITAZIONE
QGWERTYUIOVBASNDFHJKLZXCPM
GWERTYUIOVBASNDFHJKLZXCPMQ
GW.RTYUIOVBASNDFHJKLZXCPMQ
GWRTYUIOVBASNEDFHJKLZXCPMQ
Ora alla parte R:
CITAZIONE
CXZASDFHJBNRKLYTEWQUGIOPMV
C.ZASDFHJBNRKLYTEWQUGIOPMV
CZASDFHJBNRKLXYTEWQUGIOPMV
CODICE
GWRTYUIOVBASNEDFHJKLZXCPMQ
CZASDFHJBNRKLXYTEWQUGIOPMV
Dopo alla Q, dobbiamo decifrare la
P. Infatti guardando nell'alfabeto
L possiamo notare che in sua corrispondenza vi è
P, che è proprio la penultima lettera del testo decifrato (
SOLOPc).
Mi sembra inutile continuare il procedimento di decodifica, dovrebbe essere molto chiaro ormai.
Conclusioni
L'algoritmo è giunto al termine, proprio come l'articolo che avete letto. Per domande o chiarimenti potete postare qui sul forum. In rete è comunque reperibile altro materiale sull'algoritmo (anche attacchi a Chaocipher).
PS: Chiedo venia ma a causa di alcuni problemi non ho potuto dedicar del tempo alla rilettura dell'articolo. Quindi se notate errori di scrittura o eventuali frasi senza molto senso, vi prego di segnalarmele. ^^
Il titolo del post non è dei migliori, però mi sembrava potesse catturare l'attenzione dell'utenza, e quindi stuzzicare la curiosità.