☰ MENU
Ti trovi in: Home - Altri Interessi - Crittografia

La Crittografia

Crittografia è un termine di origine greco che significa scrittura nascosta, ovvero un insieme di metodi per rendere un messaggio offuscato in modo da non essere comprensibile a persone non autorizzate a leggerlo.
È una scienza molto antica, tra le prime testimonianze che abbiamo ci sono:
Nell'antica Grecia si usava lo Scitala, ovvero un messaggio cifrato e segreto che veniva inviato dagli efori, i cinque supremi magistrati di Sparta, ai generali e ai navarchi impegnati nelle spedizioni militari. Questo era compsto da due parti: la prima che consiste in un bastone che ha un preciso diametro di spessore, ed una seconda che consiste in un lembo verticale di pergamena. Il lembo di pergamena veniva avvolto attorno al bastone, ed in questo momento veniva scritto un messaggio, sopra di questa. Una volta disfatto questo congegno, ritornavamo ad avere un bastone ed una pergamena, sulla quale erano presenti caratteri, che letti senza questa accortezza, erano caratteri a caso senza nessun nesso logico, perciò il messaggio per essere compreso doveva pervenire con la pergamena e un bastone, se non lo stesso almeno uno dello stesso diametro del precedente.
Il cifrario biblico Atbash. L'origine di questo cifrario si può trovare nella Bibbia, nel libro di Geremia, dove venne criptato il nome di una città Babel con Sheshakh. Il nome stesso del cifrario viene dalla lingua ebraica: la prima lettera dell'alfabeto ebraico è aleph, l'ultima taw, la seconda beth, e la penultima shin; messe assieme, formano la parola atbash.
Il Cifrario di Cesare imperatore Romano, il quale inviava comunicazioni belliche cifrate per dare ordine alle truppe, sul quando attaccare oppure da dove attaccare.
Mentre il Cifrario di Cesare e il Cifrario Biblico Atbash si basano su una sostituzione dell'alfabeto base con uno nuovo, con lo Scitala si ha una permutazione delle lettere dello stesso messaggio, in un determinato modo.
Perciò possiamo distinguere due tipi di crittografia:

  • Sostituzione dell'alfabeto per riscrivere il messaggio, perciò abbiamo che ad ogni posizione del nuovo messaggio ci sarà la nuova lettera proveniente dal nuovo alfabeto. Ed è importante la posizione. Possono essere a loro volta:

    • Monoalfabetico: che utilizza un solo alfabeto per criptare.

    • Polialfabetico: che utilizza più alfabeti per criptare.

  • Permutazione delle lettere dello stesso messaggio, perciò abbiamo che ogni lettere può assumere posizioni diverse all'inteno nuovo messaggio, ovvero quello che oggi diremo un anagramma.

