Algoritmi di cifratura proprietari

SOMMARIO

Si discute e si rende accessibile algoritmi, dai quali derivare codici di cifratura e decifratura di elevata sicurezza e assolutamente proprietari, per essere implementati su un ampia gamma di linguaggi (PHP per dialogo con portali Web, C++ per applicazioni su ATMEGA328, ma anche Assembler per applicazione su microcontrollori elementari e dai consumi minimi).
Fra le applicazioni, per le quali sono stati sviluppati specifici progetti: programmazione cifrata di RFID card, comunicazione RF cifrata per telecomandi, dialogo in sicurezza fra microcontrollori e portali Web.

GENERALITA'

Si sono presi in esame varie tecniche di cifratura. Fra queste, la famiglia di algoritmi noti con la sigla RC5, è quella che meglio si adatta ai criteri esposti nel sommario. E' fuori dallo scopo di questo post discutere nel dettaglio la teoria sottostante all'algoritmo RC5, inventato da Ronald Rivest nel 1995, del MIT (Massachusetts Institute of Technology -Laboratory of Computer Science).
Ci limiteremo ad elencarne le principali caratteristiche, come emergono dalla letteratura specializzata, a cui rimandiamo per approfondimenti:

  • è un cifrario simmetrico, cioè sia nella cifratura che nella decifratura viene utilizzata la stessa chiave privata;
  • è idoneo ad implementazioni sia hardware che software: RC5 usa, infatti, solo operazioni elementari, eseguite dai comuni microprocessori;
  • è veloce, e quindi word-oriented: le operazioni sono eseguite su blocchi di dimensioni corrispondenti alla parola macchina;
  • è adattabile a processori con differenti lunghezze di parola: se, ad esempio, abbiamo a disposizione un processore a 64 bit, RC5 è in grado di sfruttare l'intera lunghezza della parola;
  • ha una struttura iterativa con un numero variabile di iterazioni;
  • ha una chiave crittografica a lunghezza variabile: ciò permette all'utente di scegliere il livello di sicurezza desiderato per la propria applicazione;
  • ha una richiesta di memoria limitata, pertanto può essere facilmente implementato su smart card o altri dispositivi con memoria piccola;
  • fornisce una elevata sicurezza quando vengono scelti i valori dei parametri in modo opportuno;

LUNGHEZZA DELL'UNITA' ELEMENTARE DI CIFRATURA

Una prima decisione da prendere è definire la lunghezza (in numero di bit, nel seguito U) dell'unità di informazione da cifrare e successivamente decifrare in modo univoco. Per esempio se si volesse cifrare il contenuto di un blocco alla volta di una RFID Card Mifare Classic da 1kbyte, l'unità minima scelta sarebbe di 16*8bit = 128 bit.
Più avanti, saranno forniti tutti gli strumenti per creare codici di cifratura per unità di informazione da 64, 128 e 256 bit (che dovrebbero coprire un'amplissima gamma di applicazioni).

NUMERO DI ITERAZIONI

Come accennato precedentemente, l'algoritmo ha una struttura iterativa. Per ogni iterazione necessita di una coppia di chiavi private (nel seguito vettore K), lunghe ciascuna la metà (nel seguito W) della lunghezza dell'unità U, note sia al dispositivo cifratore, sia al dispositivo decifratore.
All'aumentare del numero delle iterazioni (nel seguito R) aumenta la sicurezza della cifratura (diventando esponenzialmente onerosi i possibili metodi di forza bruta di decifratura, ma aumenta anche il tempo di elaborazione delle operazioni di cifratura e decifratura ed il volume di memoria impegnata sia sul dispositivo cifratore, sia sul dispositivo decifratore. Occorre scegliere, a seconda dell'applicazione, il bilancio ottimale fra le esigenze di sicurezza, velocità e impegno di memoria.
Come risulta dalla letteratura sull'argomento, un massimo di 32 iterazioni (come previsto dalle soluzioni proposte più avanti) rappresenta un'eccellente margine di sicurezza da ogni tentativo di decifratura fraudolento (specie per lunghezze U di 128 e 256 bit).

CHIAVI PRIVATE

Come si intuisce l'elemento cruciale dell'algoritmo sono le coppie di chiavi private del vettore K. Se si vogliono eseguire 32 iterazioni occorre disporre di 33 coppie di chiavi private (si conta anche una iterazione zero), cioè in tutto 66 chiavi private.
Senza entrare nel dettaglio tecnico, gli elementi del vettore K non possono essere scelti casualmente, ma devono soddisfare alcune proprietà (una sorta di "ortogonalità"). Per fortuna, l'inventore di RC5 ha indicato un metodo per definire infiniti vettori K dalle proprietà giuste, a partire da una password di lunghezza qualunque (naturalmente, come è facile intuire, più è lunga meglio è). La lunghezza massima necessaria per la password di partenza è (I+1)*2*W. L'operazione di passaggio da una password, segreta e casuale, di partenza alle chiavi private del vettore K è descritta in letteratura come Espansione delle chiavi private