HACKING 120% {Hacking, programmazione, computer & molto altro}

[Articolo - Crittografia] L'algoritmo Chaocipher: un cifrario inviolat

« Older   Newer »
  Share  
RootkitNeo
view post Posted on 22/11/2013, 21:02     +1   -1




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:

  1. 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);

  2. Prelevare il carattere in posizione zenith+1, e tenerlo da parte;

  3. Far scorrere i caratteri dalla posizione zenith+2 alla posizione nadir verso sinistra di un posto;

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

  1. 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);

  2. Far scorrere di una posizione i caratteri verso sinistra, così da portare il carattere in posizione 1 in ultima posizione;

  3. Prelevare il carattere in posizione zenith+2, e tenerlo da parte;

  4. Far scorrere i caratteri dalla posizione zenith+3 alla posizione nadir verso sinistra di un posto;

  5. 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)ChiaroCifrato
QWERTYUIOPASDFGHJKLZXCVBNMMNBVCXZASDFGHJKLYTREWQUIOPSO
OASDFGHJKLZXCPVBNMQWERTYUIDFHJKLYTREWQUGIOPMNBVCXZASOB
BMQWERTYUIOASNDFGHJKLZXCPVPMBVCXZASDFHJNKLYTREWQUGIOLF
FHJKLZXCPVBMQGWERTYUIOASNDYTEWQUGIOPMBVRCXZASDFHJNKLOP
PBMQGWERTYUIOVASNDFHJKLZXCPMVRCXZASDFHJBNKLYTEWQUGIOPP
PMQGWERTYUIOVBASNDFHJKLZXCMVCXZASDFHJBNRKLYTEWQUGIOPCQ


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à.
 
Top
RootkitNeo
view post Posted on 23/11/2013, 18:33     +1   -1




Nessuno che lo defeca? lol
 
Top
view post Posted on 24/11/2013, 12:35     +1   -1
Avatar

Water can take unforseen forms.

Group:
Founder
Posts:
5,273
Reputation:
+1,147
Location:
Shabang

Status:


Non ci sono errori ortografici, né frasi senza senso ;)

Le due stringhe di criptazione di partenza sono sempre queste?

L: OASDFGHJKLZXCPVBNMQWERTYUI
R: DFHJKLYTREWQUGIOPMNBVCXZAS
 
Web  Top
RootkitNeo
view post Posted on 24/11/2013, 14:22     +1   -1




CITAZIONE (Wet Water @ 24/11/2013, 12:35) 
Non ci sono errori ortografici, né frasi senza senso ;)

Le due stringhe di criptazione di partenza sono sempre queste?

L: OASDFGHJKLZXCPVBNMQWERTYUI
R: DFHJKLYTREWQUGIOPMNBVCXZAS

No, possono essere diverse. In pratica sono delle permutazioni dell'alfabeto originale. ^^
Comunque di quelle stringhe una rappresenta il testo in chiaro, l'altra quello cifrato.
 
Top
view post Posted on 24/11/2013, 19:23     +1   -1
Avatar

Water can take unforseen forms.

Group:
Founder
Posts:
5,273
Reputation:
+1,147
Location:
Shabang

Status:


Capito! :)

Tu l'hai implementato?
 
Web  Top
RootkitNeo
view post Posted on 25/11/2013, 00:29     +1   -1




Al momento no, non ho più avuto tempo e me ne ero completamente scordato. Postando qui l'articolo però ho proprio pensato che potrei anche scriverlo... magari in Assembly però, non sarebbe male.
 
Top
5 replies since 22/11/2013, 21:02   305 views
  Share