Nel medioevo, questi metodi proliferarono, con delle persone di straordinaria inventiva come Leon Battista Alberti, che scrisse il trattato De cifris, primo testo sulla crittografia, ed inventò il metodo di crittografia del disco cifrante.
Fino a questo momento si parlava di metodi crittografici che utilizzano un solo alfabeto che veniva trasposto in avanti o indietro, successivamente con Giovan Battista Bellaso, si cominciò ad mescolare al testo una chiave di codifica/lettura. La cifratura avveniva mediante l'uso di un versetto convenuto fra i due corrispondenti, chiamato contrassegno, che veniva sovrapposto al testo da cifrare. Questo metodo fù perfezionato in seguito da Giovanni Battista Della Porta. Successivamente fù ripreso ed ampliato anche con il francese Blaise de Vigenere.
La Crittografia si affermò prepotentemente nel corso della Seconda guerra mondiale con il calcolatore Enigma che codificava tutte le comunicazioni scambiate dalle forze Tedesche e dalle truppe dell'Asse ovvero Germania e Italia. Enigma si basava sulla crittografia di Vigenere e di Alberti del disco cifrante, soltanto che aveva una complessità maggiore, utilizzava molti dischi cifranti.
Per la decodifica di questi messaggi cifrati, si misero al lavoro le menti più elevate della matemeatica e della crittografia come Alan Turing e Rejewski che costruirono altre calcolatori come Bomba che riuscì a decodificare questi messaggi cifrati, e grazie e loro la Germania perse la guerra.
Gli sforzi per creare queste macchine non si esaurirono con la fine della guerra, ma sfociarono nella costruzione del Computer con la nascita del primo calcolatore elettronico Colossus, per poi arrivare all'ENIAC e poi al PC che conosciamo oggi.
Fino a questo momento abbiamo parlato di testo cifrato con una chiave, questo metodo si chiama Crittografia simmetrica, negli anni 1970 invece si è fatto un grande passo in avanti con la Crittografia asimmetrica la differenza è:

  • Crittografia simmetrica, usa un'unica chiave sia per proteggere il messaggio che per renderlo nuovamente leggibile. Il problema è condividere la chiave di cifratura con il destinatario del messaggio criptato senza che questa venga scoperta.

  • Crittografia asimmetrica, usa chiavi diverse per cifrare e per decifrare un messaggio, facilitando incredibilmente il compito di distribuzione delle chiavi. Infatti in questo caso non è necessario nascondere le chiavi o le password: c'è una chiave per crittografare, che chiunque può vedere, e una per decifrare, che conosce solo il destinatario senza necessità quindi di riceverla o scambiarla dal mittente.

Nei giorni nostri la crittografia è il pane quotidiano, tutte le trasmissioni da cellulare, trasmissioni radio, trasmissioni TV (Canali speciali a pagamento), trasmissioni dati su internet sono criptate. Riportiamo alcuni dei cifrari più antichi della storia qui di seguito.
Ecco alcuni Metodi di Criptogafia:

Cifrario di Cesare

Questo è un cifrario a sostituzione monoalfabetica e consiste nell'avere due alfabeti scritti su due cerchi concentrici, questi possono essere allineati, ovvero ad ogni lettera corrispnde la stessa nell'altro alfabeto, oppure sfalzarli, perciò ad ogni lettera ad esempio la A nel primo alfabeto corrispnde la C nel secondo, ovvero si inserisce un ritardo nel secondo alfabeto di due lettere.
Nota Bene usare solo caratteri dalla A-Z e spazi.










Cifrario Biblico Atbash

Questo è un cifrario a sostituzione monoalfabetica e consiste nel invertire le lettere dell'alfabeto, perciò alla prima lettera A corrisponde l'ultima la Z, ovvero avremo una codifica eseguita con un alfabeto rovesciato.
Nota Bene usare solo caratteri dalla A-Z e spazi.








Cifrario Vigenere

Questo Cifrario consiste nell'usare un alfabeto, ed una chiave di codifica/lettura, chimata in gergo verme o contrassegno, perciò si prende un alfabeto ed una chiave e questa viene mescolata nella codifica, ovvero si somma nella cifratura.
Nota Bene il testo da criptare deve essere di lunghezza pari o superiore alla chiave di codifica o verme; usare solo caratteri dalla a-z e spazi










RSA

RSA è un'algoritmo di crittografia asimmetrica, ovvero un cifrario asimmetrico composto da chiave pubblica e chiave privata. Il sistema di crittografia si basa sull'esistenza di due chiavi distinte, che vengono usate per cifrare e decifrare. Se la prima chiave viene usata per la cifratura, la seconda deve necessariamente essere utilizzata per la decifratura. La questione fondamentale è che nonostante le due chiavi siano fra loro dipendenti, non sia possibile risalire dall'una all'altra, in modo che se anche si è a conoscenza di una delle due chiavi, non si possa risalire all'altra, garantendo in questo modo l'integrità della crittografia. Questa indipendenza delle chiavi è garantita dalla loro generazione partendo dall'algoritmo RSA:

  • Si prendono due numeri primi abbastanza grandi p e q

       
  • Si calcolano il loro prodotto ed il loro modulo n e mod

       
  • La fattorizzazione di n è molto complessa poichè è data da numeri primi, perciò segreta poichè solo chi ha scelto i due numeri primi, p e q, la conosce e sarà in grado di fattorizzarlo.


  • Si sceglie poi un numero e (chiamato esponente pubblico) coprimo il modulo mod.

      coprimo con  
  • Si calcola il numero d (chiamato esponente privato) tale che il suo prodotto con e sia congruo ad 1 modulo mod.

          tali che  

