Crittografia a Chiavi
Nella guida precedente abbiamo parlato di una funzione banale e primitiva di crittografia, ovvero sostituire una lettera con la sua successiva. Ma è possibile rendere questa funzione un po' più complicata attraverso il sistema a chiavi.Se voglio, ad esempio, criptare il messaggio:
CIAO AMICO
Posso fare in modo di sostituire ogni lettera, anziché con la sua successiva, con la lettera che viene, ad esempio, dopo 2 posizioni (o 3, o 4, ecc...).
Cosa significa criptare il messaggio CIAO AMICO con la chiave (3, 5, 6)?
Significa che voglio fare in modo che la prima lettera, la C, venga sostituita con la lettera che viene dopo 3 posizioni, cioè la F. Voglio, inoltre, che le seconda lettera, la I, venga sostituita con la lettera che viene dopo 5 posizioni, cioè la N. Voglio che la terza lettera, la A, venga sostituita con la lettera che viene dopo 6 posizioni, cioè la G. Con cosa devo sostituire la quarta lettera? Beh, si ricomincia dal 3. Quindi, la quarta lettera, la O, viene sostituita con la lettera dopo 3 posizioni, cioè la R. E così via.
Il messaggio criptato che ne consegue è:
FNGR FSLHU
Nota bene: Avremmo potuto decidere anche di sostituire ogni lettera con la lettera che la precede di un numero di posizioni. Ad esempio, sostituire la prima lettera, la C, con la lettera che la precede di 3 posizioni, cioè la Z (poiché prima della A si ricomincia a contare dalla Z e viceversa). Sostituire la seconda lettera, la I, con quella che la precede di 5 posizioni, cioè la D. E così via.
Avremmo anche potuto decidere di sostituire alternativamente una lettera con la successiva di 3 posizioni, una lettera con la precedente di 5 posizioni, una lettera con la successiva di 6 posizioni, e così via.
La chiave resta la stessa, cioè (3, 5, 6), ma cambia la cifratura, ovvero il metodo con cui si cripta il messaggio.
Questo ci fa capire che la chiave prescinde dal modo di cifrare. E ci fa capire allo stesso tempo che se vuoi comunicare attraverso messaggi criptati con una chiave, sia tu che il tuo interlocutore dovete conoscere sia il metodo di cifratura che la chiave.
Script in Python
Vogliamo ora scrivere una funzione che data una stringa da cifrare ed una chiave (una lista di numeri), restituisca il messaggio cifrato (criptato).Il metodo di cifratura che vogliamo utilizzare è quello mostrato sopra. Ovvero sostituire ogni lettera con la successiva di N posizioni. Il numero N varia in base ai numeri della chiave.
Così come nella parte precedente della guida, vogliamo criptare solo le lettere minuscole lasciando invariati gli spazi e gli altri caratteri.
Ecco il codice che ne risulta:
def cripta(stringa, chiave):Link al codice.
stringaCifrata = ""
stringa = stringa.lower()
i = 0
for lettera in stringa:
posizione = (ord(lettera) - 97 + chiave[i]) % 26
if ord(lettera) >= 97 and ord(lettera) <= 122:
stringaCifrata += chr(97 + posizione)
i += 1
else:
stringaCifrata += lettera
if i >= len(chiave):
i = 0
return stringaCifrata
La variabile i svolge un ruolo fondamentale. Essa prende ogni volta un numero dalla chiave (la chiave è appunto una lista, ovvero una sequenza di numeri) che sta ad indicare di quante posizioni deve essere scalata la lettera corrente. Se chiave[ i ] è 3, allora la lettera corrente deve essere sostituita con quella che viene dopo 3 posizioni.
La chiave può contenere anche numeri negativi. Se, ad esempio, chiave[ i ] è -5, allora la lettera corrente deve essere sostituita con quella che viene prima di 5 posizioni.
Il codice
posizione = (ord(lettera) - 97 + chiave[i]) % 26assegna alla variabile posizione un valore. Questo valore ha un significato preciso ma è difficile spiegarlo teoricamente. Ad esempio, se la lettera corrente è C e chiave[ i ] è 2, allora la lettera cifrata, quella che sostituirà la C, sarà la F. La F nell'alfabeto occupa la quinta posizione. La variabile posizione allora sarà 4, ovvero la quinta posizione (in Informatica si inizia a contare da 0, quindi il 4 è in quinta posizione: 0, 1, 2, 3, 4).
Decriptare
Nella prima parte ho mostrato solo la funzione che cripta, ora mostrerò anche come decriptare un messaggio.Innanzitutto, proviamo a criptare (con la funzione in Python di sopra) la stringa:
ciao a tutti
con la chiave:
(3, 8, 2, 5)
In Python scriveremo così:
print cripta("ciao a tutti", (3, 8, 2, 5))L'output, ovvero il messaggio criptato, sarà:
fqct d bwywq
Ma da questo messaggio cifrato, sapendo la chiave, è possibile ottenerne il messaggio originario (chiamato messaggio in chiaro)? Sì, è possibile. Addirittura lo si può decifrare utilizzando la funzione "cripta" stessa ed inserendo come parametri il messaggio cifrato e la chiave inversa, cioè (-3, -8, -2, -5).
Codice:
print cripta("fqct d bwywq", (-3, -8, -2, -5))
L'output sarà:
ciao a tutti
Questo perché accade? Ragioniamo. Vogliamo criptare la stringa "fqct d bwywq" con la chiave (-3, -8, -2, -5). Cosa fa il codice? Prende la prima lettera, la f, e la sostituisce con la lettera che viene prima di 3 posizioni, cioè la c. Prende la seconda lettera, la q, e la sostituisce con la lettera che viene prima di 8 posizioni, cioè la i. E così via.
In pratica compie il procedimento inverso di quello che ha compiuto per criptare il messaggio.
Da ciò si può notare l'importanza della chiave nella crittografia.
Se hai dubbi, domande o problemi col codice non esitare a scrivere nei commenti.
ciao, ho avuto un problema, mi dice che il comando cripta non è riconsciuto, come posso fare? grazie
RispondiEliminaidiota, devi definirla prima la funzione cripta. cazzone
Eliminaciao, è strano, con una sola quattrina (2,3,4,2) riesco a decifrare qualsiasi chiave...è normale?
RispondiElimina