Due parole sulla sicurezza degli algoritmi crittografici.

Questo è un micro sunto da ricordare quando si progetta un nuovo software oppure quando si valutano degli applicativi sviluppati da terzi.

 

La robustezza di un sistema di cifratura a chiave simmetrica è dovuto a due fattori : la robustezza dell'algoritmo e la lunghezza delle chiavi. La robustezza di un algoritmo non è provato in modo analitico ma, al contrario, è dato dalla non violabilità dell'algoritmo stesso per molti anni da parte della comunità di cryptoanalisti.A questa regola esiste però una sola eccezione : One-time pad. Questa tecnica prevede che la chiave utilizzata sia lunga quanto il plain text, che sia un numero random e infine tale chiave deve essere utilizzata solo una volta. Se la chiave generata non è veramente random anche questa tecnica può essere violata come avvenne per il progetto VENONA dove gli Stati Uniti furono in grado, per decenni, di decifrare vari messaggi spia sovietici perchè durante la seconda guerra mondiale i Sovietici inziarono ad riutilizzare le stesse chiavi.

Gli algoritmi a chiave simmetrica si dividono in 2 grandi famigli : Stream Cipher e Block Cipher. Gli algoritmi Stream Chiper, usati principalmente nelle telecomunicazioni., cifrano carattere per carattere di un plain text rendendo più veloci e meno complessi da realizzare con hardware. I Block cipher invece cifrano a blocchi il plain text. La lunghezza delle chiavi è importante perchè se l’algoritmo di cifratura è "sicuro" un attacker generalmente deve utilizzare il brute force attack per risalire al plain text.Al contrario se l'algoritmo non è sicuro è possibile che alcune proprietà matematiche possano essere esposte e quindi utilizzate per violare il codice nonostante la chiave simmetrica sia molto grande. Questa infelice situazione capita spesso quando si cerca di modificare un algoritmo standard “per renderlo più sicuro”.

Se una chiave simmetrica è lunga k bits allora il numero totale di combinazioni è dato da 2^k. Quindi maggiore è la chiave maggiore è il numero di combinazioni. Per k = 40 il numero di chiavi è pari a 2^40. Il tempo di break per un codice codificato con una chiave di queste dimensioni è di poche ore per un centinaio di computer in rete. Per k = 56, utilizzato dall’algoritmo DES, il tempo di break era di qualche mese. Già da qualche anno è stato reso noto che la Electronic Frontier Foundation ha realizzato una macchina specializzata nella ricerca di chiavi crittografiche DES riuscendo a violare la  cifratura in soli 3 giorni. Infine per k = 128 il tempo di break per un codice codificato con una chiava di queste dimensioni è di 2^128 = Circa 10^25 anni (l'universo ha 10^10 anni).

Anche la natura dei dati potrebbe rappresentare un punto di vulnerabilità nel nostro sistema di crittografia. Molti plaintext, ad esempio, iniziano con gli stessi dati: le lettere commerciali, gli header dei files di word o di un eseguibile. Un caso a parte, invece, lo occupano i numeri di carta di credito che introducono due punti deboli. Il primo causato dalla conoscenza delle iniziali di questi numeri : tutte le carte VISA iniziano con 4, Mastercard con numeri da 51 a 55 e Amex da 34 a 37. Il secondo punto debole, invece,  è dovuto alla lunghezza fissa e alla relazione matematica che lega tali numeri (modulo10)

Per risolvere questa serie di problemi sono stati introdotti gli "Initialization Vectors". Gli IV (generalmente utilizzati in concomitanza con i block cipher in CBC mode) sono un blocco di bits random che viene aggiunto all'inizio del plaintext prima dell'encryption. Questo permette di propagare e di mascherare tutte le regolarità del ciphertext. Le CryptoAPI, le classi del framework .NET e CAPICOM, si occupano di gestire internamente gli IV.

Specificando “high encryption” si indica la dimensione delle chiavi simmetriche a 128 bits. Viceversa, quando si indicano le chiavi asimmetriche per encryption o firma digitale la lunghezza delle chiavi è maggiore (512-1024-2048 bits o supp). Generalmente algoritmi a chiave pubblica/privata devono utilizzare chiavi a lunghezza superiore rispetto a quelle usate negli algoritmi a chiave simmetrica per ottenere lo stesso grado di sicurezza.  

 

 

BASTA CON QUESTO DES!!!!

DES è un algoritmo di tipo "block cipher" e cifra a blocchi di 64bits. La chiave è di 56 bits ma viene espressa a 64bits utilizzando ogni ottavo bit come parity checking.

Semplificando, l'algoritmo utilizza due tecniche base per l'encryption chiamati : confusion e diffusion;ovvero una sostituzione seguita da una permutazione (chiamato round). DES ha 16 rounds ovvero applica la stessa combinazione di tecniche sul plaintext 16 volte. Dopo la prima permutazione il blocco è diviso in due parti da 32bits (parte destra e sinistra). In seguito avvengono 16 rounds in cui i dati vengono combinati con la chiave. Dopo il 16 round la parte destra e la parte sinistra vengono riunite e dopo l'ultima permutazione (che è l'inverso di quella iniziale) si ha il risulatato dell'algoritmo.

DES è stato "matematicamente" ideato dalla NSA e successivamente implementato da IBM nel 1976. Da 20 anni a questa parte è stato ipotizzato che l'algoritmo contenesse delle "back doors" che permettessero a NSA di decifrare facilmente i dati cifrati con DES. Pur non avendo mai dimostrato la presenza di tali back- door  nell’ algoritmo fu ideato TRIPLE-DES che matematicamente non offre alcuna sicurezza aggiuntiva rispetto a DES, ma quantomeno dovrebbe eliminare eventuali back-doors.

 

Quando usare DES? Solo quando c'è necessità di garantire la compatibilità con vecchi sistemi. In tutti gli altri casi... BASTA DES !!! Al contrario il successore di DES è il nuovo algoritmo Rijndael (ideato da Joan Deamen e Vincent Rijmen) chiamato anche AES (Advanced Encryption Standard) algoritmo a chiave variabile di 128,192 o 256 bits.

 

Raccomandazioni se non si può progettare per WIndows Server 2008 e Windows Vista come baseline:

 

Encryption : Uso di AES-128 o superiore.

Firma Digitale : RSA con chiavi a 2048 o superiori.

Hashing : SHA-256 o SHA-512. Se poi avete solo 160 bit a disposizione è preferibile utilizzare SHA-256 e prelevare i primi 160 bits rispetto all'uso di SHA1.

 

 

 

 

--Mario