La chiave pubblica sarà (n,e) e la chiave privata sarà (n,d)

Chi deve criptare il messaggio deve solo sapere la chiave pubblica e che può viaggiare liberamente (essere anche intercettata).
Chi deve decriptare il messaggio deve sapere invece la chiave privata d e i due numeri primi p e q ovvero quest'ultimo tramite p e q genera la chiave pubblica e la invia al mittente, e genera la chiave privata per se stesso, per decriptare e questa deve essere custodita con assoluta segretezza.

Nel nostro algoritmo ci limitiamo a usare numeri primi piccoli, dato che i tipi di dato usati da JavaScript per fare i calcoli, non sono abbastanza grandi per memorizzare elevamento a potenza molto grandi.
Ma per avere un algoritmo efficiente bisognerebbe usare p e q primi molto più grandi, ed i caratteri del testo dovrebbero essere raggruppati in blocchi prima di essere cifrati/decifrati per impedire decrittazioni basate sull'analisi delle frequenze.

Inserisci due numeri primi p e q.




Usata dal mittente per criptare il testo



Usata dal destinatario per decriptare il testo,
alla quale devono essere associati anche i due primi usati per la codifica RSA.












Base64

la codifica Base64 consente la traduzione di testo ASCII in una codifica Base64.

ASCII /Base64

L'Algoritmo prende in input una stringa di caratteri.

  1. Data questa stringa la separiamo in lettere e da esse prendiamo la loro codifica ASCII, che sarà un numero decimale.

  2. Prendiamo il numero decimale associato ad ciascuna lettera e lo trasformiamo in binario, questo è rappresentato da 8 caratteri.

  3. Concateniamo tutti i numeri binari e li raggruppiamo in gruppi di 6 caratteri ottenendo così nuovi numeri.

  4. Da questi nuovi numeri binari di 6 caratteri riotteniamo il valore decimale.

  5. Il valore decimale corrisponderà ad una nuova codifica Base64.

Perciò dalla prima stringa otteniamo una nuova stringa codificata.
Per riottenere la stringa originaria dobbiamo fare il percorso inverso.

  1. Riprendiamo la nuova stringa codificate in Base64 la separiamo in lettere, prendiamo le lettere e mediante la tabella di conversione otteniamo il numero decimale.

  2. Da questo numero prendiamo la sua rappresentazione in binario, che sarà da 6 caratteri

  3. Concateniamo tutti i numeri binari e poi li raggruppiamo un gruppi di 8 caratteri ottenendo così altri numeri.

  4. Da questi nuovi numeri binari di 8 caratteri riotteniamo il valore decimale.

  5. Il valore decimale corrisponderà ad alla stringa originale in ASCII.

Facciamo un esempio:
Prendiamo la stringa ABC la dividiamo in lettere A, B, C ciascuna lettere ha una rappresentazione in codice ASCII:

Lettera

Codice ASCII

Binario

A

65

01000001

B

66

01000010

C

67

01000011

Concateniamo i numeri binari in una stringa

01000001,01000010,01000011

Otteniamo

010000010100001001000011

Raggruppiamola in gruppi di 6 caratteri

010000,010100,001001,000011

Da questi numeri binari riotteniamo i numeri decimali che però devono essere convertiamo in lettere secondo la codifica Base64

Binario

Decimale

Lettera Base64

010000

16

Q

010100

20

U

001001

9

J

000011

3

D

Perciò la nostra stringa iniziale ABC sarà così codificata QUJD.
Il passaggio di decodifica sarà il percorso inverso:
Prendiamo la stringa codificata QUJD dividendola in lettere.
Mediante la codifica Base64 riotteniamo il loro corrispondente valore decimale e dai numeri decimali otteniamo la loro conversione in binario.
Da questi numeri binari riotteniamo i numeri decimali che però devono essere convertiamo in lettere secondo la codifica Base64.

