Guida Crittografia Crittografia e Algoritmi di cifratura

N3v5

Utente Silver
24 Ottobre 2020
169
19
40
80
PREMESSA

Se anche tu ti sei perso tra gli innumerevoli siti e documenti che parlano di crittografia e non sei ancora riuscito a farti una panoramica chiara dell’argomento forse sei nel posto giusto. In questo breve elaborato cercherò di aiutarti a capire il ruolo della crittografia nell’informatica e, di conseguenza, nella vita quotidiana di tutti noi. Il mio scopo non è comunque quello di entrare nei dettagli tecnici ma partire dal macro e lasciare che sia tu a decidere se inoltrarti ulteriormente in questo vastissimo mondo. Ogni informatico che possa definirsi tale deve però avere almeno un’idea del funzionamento delle cose. Questo è lo scopo di questo documento.
Partiamo.



PICCOLA INTRO

Fino a pochi decenni fa la crittografia veniva utilizzata quasi esclusivamente in ambiti militari o governativi. Al giorno d’oggi ciascuno di noi ne fa uso quotidianamente (nel cellulare, nel telecomando per aprire l’auto, al bancomat,...). Trasmettiamo continuamente informazioni che potrebbero essere captate e sfruttate contro di noi. Bisogna far sì che anche se una potenziale terza persona riuscisse ad impossessarsi del messaggio, questo gli appaia incomprensibile. La crittografia è quindi diventata uno strumento di massa, atto a proteggere i segreti di stato quanto i nostri dati privati.



L'INDISPENSABILE

Crittografia
: è la scienza che si occupa di proteggere l’informazione rendendola sicura, in modo che un utente non autorizzato che ne entri in possesso non sia in grado di comprenderla.
Crittoanalisi: di converso, la crittoanalisi è la scienza che cerca di aggirare o superare le protezioni crittografiche, escogitando metodi e tecniche per accedere alle informazioni riservate.
Crittologia: insieme di crittografia e crittoanalisi.
Algoritmo crittografico: funzione che prende in input un messaggio e un parametro detto chiave, e produce in output un messaggio trasformato.
Cifratura: trasformare il testo in chiaro (cleartext) in testo cifrato (ciphertext).
Decifratura: il contrario.
Crittografia simmetrica: se le chiavi di cifratura e decifratura sono uguali.
Crittografia asimmetrica: se sono diverse (una pubblica ed una privata).



CRITTOGRAFIA SIMMETRICA

La chiave è una sola sia per criptare che per decriptare. Anche l’algoritmo è il medesimo. Se quindi due utenti vogliono comunicare tra loro dovranno prima accordarsi su un algoritmo da utilizzare e sulla chiave comune. Ovviamente, è di vitale importanza che la chiave rimanga nota solo a loro due, perciò deve essere scambiata su un canale sicuro (per l’algoritmo non è così importante).
L’esempio più classico di questo tipo di crittografia è il Cifrario di Cesare. Il suo funzionamento è molto semplice:
Goku e Vegeta (basta Alice e Bob!!!) vogliono scambiarsi un messaggio. Si mettono d’accordo nello scegliere la chiave, che sarà un certo valore (K). L’algoritmo consiste nel sostituire ogni lettera del testo originale con la lettera che si trova K posizioni più avanti nell’alfabeto. Se come chiave scelgono 3, ad esempio, alla lettera A corrisponderà la lettera D.
In chiaro: A B C D E F G H I L M N O P Q R S T U V Z
Cifrate con K=3: D E F G H I L M N O P Q R S T U V Z A B C
Se Goku invia il messaggio criptato ”Fndr Bhlhzd”, Vegeta, conoscendo il funzionamento dell’algoritmo e la chiave, dovrà solo applicare il procedimento inverso. Il messaggio decriptato sarà ”Ciao Vegeta”.
Possiamo facilmente capire che il punto debole della crittografia simmetrica è la necessità di scambiarsi la chiave, che potrebbe essere intercettata da terzi. Per ovviare a questo ostacolo, nel 1976 Diffie e Hellman inventano la crittografia asimmetrica, che non necessita dello scambio di alcuna chiave.



CRITTOGRAFIA ASIMMETRICA

Ogni utente ha due chiavi: chiave pubblica e chiave privata. La prima è di dominio pubblico, la seconda deve restare assolutamente privata!
CONCETTO CHIAVE
Un messaggio criptato con una chiave (pubblica o privata che sia) può essere decriptato solo dalla chiave complementare!
Quindi:
- un messaggio criptato con la chiave pubblica di Goku può essere decriptato SOLO utilizzando la chiave privata di Goku
e
- un messaggio criptato con la chiave privata di Goku può essere decriptato SOLO utilizzando la chiave pubblica di Goku.
Naturalmente, è impossibile risalire ad una chiave conoscendo l’altra e tentare di forzarne una, ad esempio, con un bruteforce è assolutamente impensabile in quanto non basterebbero miliardi di anni.

