|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
da Linux Gazette #46 |
Usare Java e Linux per vincere la sfida al DES |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||
L'ultima versione riveduta e corretta da F. P. Nasuti la potete trovare sulla Linux Gazette Edizione Italiana |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Abstract
1. Introduzione
2. Attacchi alla crittografia
- Attacco solo sul testo cifrato: il crittoanalista ha solo uno o più
esempi di testi cifrati che usano la stessa chiave e cerca di scovare il
testo in chiaro e la chiave usata.
3. Robustezza della chiave
La robustezza della chiave dipende molto dalla capacità di calcolo
disponibile. Con una più grande capacità di calcolo, minore
sarà il tempo necessario a violare un sistema crittografico.
D'altra parte, se la potenza di calcolo aumenta, lo stesso farà
la grandezza della chiave e conseguentemente la robustezza degli algoritmi
crittografici. Ma, sembra chiaro, la chiave che era considerata sicura
due o tre anni fa non lo è più oggi.
4. DES - Data Encryption Standard
1. Alto livello di sicurezza
Nel 1974, IBM rispose alla richiesta con un algoritmo chiamato LUCIFER (più tardi fu chiamato DEA - Data Encryption Algorithm o DES). Infine nel 1976 il DES fu adottato come standard negli Stati Uniti. Il DES ha retto finora, per venti anni come standard internazionale.
Benché il DES alla fine stia mostrando i segni del tempo, è
ancora considerato come uno dei più forti ed efficienti algoritmi
nel mondo.
4.1. Come funziona il DES
Il DES è un algoritmo a chiave simmetrica e usa la stessa chiave per il processo di cifratura e decifrazione. La grandezza della chiave è 56 bits. Il DES usa una chiave di 56 bits (la chiave è normalmente rappresentata da 64 bits, e ogni otto bits uno è usato per il controllo di parità). Al suo livello più semplice, l'algoritmo è basato su due semplici principi: diffusione e confusione. Il DES applica sostituzioni seguite da permutazioni a un testo in chiaro, in base a una data chiave. Questo processo è chiamato round (ciclo) e il DES lo applica 16 volte. Il seguente schema rappresenta un più dettagliato sguardo al DES.
Una più ampia spiegazione non è lo scopo di questo articolo.
Maggiori informazioni possono essere trovate in qualunque buon libro sulla
crittografia.
5. Le sfide crittografiche della RSA Labs
1. La sfida della RSA sulla fattorizzazione
5.1. La sfida al DES
Due volte all'anno, il 13 gennaio e il 13 giugno, alle 9:00 antimeridiane
del fuso orario del Pacifico, una nuova gara sarà pubblicata sulla
homepage della RSA. La gara sarà composta dal testo cifrato prodotto
col DES, cifrando qualche messaggio sconosciuto che ha un titolo stabilito
e conosciuto. Il primo a scoprire la chiave vince e l'ammontare del premio
dipenderà dalla velocità con cui la chiave è stata
trovata.
5.2. I dettagli della sfida al DES
L'obiettivo di ogni gara per i partecipanti è scoprire
la chiave segreta generata in maniera casuale e che è stata usata
nella cifratura in un tempo più veloce di quello richiesto dalla
sfida precedente.
6. Violare il DES
Violare il DES è uno di questi problemi. E' necessario usare una potenza computazionale piuttosto ampia. Anche se noi consideriamo una chiave a 56 bit, è un compito davvero difficile da assolvere. La migliore strategia per violare il DES è realizzare una attacco
con forza bruta. Questo significa dover testare tutte le possibili chiavi
e analizzare e comparare i risultati. Se noi consideriamo una chiave a
56 bit, significa che avremo circa 256 possibili combinazioni. Anche se
con l'odierna comune potenza computazionale lo si fa in un momento.
7. Architettura generale
Il DES può essere davvero semplicemente implementato in un chip hardware, e molti di questi chip possono essere usati per violare il DES. Uno dei più ovvi vantaggi di questo approccio è la potenza di elaborazione che ne risulta. D'altro canto, però, uno dei problemi che risulta da questa architettura è il suo grande costo. Un altro possibile approccio per una architettura generale è usare un attacco software. Uno dei problemi di questo tipo di architettura è la sua potenza di elaborazione. Se solo un computer è usato, la potenza di elaborazione ottenuta è abbastanza deludente. Questo tipo di attacco è davvero facile da implementare ed è anche meno costoso del precedente. Comunque, i risultati più interessanti possono essere raggiunti
con un attacco ad elaborazione distribuita, basato sulla aumentata potenza
di elaborazione che scaturisce dall'unione di più computer.
8. Elaborazione distribuita
L'elaborazione distribuita è diventato un settore di studio quando l'hardware si sviluppò dal mainframe (computer centrale), dove tutti condividono le risorse di una singola macchina, al minicomputer. Il minicomputer soddisfa le esigenze di due persone (o programmi) per lavorare insieme o condividere risorse quando sono su macchine diverse. Coordinare questo lavoro, o dare accesso a queste risorse, è l'obiettivo della elaborazione distribuita. L'interesse nell'elaborazione distribuita è incrementato con
l'avvento delle workstation individuali e dei PC connessi in rete, principalmente
con la diffusione di Internet. Siccome queste sono macchine per singoli
utenti, occorre condividere le informazioni, le risorse di elaborazione
o i dati in modo che diventino disponibili appena giunge il lavoro da svolgere.
9. Architettura specifica
Comunque, alcune considerazioni dovrebbero essere fatte. Per esempio, qual è la migliore configurazione e quali sono i suoi limiti. Nessun dubbio che, per approfittare della disponibilità della potenza di elaborazione su Internet la migliore soluzione è implementare una tipica architettura client-server. Un server per distribuire le chiavi, i client per fare il lavoro più impegnativo: testare tutte le chiavi e controllare i risultati.
9.1. Considerazioni
L'uso di un server centrale pone qualche difficoltà. Pure prevedendo una sola mancanza, c'è anche il pericolo di congestione della rete e collasso. Una varietà di precauzioni dovrebbe essere tenuta in conto. I
server possono essere connessi in una gerarchia, o replicati se le risorse
lo permettono, così che i casi di fallimento sono meno catastrofici.
In più, i client possono autotestarsi per fornire qualche livello
di sicurezza contro i malfunzionamenti e i server posson cautelarsi da
client maligni poichè possono condurre dei test più specifici
sui client. I server possono avere dai client un resoconto sui problemi
provocati dai server che possono essere verificati a basso costo. Alternativamente
un client potrebbe calcolare una somma di controllo su tutte le soluzioni
tentate nel campo esaminato e un altro client della stessa architettura
potrebbe verificare questo.
9.2. Funzionalità
L'idea base è avere un server centrale, che deve compiere semplici compiti, come aggiungere nuovi client alla gara, distribuire nuovi gruppi di chiavi e verificare e aggiornare i risultati. Il server stesso fa solo il lavoro più facile nel sistema. Il lavoro più pesante, cioè provare tutte le possibili chiavi e verificare i risultati, è fatto dal gruppo di client. Tanti più client ha il sistema, più veloce sarà la verifica di tutte le chiavi possibili. Le funzionalità del server possono essere facilmente riepilogate nel seguente schema.
Le funzionalità del client possono essere riepilogate così: Fondamentalmente, la principale funzionalità del software client è testare tutte le possibili chiavi distribuite dal server e quindi analizzare il risultato e testare se la chiave è giusta o meno. Se la chiave è giusta, il client la comunica al server e manda una nota al server per indicare che ha trovato la chiave.
10. Implementazione
Per implementare tale architettura, qualche importante decisione deve
essere presa, come scegliere la migliore piattaforma di sviluppo e i mezzi
giusti.
10.1. Linux
Questo sistema operativo è sotto licenza pubblica GNU ed è liberamente distribuibile provvisto di sorgenti nella forma di distribuzioni oppure il sorgente è almeno reso disponibile al destinatario. Linux gira su processori Intel 386 e successivi che sono capaci di usare la modalità protetta 386. Per una implementazione minima occorrono circa 10-15 Megabyte di spazio su disco e 8 Mega di RAM. E' possibile che giri in 4, ma si consideri 8 un minimo ragionevole per l'installazione basata sul testo. Per usare X (il sistema a finestra di Unix) con una ragionevole efficienza, occorreranno circa 16 Mega di RAM come minimo (300 M di spazio su disco). Il sistema può compilare e girare programmi Unix rispettosi delle specifiche Posix, come programmi Dos attraverso DosEmu. Le applicazioni Windows hanno successo limitato girando su Linux attraverso l'uso di Wine (un emulatore di Windows). Benché Linux è di solito riferito a macchine 386/486/Pentium,
gira anche su, o è stato da poco portato su, altre architetture
(per esempio DEC Alpha, Sun SPARC, MIPS, PowerPC, and PowerMAC).
10.2. Java
Al primo sguardo assomiglia al C e C++, ma sotto sotto è differente. Java è un linguaggio sia compilato che interpretato. Il suo codice sorgente è compilato in una forma universale - codice macchina per una macchina virtuale - che può essere facilmente portato attraverso Internet e interpretato e fatto girare su molte piattaforme. Comparato ad altri linguaggi Java è molto più semplice, robusto ed economicamente valido. Permette a una applicazione di essere sviluppata con un minimo di debugging ed è istantaneamente portatile su molti sistemi operativi. Comparato ad altre soluzioni Internet, Java offre performance ineguagliate e versatilità minimizzando il carico dei server web distribuendo il processo che deve girare alle macchine client. Java possiede anche una serie di API addizionali che permettono lo sviluppo
veloce di applicazioni complesse. Include ad esempio API per Networking,
Metodi di Comunicazione Distribuita, Connettività ai Database e
supporto alla Crittografia.
10.2.1. Java RMI
A causa della tecnologia Java RMI, gli sviluppatori ora possono: 1. Creare facilmente potenti applicazioni distribuite e servizi di rete
per ambienti Java e non-Java.
10.2.2. JDBC
JDBC in realtà ha due livelli di interfaccie. In aggiunta all'interfaccia principale, c'è anche una API per un JDBC "manager" che comunica con i "driver" dei database individuali, il ponte JDBC-ODBC se necessario, e una driver per la rete JDBC quando il programma Java sta girando in un ambiente di rete (cioè, sta accedendo a un database remoto). Quando accede a un database remoto, JDBC si avvantaggia dello schema di indirizzamento dei file di Internet e un nome di file assomiglia molto a un indirizzo di pagina Web (URL). Per esempio, un comando JAVA SQL può identificare il database come: jdbc:odbc://www.somecompany.com:400/databasefile JDBC specifica un gruppo di classi di programmazione orientata agli
oggetti da usare nella costruzione della richieste SQL. Un gruppo aggiuntivo
di classi descrive il JDBC driver API. Il più comune tipo di dati
SQL, sono mappati con i tipi di dati Java, e sono supportati. L'API provvede
alla specifica implementazione di supporto per richieste di transazione
e la capacità di consegnare o ritornare indietro all'inizio della
transazione.
10.2.3. JCE
La JCE è un gruppo di API e implementazioni di funzionalità crittografiche, incluse cifratura simmetrica, asimmetrica, di flusso e a blocchi. Essa integra le funzionalità di sicurezza del carente JDK 1.1.x / 1.2, che include firme digitali (DSA) e raccolta messaggi (MD5, SHA). L'architettura della JCE segue gli stessi principi di design trovati
altrove nella JCA.
10.2.4. PostgreSQL
Nei correnti sistemi commerciali, i tipi possibili includono numeri a virgola mobile, interi, stringhe di caratteri, valute e date. E' comunemente riconosciuto che questo modello è inadeguato per le future applicazioni di elaborazione dati. Il modello relazionale sostuì con successo i vecchi modelli in parte per la sua spartana semplicità. Comunque, come già detto, questa semplicità spesso rende molto difficile l'implementazione di certe applicazioni. Postgres offre una sostanziale potenza aggiuntiva incorporando i seguenti quattro concetti base in modo che gli utenti possano facilmente estendere il sistema: - classi
Altre caratteristiche forniscono potenza aggiuntiva e flessibilità: 1. legami di integrita' referenziale
Queste caratteristiche pongono Postgres nella categoria dei database relazionali e a oggetti. Nota che questo è diverso da quelli detti anche orientati agli oggetti, che in generale non sono adatti al supporto dei linguaggi dei tradizionali database relazionali. Così, benché Postgres ha qualche caratteristica orientata agli oggetti, è fermamente nel mondo dei database relazionali. Infatti, alcuni database commerciali hanno recentemente incluso caratteristiche a cui Postgres ha aperto la strada. PostgreSQL è quindi un sofisticato DBMS relazionale e a oggetti,
supportando quasi tutti i costrutti SQL, includendo transazioni, sottoselezioni,
tipi e funzioni definiti dall'utente. E' il più avanzato database
open-source disponibile dovunque.
10.3. Mettiamo tutto insieme
La piattaforma di sviluppo scelta è Linux, per la sua caratteristica di buon sistema di sviluppo. Il linguaggio usato sarà Java, per la sua semplicità. Dal lato server, una delle più importanti cose da definire è il database server. Questo database è abbastanza importante perché immagazzinerà importanti informazioni sulla gara, come dettagliate informazioni sui client della gara, il gruppo di chiavi che ogni client sta attualmente processando, quale è stata l'ultima chiave a essere stata distribuita tra le altre cose. Il database sarà sviluppato usando un database free a oggetti e relazionale chiamato PostgreSQL. Il server software, totalmente sviluppato in Java, si interfaccerà con i database attraverso le API JDBC.
Una delle principali funzioni di un server è aspettare e ricevere richieste da un client. Il server delle chiavi DES ha lo stesso comportamento. Il server parte, attende e processa le richieste. Per comunicare con i client è necessario avere qualche funzionalità di rete. In questo caso, il server, riceve richieste dai client attraverso RMI. RMI è stato scelto, perché aggiunge uno strato di astrazione tra il programma Java e la complessità della rete. Dal lato client, una delle più importanti cose da implementare è la funzionalità crittografica. Il software client dovrebbe essere capace di usare e processare l'algoritmo DES. Poiché il software client conoscerà parte del testo in chiaro e l'intero messaggio segreto, deve essere capace di cercare di decifrare il messaggio segreto usando una chiave fornita dal server e comparare i risultati con il testo parziale in chiaro. Siccome è nel server, questo software client è totalmente
implementato in Java. Questo permette che un largo numero di differenti
computer e piattaforme si unisca rapidamente alla gara, allargando considerevolmente
la potenza di elaborazione per trovare il più rapidamente possibile
una soluzione per il problema proposto, trovare la corretta chiave DES.
11. Conclusioni
Linux e Java sono due dei mezzi che permettono la facile creazione di
tale architettura e renderla disponibile a quasi tutti. Linux, siccome
è un sistema operativo semplice, veloce, potente e free che permette
di costruire potenti capacità server. Java, perchè è
facile da imparare e il suo essere indipendente dalla architettura permette
uno sviluppo veloce per una gran numero di piattaforme diverse.
Note
[2] Schneier, Bruce, "Applied Cryptography - Protocols, Algorithms and Source code in C", John Wiley & sons, Inc., 1996 [3] "DES Challenge II", RSA Laboratories, RSA Data Security,
http://www.rsa.com/rsalabs/des2,
1997
Copyright © 1999, Carlos Serrao
|