Lettera

Decimale

Binario

Q

16

010000

U

20

010100

J

9

001001

D

3

000011

Concateniamo i numeri binari in una stringa

010000,010100,001001,000011

Otteniamo

010000010100001001000011

Raggruppiamola in gruppi di 8 caratteri

01000001,01000010,01000011

Da questi numeri binari riotteniamo i numeri decimali

Binario

Decimale

Lettera ASCII

01000001

65

A

01000010

66

B

01000011

67

C

Ecco che abbiamo riottenuto la nostra stringa originale ABC.











Matrice

Questo Algoritmo consiste nel crittografare blocchi di caratteri usando due matrici quadrate che verranno moltiplicate tra loro.
Però queste matrici devono avere delle proprietà che elencheremo di seguito. Vediamo i passi di questo Algoritmo:

  1. Creare una matrice A che contiene la chiave di criptazione:

    1. Innanzitutto, dobbiamo scegliere una chiave per crittografare che deve essere inserita in una matrice quadrata 3x3, perciò, deve essere una parola di 9 lettere.

    2. Convertiamo ogni lettera in un numero, sostituendo _ con 0, A con 1, B con 2, C con 2 e così via, fino a Z con 27.

    3. Inseriamo questi numeri in una matrice quadrata A 3x3.

    4. Però dobbiamo scegliere una chiave che generi una matrice quadrata A 3x3 Invertibile ovvero:

      1. A deve essere una matrice quadrata.

      2. Il suo Determinante deve essere diverso da zero.

      3. Dobbiamo calcolare la sua matrice dei complementi algebrici o matrice dei cofattori.

      4. Dobbiamo calcolare la Trasposta della matrice dei complementi algebrici o cofattori.

      5. Dividiamo la Trasposta per il Determinante di A ovvero (det |A|)-1. Così facendo otteniamo la matrice inversa di A ovvero A-1.

  2. Creare una matrice B che contiene il testo da criptare:

    1. Innanzitutto, dobbiamo scegliere una parola da crittografare che deve essere inserita in una matrice quadrata 3x3, perciò, deve essere una parola di 9 lettere oppure un multiplo di 9.

    2. Convertiamo ogni lettera in un numero, sostituendo _ con 0, A con 1, B con 2, C con 2 e così via, fino a Z con 27.

    3. Inseriamo questi numeri in una matrice quadrata B 3x3.

  3. Successivamente per la criptazione facciamo la moltiplicazione delle due matrici AxB così otteniamo il messaggio criptato.

  4. Infine, per decriptare il messaggio cifrato dobbiamo moltiplicarle la matrice del messaggio criptato B per la matrice inversa della chiave A ovvero A-1.
    In questo modo riotteniamo il messaggio originale, ecco perché era richiesto avere la matrice della chiave A Invertibile.

Un consiglio per il lettore, dato che trovare una matrice A che contiene la chiave di criptazione, la quale dovrà essere Invertibile, non è una cosa semplice.
Si può bypassare il problema poiché abbiamo già scelto una matrice A Invertibile. Altrimenti si può provare a cercare una matrice Invertibile. Altrimenti si può provare a scegliere una matrice Invertibile, tra le scelte che forniamo qui di seguito:






Matrice Chiave A

   

Matrice inversa della Chiave A-1










Conversione in numeri con diverse basi numeriche

Conversione in numeri con diverse basi numeriche.
L'Algoritmo prende in input una stringa di caratteri.

  • Data questa stringa la separiamo in lettere e da esse prendiamo la loro codifica ASCII, che sarà un numero decimale.

Perciò dalla prima stringa otteniamo una nuova stringa codificata.
Per riottenere la stringa originaria dobbiamo fare il percorso inverso.

Possiamo inoltre decidere se usare la codifica decimale oppure usare altri tipi di codidifica:

  1. Binario

  2. Ottale

  3. Decimale

  4. Esadecimale