Il titolo dell'
articolo originale parla chiaro:
Build your own cryptographically safe server/client protocol. L'intento del progetto è proprio quello di mostrare come sia possibile implementare un protocollo per garantire trasmissioni dati sicure.
L'intera idea si traduce poi in un applicativo, sviluppato in C++ e il cui punto di forza verte su un cospicuo utilizzo delle moderne tecniche crittografiche. Queste sono gestite attraverso due classi:
MyCryptLib e
CRijndael. La prima si preoccupa di regolare lo scambio delle chiavi e la firma digitale, mentre la seconda è relativa alla crittografia a chiave simmetrica. Com'è prassi in crittografia, viene usato un sistema ibrido che usa la più lenta crittografia a chiave asimmetrica per la condivisione della secret key tra i due utenti, per poi usare la assai più veloce crittografia a chiave simmetrica per lo scambio dei dati vero e proprio.
Il
digital signing rappresenta invece una contromisura agli attacchi
Man in the Middle: al messaggio viene allegato sia il suo hash che l'hash firmato con la chiave segreta. Il destinatario potrà così verificare l'identità del mittente riportando il secondo hash allo stato originario mediante la chiave pubblica e operando un successivo confronto tra i due hash. L'autore utilizza la crittografia in modo sicuramente coscienzioso, con un occhio di riguardo a quelle che sono le problematiche legate alle implementazioni pratiche. Viene valutato il rapporto sicurezza/prestazioni, troppe volte surclassato da quello che nel paper è giustamente definito
false sense of security: aumentare la lunghezza della chiave non attesta una sicurezza effettiva.
Vengono, inoltre, considerate altre contromisure per preservare la riservatezza dei messaggi: aggiungere un checksum (CRC16) al pacchetto dati e servirsi anche di eventi stocastici per la generazione di numeri casuali, com'è possibile apprezzare dal codice del metodo
MTCollectEntropy() (contenuto in
MyCryptLib) o dalla classe
CRanDialog. Altri elementi testimoniano che non si tratta unicamente di un semplice prototipo didattico, basti pensare alla parte di codice relativa alla crittografia a chiave asimmetrica: viene implementata una libreria multiprecisione (sebbene non eccessivamente ottimizzata) e gli algoritmi sono scelti tenendo conto degli ultimi sviluppi in materia.
Un unico appunto va alla decisione di utilizzare un test di primalità probabilistico (
Miller-Rabin), quando attualmente si dispone di un'alternativa ben più valida (AKS:
“Primes is in P we have the proof”). Ma dopotutto si tratta della sola eccezione e la preferenza dell'autore rimane quella di utilizzare sistemi piuttosto conosciuti e comuni (AES, ad esempio, è uno standard governativo USA, descritto nel documento
FIPS-197).
Un impianto sicuro, non fine a sé stesso, ma che confluisce nella realizzazione di un vero a proprio client/server
IOCP (Input/Output Completion Ports) sicuro:
IOCPS/SecureChatIOCP è infatti la classe che implementa i dettagli relativi alla comunicazione effettiva. Una nota di merito va ai numerosi test eseguiti, che evidenziano alcuni particolari dettagli utili per chi si voglia occupare di implementazioni crittografiche.