Funzionamento:
Goku vuole inviare un messaggio a Vegeta.
• Goku prende la chiave pubblica di Vegeta,
• Goku cripta il messaggio utilizzando tale chiave,
• Goku invia il messaggio cifrato a Vegeta,
• Vegeta decripta il messaggio (lui e solo lui lo può fare perché possiede la chiave privata associata alla chiave pubblica che Goku ha usato per cifrare il messaggio).
In questo modo si elimina a monte il principale problema della crittografia simmetrica (lo scambio della chiave) in quanto i due utenti non hanno bisogno di scambiarsi nessuna chiave! Un altro vantaggio è che chiunque può scrivere a chiunque un messaggio. Per questo motivo è importante che la chiave pubblica sia facilmente reperibile. Di solito esse vengono memorizzate in appositi server (key server) accessibili a chiunque lo desideri.

Dobbiamo però notare una cosa: Goku, per criptare il messaggio che ha inviato a Vegeta ha utilizzato la chiave pubblica di quest’ultimo che, essendo appunto pubblica, è di pubblico dominio. Come fa Vegeta a sapere che non è stato, ad esempio, Majin Bu a scrivergli quel messaggio spacciandosi per Goku? E’ necessario autenticare il mittente.
Potremmo fare così:
• Goku cifra con la sua chiave privata il messaggio,
• Goku invia il messaggio cifrato a Vegeta,
• Vegeta utilizza la chiave pubblica di Goku per decifrare il messaggio. Vegeta ha quindi la certezza che è stato Goku a scrivergli perché con la chiave pubblica di Goku è riuscito a decriptare il messaggio (che Goku ha cifrato con la sua chiave privata).
Ora però si presenta il problema inverso: il destinatario può essere chiunque. Majin Bu, se riuscisse ad intercettare il messaggio criptato, potrebbe benissimo prende la chiave pubblica di Goku e decifrarlo.

Ecco allora che dobbiamo utilizzare una combinazione delle due tecniche:
• Goku cripta con la sua chiave privata il messaggio,
• Goku cripta ulteriormente il messaggio con la chiave pubblica di Vegeta,
• Goku invia il messaggio doppiamente criptato,
• Vegeta decripta il messaggio con la sua chiave privata (ora solo lui può essere il destinatario),
• Vegeta decripta ulteriormente il messaggio con la chiave pubblica di Goku (ora sa che è stato Goku a scrivergli).

Possiamo quindi affermare che la crittografia simmetrica è stata superata? No! La crittografia asimmetrica comporta un carico computazionale molto più pesante, infatti gli algoritmi asimmetrici sono anche 1000 volte più lenti di quelli simmetrici. La crittografia asimmetrica è quindi troppo costosa in termini di risorse e di tempo per cifrare testi lunghi, quindi si usa semplicemente per creare un canale sicuro nel quale scambiarsi una chiave che poi utilizzeremo con una tecnica di crittografia simmetrica (che utilizza algoritmi molto più leggeri).



ALGORITMI DI CIFRATURA

Bisogna sempre tenere a mente che la crittografia è una disciplina molto complessa, in continua evoluzione e che fa largo uso della matematica avanzata. Molti algoritmi crittografici considerati ragionevolmente sicuri fino a pochi anni fa oggi possono essere forzati in tempi brevissimi grazie alla sempre crescente potenza di calcolo dei processori. La formulazione di un nuovo algoritmo crittografico è un processo estremamente complesso e segue un lungo processo di messa a punto, correzione ed eliminazione delle debolezze. Per poter definire un algoritmo sicuro bisogna essere in grado di dimostrare matematicamente qual è l’attacco più efficace e che questo attacco è impraticabile. Solo la collaborazione a livello mondiale dei massimi esperti di crittografia permettere di raggiungere questo risultato. Sebbene nessun algoritmo possa definirsi sicuro in senso assoluto, possiamo ritenerlo sicuro se l’attacco più efficace contro di esso è equivalente ad un attacco di forza bruta, ovvero a provare tutte le possibili chiavi. Capirete che l’argomento è molto complesso. Semplificando il più possibile possiamo dire che gli algoritmi di cifratura consentono di trasformare un testo in base al valore di un parametro, cioè la chiave. Questi algoritmi si basano sull’uso di funzioni unidirezionali, funzioni che sono agevoli da calcolare in una direzione ma che diventano computazionalmente pesantissime nella direzione opposta (funzione inversa). Nella Teoria dei Numeri, nell’aritmetica modulare si trovano diverse funzioni di questo tipo come ad esempio l’elevamento a potenza modulo n. Altri esempi sono la fattorizzazione di un numero primo, il logaritmo discreto e le relazioni delle curve ellittiche. Per fare un esempio: è sufficiente un piccolo computer e qualche millesimo di secondo per moltiplicare due numeri primi da 150 cifre, ma occorre il lavoro di decine di migliaia di computer per anni per trovare i fattori primi di quel numero. Gli algoritmi di cifratura si possono distinguere in simmetrici e asimmetrici, a seconda che usino una o due chiavi.

