Se l’algoritmo di crittografia utilizza un’unica chiave segreta Kc per la fase di codifica e per quella di decodifica, viene definito algoritmo simmetrico o a chiave comune.
Utilizzando un simile tipo di algoritmo, i due partecipanti (Alice e Bob per convenzione), possono comunicare in maniera riservata utilizzando la seguente procedura:
- Alice e Bob selezionano un comune algoritmo crittografico;
- Alice e Bob stabiliscono una comune chiave segreta (che garantisce anche l’identità dei personaggi);
- Alice, dopo aver generato il messaggio in chiaro, lo codifica utilizzando la chiave segreta;
- Alice invia il messaggio cifrato a Bob;
- Bob decodifica il messaggio utilizzando la chiave comune.
Tale schema presuppone che le due parti in gioco ripongano completa fiducia l’una nell’altra. Entrambi infatti dovranno riservare massima attenzione per non diffondere imprudentemente la chiave segreta condivisa. Un attaccante entrato in possesso della chiave Kc può, una volta intercettato il testo cifrato C, ricavare facilmente il messaggio in chiaro M.
Limitazioni degli algoritmi simmetrici
La chiave segreta deve essere condivisa sia da Alice che da Bob per avviare il processo. Generalmente uno dei due personaggi crea la chiave e successivamente la distribuisce all’altro in maniera sicura.
In alternativa possono essere utilizzati schemi che prevedono il contributo di entrambi i partecipanti alla creazione della chiave comune (per esempio Diffie-Hellman).
Indipendentemente dallo schema adottato però, la generazione di una chiave da parte di un’applicazione utente è riconducibile al problema di riuscire a generare numeri che siano effettivamente casuali (random number).
La scelta di un random number che funga da chiave Kc, rende la chiave del tutto imprevedibile e di difficile deduzione da parte di un attaccante o di un crittoanalista.
Purtroppo però non è sempre semplice (se non addirittura impossibile) riuscire a generare numeri che siano veramente casuali.
Alcune funzioni infatti generano una serie di numeri che solo apparentemente possono sembrare casuali; in realtà presentano schemi di generazione che possono risultare ridondanti o governati da funzioni matematiche, che un software specifico può facilmente rintracciare e smascherare.
Teoricamente una volta capito il meccanismo di produzione del numero casuale, è facile per un attaccante generare la stessa chiave usata da Alice e Bob.
Un secondo problema di tali algoritmi è che se la chiave risulta compromessa (rubata o dedotta) un hacker che ne entra in possesso, non solo è in grado di decodificare i messaggi scambiati, ma può anche produrre nuovi messaggi, assumendo l’identità di una delle due parti.
Questo perchè la chiave comune viene utilizzata, oltre che per assicurare la riservatezza, anche come strumento per verificare l’integrità e l’originalità dei dati.
Infine un ultimo problema riguarda il numero delle chiavi da usare: se ogni coppia di utenti deve potersi distinguere dalle altre, ogni coppia dovrà avere una diversa chiave comune. Per avere un livello di sicurezza massimo Alice non deve condividere una stessa chiave con più controparti.
Se consideriamo N come il numero di utenti di internet, per comunicare in modo sicuro ci sarebbe bisogno di un numero di chiavi pari a N(N-1)/2!
Un numero impressionante di chiavi considerando che gli utenti di internet sono circa la metà della popolazione globale (in continua crescita).
Funzionamento
Un algoritmo di crittografia, oltre che rendere complesso il lavoro degli hacker, deve essere semplice da usare per gli utenti legittimi.
Per questo tra tutte le funzioni matematiche applicabili per la generazione di funzioni crittografiche, è opportuno scegliere quelle che semplificano il calcolo di C a partire da M, nota la chiave Kc e il calcolo di M a partire da C nota Kc. La lunghezza della chiave Kc inoltre deve essere inferiore alla lunghezza del messaggio da codificare.
Se il tempo per codificare e decodificare il messaggio M, noto Kc, risulta molto inferiore al tempo necessario per risolvere l’attacco senza Kc, allora l’algoritmo viene definito computazionalmente sicuro.
In genere gli algoritmi simmetrici prevedono l’impiego di chiavi non troppo lunghe (40- 256 bit) cambiate frequentemente. Tutti gli algoritmi simmetrici utilizzati si basano su due concetti generali:
- Minimizzare, per quanto possibile, le correlazioni presenti nel messaggio originario prima di codificarlo;
- utilizzare funzioni crittografiche in grado di mascherare nel testo cifrato le correlazioni residue presenti nel messaggio originario.
Le correlazioni presenti in un testo sono legate alla naturale ridondanza di qualsiasi linguaggio utilizzato per la rappresentazione di un messaggio.
Ad ogni modo per ottenere i risultati desiderati è possibile utilizzare, anche congiuntamente, due tecniche distinte:
- Diffusion, tecnica che consiste nel dissipare le relazioni residue del messaggio originario e della chiave utilizzata distribuendole su tutto il testo cifrato.
- Confusion, tecnica che consiste nel mascherare le correlazioni residue del messaggio originario, producendo un testo cifrato risultato di operazioni complesse, ma invertibili, tra i bit del messaggio M e i bit della chiave Kc.
Un esempio di Diffusion è rappresentato dalle operazioni di permutazione bit a bit, mentre esempi di tecnica di Confusion sono l’applicazioni di alcuni operatori logici (come lo XOR) e l’adozione di funzioni matematiche elementari in algebra modulo N.
É importante notare che sebbene esistano algoritmi crittografici che possano prevedere solo l’uso di Confusion, non possono esistere casi in cui viene adottata la sola Diffusion.
É ovvio che i migliori algoritmi simmetrici sono comunque quelli che fanno un uso combinato delle due tecniche.
Tra questi ci sono DES, 3-DES, Blowfish, CAST, Twofish e altri.