Un algoritmo di cifratura e' un metodo per
stabilire una corrispondenza tra simboli in chiaro e simboli cifrati.
I simboli in chiaro vengono utilizzati per creare
il messaggio in chiaro o plain text message, che, una volta cifrato,
diviene un testo crittografato, o cipher text.
La principale suddivisione dei cifrari e' tra
cifrari a blocchi, detti anche ECB (Electronic Code Book) e stream cypher.
Un cifrario a blocchi utilizza una chiave di
cifratura, detta keyword e la applica al testo da cifrare; un cifrario di
tipo stream cypher invece utilizza un keystream, cioe' un flusso di dati.
Di seguito vengono riportati i principali metodi
di cifraura relativi alle due tipologie.
Cifrari a blocchi
I cifrari a blocchi possono essere di tipo
monoalfabetico o polialfabetico, a seconda che mettano in corrispondenza
in modo biunivoco simbolo in chiaro e simbolo cifrato o meno, cioe', se ad
una stesso carattere del testo in chiaro corrisponde sempre lo stesso
carattere nel testo cifrato o meno.
Cifrari monoalfabetici
Shifting cypher
Questo e' uno dei cifrari piu' semplici e piu'
antichi, addirittura gia' impiegato da Giulio Cesare.
Il principio applicato e' molto semplice: ogni
simbolo dell'alfabeto che compone il messaggio originale (testo in chiaro)
viene spostato ("shiftato" appunto) di un numero fisso di posti, detto
offset.
Cosi', ad esempio, se si sceglie di utilizzare 2
come spostamento fisso, nell'alfabeto composto dalle lettere, il simbolo
"A" sara' sostituito da una "C" nel testo cifrato, il imbolo "B" sara'
sostituito da una "D" e cosi' via.
Per esempio, se si volesse cifrare il testo "HACKTHEPLANET"
e si assegnasse all'offset il valore 5, si otterrebbe "MFIPYMJUQFSKY"
Si noti che quando il valore dell'offset porta a
superare l'ultimo carattere dell'alfabeto, si ricomincia a contare dal suo
inizio. Cioe' se si dovsse cifrare la lettera "Z" con il metodo impiegato
nll'esempio, si otterrebbe il simbolo cifrato "E".
Il valore di offset puo' essere scelto a piacere,
ma e' in pratica inutile asumerlo maggiore el numero di simboli presenti
nell'alfabeto in uso, piche' si impiegherebbero solo piu' "giri" della
sequenza per arrivare al simbolo cifrato corrispondente (in proposito,
vedere la matematica modulare).
E' ovviamente stupido, inoltre, scegliere un
offset pari a 1, dato che testo cifrato e testo in chiaro risulterebbero
identici.
Questo cifrario si presta ad una semplice
decifratura, anche per chi non e' in possesso della chiave di lettura,
cioe' del valore di offset: i suoi posibili valori infatti sono pari al
numero di simboli dell'alfabeto in uso meno uno. Nell'esempio, sarebbero
stati sufficienti 25 tentativi (le lettere, nell'alfabeto anglosassone
sono 26) per coprire tutte le possibilita'.
Substitution cypher
Un altro cifrario monoalfabetico e' il cifrario a
sostituzione.
Questo metodo fa corrispondere ad ogni simbolo
dell'alfabeto originario un simbolo dello stesso alfabeto ridisposto in
modo casuale.
Un esempio chiarificatore puo' essere questo:
a b c d e f g... - alfabeto originario
d c e a b g f.... - alfabeto ricombinato
casualmente
il testo "abc" verra' cifrato come "dce".
I possibili modi di ricombinare senza ripetizioni
gli n simboli di un alfabeto sono circa n! (n fattoriale).
Affine cypher
Il cifrario affine e' sempre un cifrario
monoalfabetico, che prima moltiplica il numero d'ordine del simbolo in
chiaro per un numero scelto a piacere, e poi lo sposta di una quantita' di
posizioni da definire (offset), proprio come nello shifting cypher.
E' dunque necessario, in una logica di cifratura
di questo genere, definire due variabili numeriche.
Ad esempio, se si definisse la prima pari a 2 e la
seconda pari a 3, per cifrare il simbolo "B", corrispondente nell'alfabeto
in chiaro al numero 1 (si inizia a contare dallo 0, assegnato alla lettera
"A"), si dovrebbe calcolare 1*2 + 3 = 5. Il simbolo corrispondente alla
lettera "B" risulterebbe dunque essere "F".
Si noti che, come nello shifting cypher, i valori
utili da assegnare all'offset sono quelli da 2 a 25 (nell'alfabeto
anglosassone composto di 26 simboli; piu' in generale sono i valori
compresi tra 2 e il numero di simboli dell'alfabeto in uso meno 1).
Questo valore pero', perche' il cifrario funzioni
(e cioe' renda sempre possibile risalire dal testo cifrato al messaggio
originale senza ambiguita'), deve essere scelto in modo che il massimo
comun divisore tra questo e il numero di simboli dell'alfabeto in uso sia
1.
[Qusta condizione puo' anche essere espressa
dicendo che i due numeri devono essere coprimi. Vedi aritmetica modulare]
Cifrari polialfabetici
Cifraro di Vigenère
Per applicare un cifrario di questo tipo, e'
necessario innanzitutto scegliere una parola chive (keyword) composta di
simboli appartenenti all'alfabeto con cui e' scritto il plain text; ogni
simbolo della keyword corrispondera' al suo numero d'ordine all'interno
dell'alfabeto d'appartenenza.
Al numero d'ordine del primo simbolo del plain
text si somma poi il numero d'ordine del primo simbolo della keyword, al
socondo il secondo e cosi' via.
Quando si raggiunge l'ultimo simbolo della parola
chiave si ricomincia dal primo con il medesimo procedimento.
Ad esempio:
Si sceglie la parola chiave "SEC", i cui simboli
hanno numero d'ordine nell'alfabeto anglosassone (ricordando che la
numerazione parte dallo zero) pari a "18 4 2".
Per cifrare il testo "TRYAGAIN", i cui simboli
hanno numero d'ordine "19 17 24 0 6 0 8 13" si sommera' a ciascuno il
c
orrispondente nella keyword.
19+18 = 37 = 11 = L ; 17+4 = 21 = V; 24+2 = 26 = 0
= A; 0+18 = 18 = S; 6+4 = 10 = K etc...
Il testo finale risultante dalla cifratura sara' "LVASKCAR".
Come si nota dall'esempio, il simbolo cifrato "A"
corrisponde prima a "Y" e poi a "I", come e' proprio di un cifrario polialfabetico.
Cifrario a permutazione
Simile al cifraro di Vigenère, il cifrario a permutazione
prevede la
scelta di una una sequenza base di n numeri, che saranno permutati. La
nuova sequenza verra' applicata a porzioni del testo in chiaro della
medesima lunghezza, e portera' ad una cifratura in cui i simboli del testo
di partenza saranno ridisposti nelle posizioni indicate dal corrispondente
numero.
Con un esempio la comprensione e' immediata:
Presa la sequenza lunga 4 [1, 2, 3, 4] e scelta
una delle sue permutazioni [2, 4, 1, 3], si va a cifrare il testo "TRYAGIN".
Si considerano blocchi del testo in chiaro di
lunghezza 4 simboli: i primi 4 saranno "TRYA"; il numero 1 nella
permutazione si trova in terza posizione, dunque la prima lettera di
questa porzione di testo cifrato sara' la terza della porzione di plain
text, cioe' "Y". Il numero 2 e' il primo della sequenza, dunque la seconda
lettera del cypher text sara' la prima del testo in chiaro, cioe' "T". E
cosi' via, fino ad ottenere il testo cifrato finale "YTARIGNA".
DES
Un importantissimo algoritmo di cifratura a blocchi e' il DES (Data
Encryption System), che si trova alla base della crittografia a chiave
segreta condivisa: per conoscere nello specifico la sua implementazione,
vedere l'approfondimento dedicato. (Fai
click qui per visualizzare la pagina)
Cifrari a catena
Uno stream cypher di tipo periodico, ripete l'utlizzo
della chiave di cifratura ottenendola dalle chiavi precedentemente
impiegate, mentre uno stream cypher di tipo "one time pad" (detto anche
sincrono) sceglie la chiave di cifratura indipendentemente dalla sequenza
di plain text o dalle chiavi precedenti.
Stream Cypher Periodico
Questo meodo puo' essere applicato solo a testi da
cifrare in formato binario.
Il cifrario basa la sua potenza sull'utilizzo di
una singola chiave di cifratura di partenza detta seed (seme), di
lunghezza n bit, mentre le successive chiavi impiegate vengono ricavate
dalla prima applicando in sequenza il medesimo algoritmo.
In questo modo la chiave applicata si ripetera'
periodicamente ogni (2^n) -1 simboli.
La sequenza di chiavi ottenuta in questo modo
verra' combinata ai blocchi del testo di partenza in exclusive or,
ottenendo cosi' la cifratura del blocco.
Stream Cypher One Time Pad
La potenza di questo metodo sta nel fatto che la
chiave di cifratura viene impiegata una singola volta, detta chiave di
sessione. E' questo il metodo utilizzato anche nella codifica GSM.
Il flusso di chiavi e' infatti una stringa di
valori molto lunga, dalla quale, in ogni singola codifica, viene presa in
successione una parte della lunghezza necessaria.
Torna a inizio
pagina