Tra i principali algoritmi simmetrici troviamo:
DES (Data Encryption System): possiamo considerarlo come il padre di tutti gli algoritmi simmetrici moderni. E’ un algoritmo relativamente semplice sia dal punto di vista teorico che implementativo. L’idea di base è quella di ripetere molte volte operazioni di confusione (sostituire i valori) e diffusione (permutare i valori). DES ha 16 round e una chiave segreta iniziale di 56 bit;
3-DES: ad oggi il DES è considerato un algoritmo ormai obsoleto perché, con le attuali potenze di calcolo è possibile fare bruteforce a qualunque algoritmo con chiavi a 56 bit (in realtà tutte le chiavi di lunghezza inferiore a 100 bit sono in pericolo). Purtroppo DES non può utilizzare chiavi più lunghe, il massimo che si può fare è applicare l’algoritmo con chiavi diverse. Questo si fa generalmente tre volte, da qui il termine 3-DES;
AES (Advanced Encryption Standard): anche conosciuto come ”Algoritmo di Rijndael”, è molto più efficiente del DES (e anche più veloce). La principale differenza rispetto al DES è che quest’ultimo è basato su semplicissime operazioni matematiche sui bit, mentre l’AES è basato su matematica molto avanzata. Ne esistono tre tipi:
- AES-128: utilizza chiavi da 128 bit ed effettua 10 round. Utilizzato dall’NSA per documenti SECRET;
- AES-192: utilizza chiavi da 192 bit ed effettua 12 round. Utilizzato dall’NSA per documenti TOP SECRET;
- AES-256: utilizza chiavi da 256 bit ed effettua 14 round. Utilizzato dall’NSA per documenti TOP SECRET.
Molto probabilmente l’NSA è già riuscita a violare l’AES, ma ovviamente non ci è dato saperlo per certo.
Il principale algoritmo asimmetrico è invece l’RSA (Rivest, Shamir, Aldeman), che si basa sulla fattorizzazione dei numeri primi. Utilizza chiavi di 1024, 2048 o 4096 bit e oltre 300 cifre decimali. E’ però molto più lento, ad esempio, del DES (1000 volte in hardware e 100 volte in software). Dato che questo algoritmo, come detto, si basa sulla fattorizzazione dei numeri
primi, un attacco a forza bruta non consisterebbe nel provare tutte le chiavi possibili, bensì nel fattorizzare il prodotto di due numeri primi.

Oltre ad algoritmi simmetrici e asimmetrici abbiamo poi le funzioni di hash. Esse sono funzioni non invertibili che mappano una stringa di lunghezza arbitraria in una stringa di lunghezza predefinita. Esistono diversi algoritmi che realizzano funzioni hash e la lunghezza dei valori di hash varia a seconda degli algoritmi utilizzati. Il valore più comunemente adottato è di 128 bit, che offre una buona affidabilità in uno spazio relativamente ridotto. Tuttavia va registrata la possibilità d’uso di hash di dimensione maggiore (SHA (Secure Hash Algorithm), ad esempio, può anche fornire stringhe di 224, 256, 384 e 512 bit) e minore (che però è fortemente sconsigliato). Le funzioni hash svolgono un ruolo essenziale nella crittografia: sono utili per verificare l’integrità di un messaggio, poiché l’esecuzione dell’algoritmo su un testo anche minimamente modificato fornisce un output (digest) completamente differente rispetto a quello calcolato sul testo originale, rivelando la tentata modifica.
Due algoritmi di hash molto utilizzati in passato erano MD5 e SHA-1. Sono ora però considerati obsoleti e vengono sostituiti da SHA-224, SHA-256, SHA-384 o SHA-512, a volte indicate collettivamente come SHA-2. Nessuna delle varianti di SHA-2 è stata ancora violata. Le SHA sono state progettate dall’NSA e vengono utilizzate come standard del governo americano.

Un ultimo appunto: spesso e volentieri, da soli, gli algoritmi crittografici non bastano nelle applicazioni pratiche. Un esempio che merita attenzione è quello della firma digitale. Quando Goku e Vegeta comunicano tra loro, vorranno anche essere certi dell’integrità del messaggio. La firma digitale è appunto la combinazione di un algoritmo asimmetrico e di una funzione hash per far sì di garantire non solo l’autenticità, ma anche l’integrità del messaggio.
Il procedimento è il seguente:
• Goku calcola l’hash del documento,
• Goku cifra tale hash con la propria chiave privata,
• Goku invia il messaggio a Vegeta,
• Vegeta usa la chiave pubblica di Goku per decriptare il messaggio,
• Vegeta calcola indipendentemente l’hash del documento,
• Vegeta confronta l’hash calcolato con quello decifrato.



CONCLUSIONI

Spero che questa breve guida sia stata utile a schiarirti un po’ le idee. Per qualsiasi errore o imprecisione non esitare a contattarmi.
 
  • Mi piace
Reazioni: 0xbro