Con questo articolo ho voluto approfondire un argomento affascinante che è stato già affrontato in almeno tre articoli di ELETTRONICA OPEN SOURCE (La crittografia asimmetrica rende più sicura la vostra auto,
CODICE CRITTOGRAFICO BERCODE. Dalla genetica alla sicurezza informatica e [Bluetooth, la guida definitiva] – Concetti avanzati): la crittografia, ossia l'insieme di tutte quelle tecniche volte a rendere comprensibile un messaggio unicamente al suo destinatario. Vedremo quando è nata, come si è evoluta nel corso della storia e quali sono le sue principali applicazioni; illustreremo inoltre alcuni dei principali algoritmi crittografici. Infine, mostreremo come creare con MATLAB dei semplici programmi crittografici utilizzabili da chiunque (o quasi).
1 Introduzione
La crittologia, come indica il nome stesso che deriva dal greco e significa "discorso nascosto", è la disciplina che si occupa delle comunicazioni segrete. Essa studia le tecniche atte a garantire lo scambio di informazioni riservate su un canale di comunicazione pubblico in maniera sicura, ossia in modo tale che il messaggio inviato da un dato mittente possa raggiungere il destinatario senza il rischio che venga intercettato da terzi.
La crittologia si divide principalmente in tre parti:
- crittografia
- steganografia
- crittoanalisi
La crittografia tratta dei metodi con cui è possibile trasformare un messaggio in modo tale da renderlo incomprensibile a tutti coloro che non sono autorizzati a recepirlo. Il crittografo opera sul messaggio originale, detto anche testo in chiaro, trasformandolo in quello che si chiama testo cifrato o crittogramma; questa trasformazione prende il nome di cifratura ed è caratterizzata da un parametro segreto, che ne garantisce la sicurezza, detto chiave. Una volta individuata la chiave di un sistema di cifratura, è possibile, partendo dal crittogramma, risalire all'informazione originale, ovvero è possibile effettuare la trasformazione inversa: la decifratura.
Esistono due modi di operare sul messaggio originale per poter effettuare la trasformazione crittografica:
- suddividere il messaggio originale in blocchi di caratteri ed applicare a ciascuno di essi la trasformazione (cifratura a blocchi);
- trasformare ciascun carattere singolarmente (cifratura a stringa).
Vediamo ora un semplice metodo crittografico detto cifrario di Cesare. Consideriamo i seguenti due alfabeti:
- quello tradizionale (a, b, c, d, ..., x, y, z);
- quello ottenuto dal precedente sostituendo a ciascuna lettera in posizione i-esima quella in posizione i+2-esima (c, d, e, f, ..., z, a, b).
Dato un messaggio scritto con il 1° alfabeto, ad esempio "vado a scuola", è possibile ottenere il corrispondente crittogramma, "xcfq c uewqnc", semplicemente riscrivendo il messaggio con il 2° alfabeto.
In questo caso, la chiave è l’ampiezza dello scalamento del 2° alfabeto rispetto al 1°; infatti, se avessimo scelto di sostituire ad ogni lettera in posizione i-esima quella in posizione i+4-esima, anziché i+2-esima, il metodo per ottenere il crittogramma sarebbe rimasto invariato (semplice sostituzione di lettere), ma ovviamente il risultato sarebbe stato diverso. La chiave, pertanto, può assumere 26 valori (da 1 a 26), ovvero tanti quante sono le lettere dell’alfabeto.
Con il termine steganografia, che deriva dai vocaboli greci stèganos (nascosto) e gràfein (scrivere), si indica invece l'insieme delle tecniche che consentono di nascondere messaggi confidenziali inserendoli all’interno di un contesto (un messaggio, un'immagine, un disegno), che funge da contenitore, in grado di occultarne non solo il contenuto ma anche l'esistenza. Pertanto, mentre l'obiettivo della crittografia è quello di nascondere il contenuto di un messaggio, quello della steganografia è nascondere l'esistenza stessa del messaggio.
Il fine della crittoanalisi invece è esattamente l'opposto di quello della crittografia. Il crittoanalista è colui che, intercettando di nascosto, sul canale di comunicazione, il crittogramma inviato da un mittente ad un destinatario, tenta di forzare il sistema di cifratura per risalire al messaggio originale.
2 Cenni storici
La crittografia ha origini antichissime; infatti, praticamente da sempre gli uomini hanno avvertito la necessità di realizzare crittogrammi, ad esempio per motivi di ordine bellico (rendere i messaggi strategici incomprensibili ai propri nemici).
Il più antico esempio di utilizzo della crittografia è stato rinvenuto in alcuni geroglifici egiziani risalenti a più di 4500 anni fa. Su alcune tavolette di argilla mesopotamiche sono state trovate incisioni cifrate, palesemente fatte con l'intento di proteggere le informazioni riportate in esse. Altri esempi di metodi crittografici antichi sono i cifrari monoalfabetici ebraici del VI secolo a.C., come il cifrario Atbash, usato anche per cifrare alcuni nomi nella Bibbia. Anche gli antichi Greci e gli spartani sembra avessero conoscenze di crittografia, come dimostrerebbe il loro utilizzo della scitala. Per quanto riguarda invece i Romani, si ha la certezza che conoscessero la crittografia: l'esempio più noto è il cifrario di Cesare, di cui abbiamo già parlato.
La crittografia moderna inizia con la pubblicazione del trattato De Cifris di Leon Battista Alberti, intorno al 1467, nel quale egli descrisse anche la sua invenzione: il disco cifrante, che rappresenta il primo sistema di cifratura polialfabetica. In seguito, si occuparono di cifratura polialfabetica anche il tedesco Johann Heidenberg, l'italiano Giovan Battista Bellaso e il francese Blaise de Vigenère. Il sistema crittografico di quest'ultimo, il cifrario di Vigenère, venne considerato indecifrabile per tre secoli, finché, nel 1863, il colonnello prussiano Friedrich Kasiski non pubblicò un metodo crittoanalitico per decifrarlo: il metodo Kasiski.
Tra il 19° e il 20° secolo, l'invenzione del telegrafo, del telefono e della radio diede un impulso allo sviluppo della crittografia. Infatti, essendo le comunicazioni via radio e telefoniche esposte all'intercettazione da parte del "nemico", occorre cifrare tutti i messaggi riservati trasmessi per radio e per telefono.
Nel 1883, venne pubblicato il saggio Cryptographie Militaire di Auguste Kerckhoffs, nel quale egli espone i principi che costituiscono ancora oggi un punto di riferimento dei crittografi. Uno di questi è il famoso principio di Kerckhoffs: «La sicurezza di un crittosistema non deve dipendere dal tener celato il crittoalgoritmo. La sicurezza dipenderà solo dal tener celata la chiave.». In altre parole, il sistema deve rimanere sicuro anche nell'ipotesi in cui venga scoperto l'algoritmo di crittazione, che quindi può anche essere di pubblico dominio; l'importante è che rimanga segreta la chiave. Il principio è stato riformulato (o forse indipendentemente formulato) da Claude Shannon (padre della teoria dell'informazione) nel seguente modo: «Un sistema dovrebbe essere progettato sotto l'assunzione che il nemico guadagnerà immediatamente familiarità con esso.» (massima di Shannon).
Nel 1918, Gilbert Vernam perfezionò il metodo di Vigenère proponendo l'idea di usare chiavi segrete casuali lunghe almeno quanto il messaggio. Successivamente, nel 1949, Claude Shannon, nel suo articolo La teoria della comunicazione nei sistemi crittografici, dimostrò matematicamente che questo è l'unico metodo crittografico totalmente sicuro.
Nella prima metà del 20° secolo, iniziarono a diffondersi macchine cifranti a rotori realizzate sul modello del cilindro di Jefferson. La più famosa di esse è Enigma, inventata nel 1918 dal tedesco Arthur Scherbius e successivamente perfezionata. Per la facilità d'uso e la presunta indecifrabilità, fu ampiamente utilizzata dalle forze armate tedesche, dal 1925 fino alla fine della seconda guerra mondiale. Furono molti gli esperti che a lungo si prodigarono per violarla, e, nonostante fosse ritenuta indecifrabile, alcuni ci riuscirono; i matematici polacchi Marian Rejewski, Jerzy Różycki e Henryk Zygalski furono i primi a riuscirci, nel 1932.
Nella seconda metà del 20° secolo, l'invenzione del computer cambiò in modo radicale lo scenario: tutti i vecchi sistemi crittografici diventarono repentinamente obsoleti e inefficaci, a causa della facilità con cui possono essere forzati grazie ad esso. Inoltre, la necessità di comunicare informazioni in modo riservato, e quindi di cifrare i messaggi, si è estesa ben al di là dell'ambito diplomatico-militare. Oggi, tutti noi, senza rendercene conto, usufruiamo di tecniche crittografiche, ad esempio quando:
- preleviamo denaro con il bancomat,
- effettuiamo acquisti su internet con la carta di credito,
- telefoniamo con il cellulare.
È inevitabile, in questo contesto, la nascita di cifrari completamente nuovi, come il DES della IBM e l'RSA, capostipite dei cifrari a chiave pubblica.
3 Crittografia simmetrica e asimmetrica
La crittografia simmetrica, o crittografia a chiave privata, è caratterizzata dall'utilizzo di una stessa chiave condivisa sia per l'operazione di cifratura che per quella di decifratura; in altri termini, mittente e destinatario dei messaggi segreti devono preventivamente concordare la chiave, oltre naturalmente al metodo crittografico. La necessità di comunicarsi la chiave segreta è il punto debole di questo tipo di crittografia: o ci si incontra di persona in un luogo riservato, o si deve utilizzare un canale di comunicazione assolutamente sicuro (ma, se si disponesse di un simile canale, la crittografia non servirebbe).
Alcuni esempi di cifratura simmetrica sono: il cifrario di Cesare, il cifrario di Vigénère, il DES e l'AES. [...]
ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 3345 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.
Ultimamente si sta rinforzando la crittografia quantistica che sfrutta il principio di Heisenberg. A seconda dello stato di polarizzazione dei fotoni si puo’ capire se sono stati intercettati o meno con conseguente modifica della chiave crittografica.
Interessantissimo..
Dalla “Definizione del Principio di Indeterminazione di Heisenberg”
Il fotone, dotato di massa ed energia, interagendo con l’elettrone, trasmette ad esso energia, modificandone velocità e direzione. Se, per evitare questo problema, scegliamo di usare un fotone a bassa energia, la lunghezza dell’onda a esso associata è così grande da rendere impossibile la determinazione della posizione….
Davvero un bell’articolo… ideale per avere una breve panoramica senza coinvolgere troppi formalismi accademici… la parte sulla codifica ascii e somma binaria non è lo schema One Time Pad con l’operazione di XOR bit a bit?
La ringrazio. Sì, quell’esempio (cifrare “CIAO” usando come chiave “LUCA”) rappresenta un modo di applicare la tecnica OTP (https://it.wikipedia.org/wiki/Cifrario_di_Vernam) ricorrendo alla codifica ASCII.
La ringrazio per il chiarimento. Stavo pensando ad un esperimento: tramite arduino, un sensore di temperatura e un sensore di suoni, sarebbe possibile costruire, in teoria, un generatore di numeri casuali? O sarebbero pseudo casuali? So che ci sono soluzioni ben efficienti, ma si tratta solo di un esperimento didattico….
La cosa è fattibile, forse sarebbe più orientato verso un “pseudo”. Come vorresti gestire i due sensori ?
Questa domanda dovrebbe porla agli articolisti di EOS esperti di elettronica (fortunatamente Maurizio ha già risposto). Se, come credo di aver capito, tali numeri sono generati da stimoli esterni, come i suoni o la temperatura, allora sono casuali non pseudo-casuali (https://it.wikipedia.org/wiki/Numeri_pseudo-casuali).
Qualsiasi generazione di numeri casuali, fatta da macchine, anche a basso livello se utilizziamo microcontrollori, non può che essere pseudo-casuale. Infatti ogni algoritmo, anche con mappe di XOR ed altri stratagemmi, al reset, genererà di nuovo la stessa sequenza di numeri. Ovviamente si può “giocare” sui grandi numeri ed avere sequenze infinite, anzi pesudo-infinite.
Un semplice metodo per creare numeri casuali invece è quello di abbinare all’algoritmo un intervento esterno che crei appunto la casualità. Nella realizzazione di una chiave elettronica a microcontrollore anni fa, utilizzammo un tasto da far premere all’utente per generare il codice. Alla pressione del tasto si attivava un contatore in microsecondi che si fermava poi al rilascio del tasto. Questo generava un numero che diventava il primario dell’algoritmo di pseudo-random.
Un’altra soluzione molto utilizzata è quella del rumore, quindi utilizzare un ingresso analogico del micro per “leggere” i disturbi, che sono appunto random.
Grazie a tutti per le risposte. Infatti l’idea mi è venuta mentre leggevo un argomento di teoria dell’informazione: i canali. Ho letto che in un canale rumoroso (soggetto ad errori di trasmissione), se la probabilitá che il bit vari da zero a uno (o viceversa) è pari o prossima ad 1/2, allora il canale si comporta come un generatore di numeri casuali… ho pensato agli errori che generava il mio arduino con un modulo bluetooth collegato male e mi è venuta l’idea dell’esperimento…. ma in effetti di un generatore automatico di numeri veramente casuali ne parlavano solo in un articolo di fisica quantistica con i fotoni…
In quest’ultimo caso si parla di crittografia quantistica. Come suggerisce Emanuele una possibile idea è sfruttare il rumore termico con statistica gaussiana o anche l’effetto fotoelettrico correlato a sua volta con un amplificatore e A/D.
Ho capito quindi la casualitá deve essere generata da un evento naturale esterno e il microcontrollore deve solo convertire in bit…. quindi in teoria si potrebbero catturare gli ultrasuoni dell’ambiente, o sbaglio? Certo sarebbe una “casualitá scarsa” perchè l’utente può fare rumore di proposito ed influenzare il risultato….
Praticamente si, dovresti correlare il segnale o comunque escludere i casi in cui si verificano eventi “rumorosi”.
Inizia ad andare un pò troppo oltre le mie capacitá… per ora meglio lasciare questo lavoro accademico a qualcuno più bravo di me.. qualora mi dovesse servire un generatore hardware di numeri casuali prenderò in considerazione l’idea del pulsante/timer proposta da emanuele…
Ps: ma un forum di eos dove discutere di vari argomenti per non andare off topic con gli articoli?