Feb 29 2004

Il cifrario DES


by tonycrypt

DES sta per Data Encryption Standard ed e’ un cifratore a blocco iterativo sviluppato alla IBM e definito dal governo degli Stati Uniti come standard ufficiale nel 1977. La dimensione dei blocchi DES e’ di 64 bit, ed usa una chiave a 56 bit (16 cicli) durante la cifratura (gli altri 8 bit servono per la correzione degli errori). Questo algoritmo è stato violato soltanto grazie all’enorme potenza di calcolo dei moderni elaboratori. Il 17 luglio 1998, l’EFF (Electronic Frontier Foundation) ha realizzato una scheda multiprocessore in grado di violare un sistema DES a 64 bit in meno di tre giorni, generando tutte le 2^56 chiavi possibili. Questa scheda è basata sull’utilizzo di alcuni chip chiamati “Deep Crack”, estremamente veloci perchè presentano tutte le operazioni da eseguire già implementate sull’hardware.

Potete scaricare il codice sorgente del DES cliccando su DES.zip.


Feb 22 2004

RC4


by tonycrypt

RC4 è un algoritmo realizzato da RSA Data Security, Inc. Era rimasto protetto dal segreto commerciale finchè qualcuno spedì il codice sorgente di un algoritmo “equivalente” a RC4 nelle Usenet News. L’algoritmo è molto veloce e forzare la sicurezza sembra non triviale dato che può accettare chiavi di lunghezza arbitraria. RC4 è essenzialmente un generatore di numeri pseudo casuali, la cui uscita è usata per fare lo XOR con il flusso di dati ; per questo motivo è necessario che la stessa chiave non sia usata per cifrare due diversi flussi di dati. Il governo USA ha approvato l’esportazione di RC4 con chiavi di 40 bits: chiavi cosi piccole possono essere facilmente forzate da istituzioni come il governo, l’esercito etc. E’ interessante notare che SSL, versione export, che usa RC4 con chiavi di 40, bits è stato recentemente forzato da almeno due gruppi indipendenti in circa otto giorni di attività. Qualche tempo dopo lo stesso attacco è stato effettuato con successo in soli 35 minuti. Il codice usato da questo sistema ha una lunghezza dieci volte inferiore rispetto al DES (minore sicurezza), ma il vantaggio sta nella velocità di esecuzione (circa 5 volte più veloce).

Il tipo di algoritmo utilizzato dai sistemisti Microsoft era inizialmente l ‘algoritmo RC4 per la cifratura e quindi un’ottima protezione dal punto di vista crittografico. A causa di qualche problema i programmatori Microsoft implementarono una versione dell’RC4 leggermente modificata a livello di codice, ma completamente stravolta a livello di funzionalità. Con semplici operazioni di X0R e di traslazione e grazie a numerosi programmi freeware si possono decodificare tutte le password contenute nel file .PWL. Un esempio di programma atto a questo tipo di cose può essere PWL-TOOL questo tool è facile ed immediato da utilizzare grazie alla sua interfaccia grafica davvero molto friendly, scaricabile sul sito www.webdor.com.
Questo dovrebbe farci riflettere sul fatto che una software house di un così grande prestigio non abbia ritenuto opportuno dedicare sufficiente attenzione alla implementazione di un algoritmo sicuro per la protezione delle password di sistema.


Jan 11 2004

RC5


by tonycrypt

Si tratta di un gruppo di algoritmi, sviluppati da Ron Rivest dell’RSA Data Security, che lavorano su blocchi di dati, chiavi e numeri casuali di lunghezza variabile. La lunghezza del blocco dipende generalmente dalla lunghezza della word utilizzata dal computer sul quale l’algoritmo è stato implementato. Sui processori a 32 bit, quindi con chiavi di 32 bit, l’RC5 lavora su blocchi di 64 bit. David Wagner, John Kelsey e Bruce Schneier hanno scoperto chiavi deboli nell’RC5, che hanno una probabilità di scelta tra 2 e 10r, dove r è il numero di tentativi. Per valori r sufficientemente grandi invece (maggiori di 10), non ci sono problemi di sicurezza. Kundsen ha trovato un possibile attacco differenziale a questo algoritmo, le cui specifiche si possono trovare nei documenti dell’RSA. L’RC5 è ovviamente registrato dall’RSA Data Security, Inc.


Nov 27 2003

Il protocollo SHTTP


by tonycrypt

Le attuali reti informatiche prevedono lo scambio di informazioni da un computer all’altro attraverso svariati canali: via cavo, attraverso le fibre ottiche, via etere (cellulari, wireless, satellite, ecc.). Ma i problemi relativi alla sicurezza di questi canali sono tutt’altro che trascurabili: un potenziale nemico potrebbe intercettare le nostre comunicazioni, rubare dati, e poi utilizzarli come meglio crede. Per esempio, acquistando sul web mediante la carta di credito, sarà necessario digitare il proprio codice segreto. E se qualcuno intercettasse queste informazioni ponendosi tra il PC dell’acquirente ed il server che riceve i dati? Se, con questo sistema, qualcuno intercettasse i dati scambiati tra le banche? In problema è estremamente serio e pone non pochi limiti alle attività che ormai si svolgono quotidianamente sulle reti (trasferimenti di denaro, transazioni commerciali, scambio di informazioni riservate).
Così come si adotta la crittografia per proteggere la posta, si pone il problema di proteggere ogni tipo di informazione scambiata in rete: dati personali, numeri di carta di credito, attività economiche e così via. Bisogna insomma proteggere con la crittografia forte l’intero canale di trasmissione, da un terminale ad un altro: le informazioni devono essere codificate prima di essere inviate, e saranno decodificate solo a destinazione. Un eventuale intercettazione risulterebbe così infruttuosa, perchè il ladro di informazioni dovrebbe riuscire a decifrare il messaggio, cosa non facile se è stata usata una chiave sufficientemente robusta.
Il consorzio per il WWW ha pensato di scegliere come standard di base per l’autenticazione e la crittografia l’ SHTTP (Secure HyperText Transfer Protocol), che è un estensione dell’ HyperText Transfer Protocol (HTTP), protocollo di base del World Wide Web. L’SHTTP è stato progettato da E. Rescorla e A. Schiffman della EIT (Enterprise Integrated Technologic Inc.). Il protocollo fornisce capacità simmetriche al client e al server (stesso trattamento in richiesta e risposta) mentre mantiene il modello di implementazione dell’HTTP. SHTTP contiene dei formati standard di crittografia, in particolare: PKCS-7 e MOSS. SHTTP non richiede per il client la certificazione della chiave (o la chiave pubblica). Questo è importante perchè significa che le transazioni private possono avvenire senza che gli utenti abbiano stabilito chiavi pubbliche. Il protocollo lascia massima flessibilità nella scelta dei meccanismi di gestione della chiave, politiche di sicurezza e algoritmi di crittografia e supporta opzioni di negoziazione fra le parti per ogni transazione.
Il messaggio SHTTP, che sostituisce il messaggio HTTP, è composto da una linea di richiesta: di solito Secure-HTTP/ (versione protocollo). Questa linea è generalmente seguita da queste altre:

Content-Privacy-Domain indica il tipo di crittografia usata per trasferire il messaggio. Valori possibili: MOSS, PKCS-7.

Content-Transfer-Encoding dice in che modo il contenuto del messaggio è codificato. Valori possibili: BASE64, 8BIT, BINARY.

Content-Type è la linea di testa standard, contiene generalmente il valore: application/http. Se il messaggio è un SHTTP il valore di Content-Type è “application/s-http”.

Prearranged-Key-Info. Questa linea di testa contiene le informazioni che riguardano le chiavi usate nella incapsulazione del messaggio. Un uso di questo campo è quello di permettere lo scambio di messaggi cifrati tra utenti che non posseggono una coppia di chiavi pubblica/privata. Questo campo specifica i tre metodi di scambio delle chiavi: Inband, Kerberos, Outband. Inband e Kerberos prevedono lo scambio delle chiavi usando la testata di Key-Assign, mentre in modo Outband gli agenti hanno accesso al materiale che riguarda le chiavi in modo esterno, ad esempio con una base di dati. In questa linea viene quindi specificato l’algoritmo di crittografia a blocchi, usato per cifrare i dati, la chiave da usare per cifrare i messaggi (legata alla negoziazione tramite il campo Key-Assign) e il modo con cui si scambia questa chiave (Inband, Outband, Kerberos).

MAC-Info. Questa testata serve per fornire un controllo dell’autenticità del messaggio, controllando sia l’integrità che l’autenticazione del messaggio. Il calcolo viene fatto tenendo conto del messaggio, del tempo, e di una parte segreta tra il client e il server. Il MAC calcolato sul messaggio SHTTP incapsulato, mediante una funzione hash. Il tempo è rappresentato con un intero senza segno di 32 bit che rappresenta i secondi passati dalle 00.00 del 1 Gennaio 1970 (epoca secondo il sistema UNIX). La parte segreta è trattata in maniera locale, può essere ad esempio un identificativo ed una password. Recenti ricerche hanno dimostrato delle debolezze in questo modo di operare, per questo motivo è stato sostituito con un nuovo HMAC più complesso che prevede l’uso di operazioni di XOR.

A questo punto segue il messaggio vero e proprio.


Nov 27 2003

Alain Turing e la macchina Enigma


by tonycrypt

Enigma Durante la seconda guerra mondiale tutte le comunicazioni militari tedesche venivano criptate con una macchina di cifra chiamata Enigma, ideata dall’ingegnere tedesco Arthur Scherbius. Questa macchina è una rappresentante niente affatto indegna di una classe di cifrari a rotore, utilizzati fino all’introduzione di cifrari elettronici e microelettronici che hanno sconvolto e trasformato il mondo della crittografia. Per forzare l’Enigma (alcuni dettagli della soluzione sono tenuti segreti fino ad oggi) Turing, per conto del governo inglese, si servì di gigantesche macchine chiamate appunto Colossi, che possono considerarsi i precursori dei moderni calcolatori elettronici. Turing è autore di ricerche estremamente raffinate e molto profonde sul concetto logico-matematico di calcolabilità: la strumento che egli ha proposto per affrontare il problema è noto oggi col nome di macchina di Turing. Le macchine di Touring non hanno niente da spartire coi Colossi, non possiedono né valvole, né transistor, né circuiti integrati(come i calcolatori della prima, della seconda o della terza generazione), esse sono macchine “astratte” e meramente “ideali” che esistono solo mente di Turing e in quelle dei logici che proseguono le sue ricerche.
Per rendersi conto di quanto i tempi siano cambiati basterà ricordare che l’Enigma aveva un grande inconveniente: era sprovvisto di stampante. I risultati apparivano illuminati su una tastiera apposita, lettera dopo lettera, e una persona doveva provvedere a trascriverli a mano su un foglio di carta. Una stampante elettro-meccanica avrebbe appesantito troppo il congegno e lo avrebbe reso poco maneggevole: un problema che la tecnica odierna consente di superare senza difficoltà.


Nov 5 2003

RC6


by tonycrypt

L’RC6 è stato sviluppato sotto richiesta del Ronald Rivest’s AES. Come il cifrario AES, lavora su blocchi di 128 bit e accetta chiavi di lunghezza variabile. Molto simile all’RC5, incorpora vari studi di analisi dell’algoritmo precedente, che hanno dimostrato che non tutti i bit dei dati sono usati per determinare l’ammontare delle rotazioni; l’RC6 utilizza prodotti per il calcolo delle rotazioni e tutti i dati di input per il calcolo dell’ammontare delle stesse.


Sep 5 2003

Serpent


by tonycrypt

L’algoritmo Serpent è stato sviluppato da Ross Anderson, Eli Biham, e Lars Knudsen dietro richiesta dell’AES. Gli autori hanno utilizzato tecniche combinate per la sua creazione, ispirandosi all’algoritmo DES. Serpent utilizza blocchi di 128 bit con chiavi di 256 bit. Come il DES, contiene delle permutazioni iniziali e finali senza nessuna giustificazione crittografica, che, apparentemente, servono per ottimizzare i dati prima dell’operazione di cifratura. L’algoritmo è stato rilasciato durante la convention “5th International Workshop on Fast Software Encryption”: questa iterazione del Serpent è stata chiamata Serpent 0 e utilizza le S-box originali del DES. Dopo i commenti e le discussioni raccolti durante la convention, le permutazioni sono state cambiate e chiamate Serpent 1. Il nuovo algoritmo ha resistito alla crittanalisi differenziale e lineare.

 


Jul 28 2003

Steganografia


by tonycrypt

La parola steganografia deriva dall’unione dei due vocaboli greci stego (rendo occulto, nascondo) e grajh (la scrittura). Steganografia è dunque “la scrittura nascosta” o meglio ancora l’insieme delle tecniche che consente a due o più persone di comunicare in modo tale da nascondere non tanto il contenuto (come nel caso della crittografia), ma la stessa esistenza della comunicazione agli occhi di un eventuale osservatore, tradizionalmente denominato “nemico”. Si tratta di un’idea tutt’altro che nuova e che anzi vanta origini molto antiche. Nel corso dei secoli sono stati escogitati numerosi metodi steganografici, tutti molto diversi tra loro. Al fine di comprendere meglio l’essenza di questa idea, può essere utile accennare ad alcuni esempi tra i più interessanti e ingegnosi.

Erodoto racconta la storia di un nobile persiano che fece tagliare a zero i capelli di uno schiavo fidato al fine di poter tatuare un messaggio sul suo cranio; una volta che i capelli furono ricresciuti, inviò lo schiavo alla sua destinazione, con la sola istruzione di tagliarseli nuovamente.

Un acrostico è una poesia – o un testo di qualsiasi tipo – composta intenzionalmente in modo tale che, unendo le prime lettere di ogni capoverso, si ottiene un messaggio di senso compiuto. Esistono numerose varianti di questa semplice idea di base, come il testo che segue (il quale fu realmente inviato da una spia tedesca durante la seconda guerra mondiale):

==================================================================
Apparently neutral's protest is thoroughly discounted and ignored.
Isman hard hit. Blockade issue affects pretext for embargo on by
products, ejecting suets and vegetable oils.
==================================================================

Considerando in sequenza la seconda lettera di ogni parola, si ottiene il messaggio:

==============================
Pershing sails from NY June 1
==============================

(Nota: in realtà c’è una “r” di troppo)

Le griglie di Cardano erano fogli di materiale rigido nei quali venivano ritagliati fori rettangolari a intervalli irregolari; applicando la griglia sopra un foglio di carta bianca, il messaggio segreto veniva scritto nei buchi (ciascun buco poteva contenere una o più lettere), dopodiché si toglieva la griglia e si cercava di completare la scrittura del resto del foglio in modo da ottenere un messaggio di senso compiuto, il quale poi veniva inviato a destinazione.

Applicando sul foglio una copia esatta della griglia originaria, era possibile leggere il messaggio nascosto.

Gli inchiostri invisibili (o inchiostri simpatici) sono sostanze che, in condizioni normali, non lasciano tracce visibili se usate per scrivere su un foglio di carta, ma diventano visibili (rivelando in tal modo la scrittura) se il foglio viene sottoposto a una fonte di calore. È così possibile scrivere il messaggio segreto negli spazi compresi tra le righe di un messaggio dall’aspetto innocuo, quest’ultimo scritto con un inchiostro normale. (Per accedere al messaggio segreto occorre letteralmente “saper leggere tra le righe”…). Le sostanze più usate a questo scopo sono molto comuni: succo di limone, aceto, latte, ma durante la seconda guerra mondiale sono state impiegate sostanze più sofisticate, come ad esempio gli inchiostri al cobalto, che possono essere resi visibili solo mediante l’uso di particolari reagenti chimici.

Un’altra tecnica molto usata dai nazisti durante la seconda guerra mondiale è quella dei micropunti fotografici: si tratta di fotografie della dimensione di un punto dattiloscritto che, una volta sviluppate e ingrandite, possono diventare pagine stampate di buona qualità.

Questi pochi ma significativi esempi dovrebbero essere sufficienti a chiarire il concetto di steganografia, il quale viene spesso confuso, in prima analisi, con quello di crittografia. Per rendere più esplicite le differenze tra questi due concetti possiamo osservare che, mentre nel caso della crittografia è consentito al nemico di rilevare, intercettare e modificare i messaggi senza però avere la possibilità di violare le misure di sicurezza garantite dallo specifico sistema crittografico (cioè senza poter accedere all’informazione vera e propria e quindi leggerne il contenuto), l’obiettivo della steganografia è invece quello di nascondere un messaggio dentro un altro messaggio, dall’aspetto innocuo, in modo che il nemico non possa neppure rilevare l’esistenza del primo messaggio.

Una e molte steganografie: la steganografia sostitutiva:

Ciò che caratterizza la steganografia, come si è visto, è l’esistenza di un secondo messaggio facilmente percepibile, il cui senso è generalmente del tutto disgiunto da quello del messaggio segreto che esso contiene. Nel seguito si indicherà questo secondo messaggio come messaggio contenitore o più semplicemente contenitore.

Come si può facilmente immaginare, le nuove tecnologie e in particolar modo i sistemi per l’elaborazione dell’informazione, hanno consentito anche nel caso della steganografia la progettazione di nuove tecniche, sempre più sofisticate, sicure e pratiche da usare. Questo capitolo cercherà proprio di esporre le idee che stanno alla base dei più diffusi programmi per computer che consentono di steganografare un messaggio dentro un altro. Le prime definizioni proposte riguardano l’origine del file contenitore: alcune tecniche – probabilmente le più numerose – come si vedrà consentono di “iniettare” il messaggio segreto dentro un messaggio contenitore già esistente, modificandolo in modo tale sia da contenere il messaggio sia da risultare, al livello al quale viene percepito dai sensi umani, praticamente indistinguibile dall’originale. Indichiamo l’insieme di queste tecniche con il termine steganografia iniettiva. Esistono tuttavia altre tecniche steganografiche che hanno capacità proprie di generare potenziali messaggi contenitori e utilizzano il messaggio segreto per “pilotare” il processo di generazione del contenitore. Per queste tecniche adottiamo il termine steganografia generativa. Alla fine del capitolo verranno passati in rassegna esempi di programmi di entrambi i tipi.

Secondo un sistema di classificazione diverso, le tecniche steganografiche possono essere ripartite in tre classi: steganografia sostitutiva, steganografia selettiva e steganografia costruttiva.

Le tecniche del primo tipo sono di gran lunga le più diffuse, tanto che in genere con il termine steganografia ci si riferisce implicitamente a esse. Tali tecniche si basano sulla seguente osservazione: la maggior parte dei canali di comunicazione (linee telefoniche, trasmissioni radio, ecc.) trasmettono segnali che sono sempre accompagnati da qualche tipo di rumore. Questo rumore può essere sostituito da un segnale – il messaggio segreto – che è stato trasfor mato in modo tale che, a meno di conoscere una chiave segreta, è indistinguibile dal rumore vero e proprio, e quindi può essere trasmesso senza destare sospetti.

Quasi tutti i programmi che sono facilmente reperibili si basano su questa idea, sfruttando la grande diffusione di file contenenti una codifica digitale di immagini, animazioni e suoni; spesso questi file sono ottenuti da un processo di conversione analogico/digitale e contengono qualche tipo di rumore. Per esempio, uno scanner può essere visto come uno strumento di misura più o meno preciso. Un’immagine prodotta da uno scanner, da questo punto di vista, è il risultato di una specifica misura e come tale è soggetta a essere affetta da errore.

La tecnica base impiegata dalla maggior parte dei programmi, consiste semplicemente nel sostituire i “bit meno significativi” delle immagini digitalizzate con i bit che costituiscono il file segreto (i bit meno significativi sono assimilabili ai valori meno significativi di una misura, cioè quelli che tendono a essere affetti da errori.) Spesso l’immagine che ne risulta non è distinguibile a occhio nudo da quella originale ed è comunque difficile dire se eventuali perdite di qualità siano dovute alla presenza di informazioni nascoste oppure all’errore causato dall’impiego di uno scanner poco preciso, o ancora alla effettiva qualità dell’immagine originale prima di essere digitalizzata. Per fissare meglio le idee, ecco un esempio concreto. Uno dei modi in cui viene solitamente rappresentata un’immagine prodotta da uno scanner è la codifica RGB a 24 bit: l’immagine consiste di una matrice MxN di punti colorati (pixel) e ogni punto è rappresentato da 3 byte, che indicano rispettivamente i livelli dei colori primari rosso (Red), verde (Green) e blu (Blue) che costituiscono il colore. In questo modello i colori possibili sono 224 = 16777216; i cosiddetti grigi sono i colori in cui i livelli di rosso, verde e blu sono coincidenti e quindi sono soltanto 256. Supponiamo che uno specifico pixel di un’immagine prodotta da uno scanner sia rappresentato dalla tripla (12, 241, 19) (si tratta di un colore tendente al verde, dato che la componente verde predomina fortemente sulle altre due); in notazione binaria, le tre componenti sono:

===============
12  = 00001100
241 = 11110001
19  = 00010011
===============

quelli che in precedenza abbiamo chiamato i “bit meno significativi” dell’immagine sono gli ultimi a destra, cioè 0-1-1, e sono proprio quelli che si utilizzano per nascondere il messaggio segreto. Se volessimo nascondere in quel pixel l’informazione data dalla sequenza binaria 101, allora bisognerebbe effettuare la seguente trasformazione:

==============================
00001100 --> 00001101 = 13
11110001 --> 11110000 = 240
00010011 --> 00010011 = 19
==============================

La tripla è così diventata (13, 240, 19); si noti che questo tipo di trasformazione consiste nel sommare 1, sottrarre 1 o lasciare invariato ciascun livello di colore primario, quindi il colore risultante differisce in misura minima da quello originale. Dato che un solo pixel può contenere un’informazione di 3 bit, un’immagine di dimensioni MxN può contenere un messaggio segreto lungo fino a (3*M*N)/8 byte, per esempio un’immagine 1024×768 può contenere 294912 byte.

La tecnica appena descritta rappresenta il cuore della steganografia sostitutiva, anche se di fatto ne esistono numerose variazioni. Innanzitutto è ovvio che tutto quello che abbiamo detto vale non solo per le immagini, ma anche per altri tipi di media, per esempio suoni e animazioni digitalizzati. Inoltre – e questo è meno ovvio – lavorando con le immagini come file contenitori non sempre si inietta l’informazione al livello dei pixel, ma si è costretti a operare su un livello di rappresentazione intermedio; è questo il caso, per esempio, delle immagini in formato JPEG, nel quale le immagini vengono memorizzate solo dopo essere state compresse con una tecnica che tende a preservare le loro caratteristiche visive piuttosto che l’esatta informazione contenuta nella sequenza di pixel. Se iniettassimo delle informazioni in una bitmap e poi la salvassimo in formato JPEG, le infor mazioni andrebbero perdute, poiché non sarebbe possibile ricostruire la bitmap originale. Per poter utilizzare anche le immagini JPEG come contenitori, è tuttavia possibile iniettare le informazioni nei coefficienti di Fourier ottenuti dalla prima fase di compressione.

Esiste un altro caso interessante che merita di essere discusso, ed è quello dei formati di immagini che fanno uso di palette. La palette (tavolozza) è un sottoinsieme prestabilito di colori. Nei for mati che ne fanno uso, i pixel della bitmap sono vincolati ad assumere come valore uno dei colori presenti nella palette: in questo modo è possibile rappresentare i pixel con dei puntatori alla palette, invece che con la terna esplicita RGB (red, green and blue). Ciò in genere permette di ottenere dimensioni inferiori della bitmap, ma il reale vantaggio è dato dal fatto che le schede grafiche di alcuni anni fa utilizzavano proprio questa tecnica e quindi non potevano visualizzare direttamente immagini con un numero arbitrario di colori. Il caso più tipico è quello delle immagini in for mato GIF con palette di 256 colori, ma le palette possono avere anche altre dimensioni. Come è facile immaginare, un’immagine appena prodotta da uno scanner a colori sarà tipicamente costituita da più di 256 colori diversi, tuttavia esistono algoritmi capaci di ridurre il numero dei colori utilizzati mantenendo il degrado della qualità entro limiti accettabili. Si può osservare che, allo stesso modo in cui avviene con il formato JPEG, non è possibile iniettare infor mazioni sui pixel prima di convertire l’immagine in formato GIF, perché durante il processo di conversione c’è perdita di informazione (osserviamo anche che questo non vale per le immagini a livelli di grigi: tali immagini infatti sono particolarmente adatte per usi steganografici.) La soluzione che viene di solito adottata per usare immagini GIF come contenitori è dunque la seguente: si riduce il numero dei colori utilizzati dall’immagine a un valore inferiore a 256 ma ancora sufficiente a mantenere una certa qualità dell’immagine, dopodiché si finisce di riempire la palette con colori molto simili a quelli rimasti. A questo punto, per ogni pixel dell’immagine, la palette contiene più di un colore che lo possa rappresentare (uno è il colore originale, gli altri sono quelli simili ad esso che sono stati aggiunti in seguito), quindi abbiamo una possibilità di scelta. Tutte le volte che abbiamo una possibilità di scelta fra più alternative, abbiamo la possibilità di nascondere un’infor mazione: questo è uno dei principi fondamentali della steganografia. Se le alternative sono due possiamo nascondere un bit (se il bit è 0, scegliamo la prima, se è 1 la seconda); se le alternative sono quattro possiamo nascondere due bit (00 -> la prima, 01 -> la seconda, 10 -> la terza, 11 -> la quarta) e così via.

La soluzione appena discussa dell’utilizzo di GIF come contenitori è molto ingegnosa ma purtroppo presenta un problema: è facile scrivere un programma che, presa una GIF in ingresso, analizzi i colori utilizzati e scopra le relazioni che esistono tra di essi; se il programma scopre che l’insieme dei colori utilizzati può essere ripartito in sottoinsiemi di colori simili, è molto probabile che la GIF contenga infor mazione steganografata. Di fatto, questo semplice metodo di attacco è stato portato avanti con pieno successo da diverse persone ai programmi che utilizzano immagini a palette come contenitori, tanto che qualcuno ha finito per sostenere che non è possibile fare steganografia con esse.

Per mostrare quanto sia ampia la gamma di tecniche steganografiche, accenniamo a un’altra possibilità di nascondere informazioni dentro immagini GIF. Come abbiamo detto, in questo formato viene prima memorizzata una palette e quindi la bitmap (compressa con un algoritmo che preserva completamente le infor mazioni) consistente di una sequenza di puntatori alla palette. Se scambiamo l’ordine di due colori della palette e corrispondentemente tutti i puntatori ad essi, otteniamo un file diverso che corrisponde però alla stessa immagine, dal punto di vista dell’immagine il contenuto informativo dei due file è identico. La rappresentazione di immagini con palette è quindi intrinsecamente ridondante, dato che ci permette di scegliere un qualsiasi ordine dei colori della palette (purché si riordinino corrispondentemente i puntatori a essi). Se i colori sono 256, esistono 256! modi diversi di scrivere la palette, quindi esistono 256! file diversi che rappresentano la stessa immagine. Inoltre è abbastanza facile trovare un metodo per numerare univocamente tutte le permutazioni di ogni data palette (basta, per esempio, considerare l’ordinamento sulle componenti RGB dei colori). Dato che abbiamo 256! possibilità di scelta, è possibile codificare log(256!) = 1683 bit, cioè 210 byte. Si noti che questo numero è indipendente dalle dimensioni dell’immagine, in altre parole è possibile iniettare 210 bytes anche su piccole immagini del tipo icone 16×16 semplicemente permutando in modo opportuno la palette.

Dopo avere esaminato alcune tecniche steganografiche di tipo sostitutivo, discutiamo adesso i problemi relativi alla loro sicurezza. Innanzitutto premettiamo che le norme che valgono generalmente per i programmi di crittografia dovrebbero essere osservate anche per l’utilizzo dei programmi steganografici. Per ciò che riguarda le specifiche caratteristiche della steganografia, si tengano presente i seguenti principi: in primo luogo si eviti di usare come contenitori file prelevati da siti pubblici o comunque noti (per esempio, immagini incluse in pacchetti software, ecc.); in secondo luogo si eviti di usare più di una volta lo stesso file contenitore (l’ideale sarebbe quello di generarne ogni volta di nuovi, mediante scanner e convertitori da analogico a digitale, e distruggere gli originali dopo averli usati).

Come si è visto, queste tecniche consistono nel sostituire un elemento di scarsa importanza (in certi casi di importanza nulla) da file di vario tipo, con il messaggio segreto che vogliamo nascondere. Quello che viene ritenuto il principale difetto di queste tecniche è che in genere la sostituzione operata può alterare le caratteristiche statistiche del rumore presente nel media utilizzato. Lo scenario è il seguente: si suppone che il nemico disponga di un modello del rumore e che utilizzi tale modello per controllare i file che riesce a intercettare. Se il rumore presente in un file non è conforme al modello, allora il file è da considerarsi sospetto. Si può osservare che questo tipo di attacco non è per niente facile da realizzare, data l’impossibilità pratica di costruire un modello che tenga conto di tutte le possibili sorgenti di errori/ rumori, tuttavia in proposito esistono degli studi che in casi molto specifici hanno avuto qualche successo.

La steganografia selettiva e quella costruttiva hanno proprio lo scopo di eliminare questo difetto della steganografia sostitutiva. Vediamo di cosa si tratta.

Steganografia selettiva

La steganografia selettiva ha valore puramente teorico e, per quanto se ne sappia, non viene realmente utilizzata nella pratica. L’idea su cui si basa è quella di procedere per tentativi, ripetendo una stessa misura fintanto che il risultato non soddisfa una certa condizione. Facciamo un esempio per chiarire meglio. Si fissi una funzione hash semplice da applicare a un’immagine in forma digitale (una funzione hash è una qualsiasi funzione definita in modo da dare risultati ben distribuiti nell’insieme dei valori possibili; tipicamente questo si ottiene decomponendo e mescolando in qualche modo le componenti dell’argomento); per semplificare al massimo, diciamo che la funzione vale 1 se il numero di bit uguali a 1 del file che rappresenta l’immagine è pari, altrimenti vale 0 (si tratta di un esempio poco realistico ma, come dicevamo, questa discussione ha valore esclusivamente teorico). Così, se vogliamo codificare il bit 0 procediamo a generare un’immagine con uno scanner; se il numero di bit dell’immagine uguali a 1 è dispari ripetiamo di nuovo la generazione, e continuiamo così finché non si verifica la condizione opposta. Il punto cruciale è che l’immagine ottenuta con questo metodo contiene effettivamente l’informazione segreta, ma si tratta di un’immagine “naturale”, cioè generata dallo scanner senza essere rimanipolata successivamente. L’immagine è semplicemente sopravvissuta a un processo di selezione (da cui il nome della tecnica), quindi non si può dire in alcun modo che le caratteristiche statistiche del rumore presentano una distorsione rispetto a un modello di riferimento. Come è evidente, il problema di questa tecnica è che è troppo dispendiosa rispetto alla scarsa quantità di informazione che è possibile nascondere. Ad ogni modo, alla fine del capitolo si proporrà un esempio di programma che implementa una steganografia di tipo generativo, utilizzando con successo l’idea di base della steganografia selettiva di nascondere le informazioni procedendo per tentativi.

Steganografia costruttiva

La steganografia costruttiva affronta lo stesso problema nel modo più diretto, tentando di sostituire il rumore presente nel medium utilizzato con l’informazione segreta opportunamente modificata in modo da imitare le caratteristiche statistiche del rumore originale. Secondo questa concezione, un buon sistema steganografico dovrebbe basarsi su un modello del rumore e adattare i parametri dei suoi algoritmi di codifica in modo tale che il falso rumore contenente il messaggio segreto sia il più possibile conforme al modello. Questo approccio è senza dubbio valido, ma presenta anche alcuni svantaggi. Innanzitutto non è facile costruire un modello del rumore: la costruzione di un modello del genere richiede grossi sforzi ed è probabile che qualcuno, in grado di disporre di maggior tempo e di risorse migliori, riesca a costruire un modello più accurato, riuscendo ancora a distinguere tra il r umore originale e un sostituto. Inoltre, se il modello del rumore utilizzato dal metodo steganografico dovesse cadere nelle mani del nemico, egli lo potrebbe analizzare per cercarne possibili difetti e quindi utilizzare proprio il modello stesso per controllare che un messaggio sia conforme a esso. Così, il modello, che è parte integrante del sistema steganografico, fornirebbe involontariamente un metodo di attacco particolarmente efficace proprio contro lo stesso sistema.

Cosa fare? Attenersi al principio di Kerckhoff

A causa di questi problemi, la semplice tecnica iniettiva di base rimane quella più conveniente da usare. Se si hanno particolari esigenze di sicurezza, esiste sempre una strategia molto semplice e allo stesso tempo molto efficace: quella che consiste nell’utilizzare contenitori molto più ampi rispetto alla quantità di informazioni da nascondere. Per esempio, invece di utilizzare i bit meno significativi di tutti i pixel di un’immagine, si può giocare sul sicuro utilizzando solo un pixel ogni 10, o anche più, fino a rendere impossibile, a tutti gli effetti pratici, la rilevazione di una distorsione delle caratteristiche statistiche del rumore. Su questo punto si tornerà in seguito.

Resta da affrontare un’ultima questione molto importante. Abbiamo accennato all’eventualità che i dettagli di funzionamento di un sistema steganografico possano cadere nelle mani del nemico. In ambito crittografico si danno le definizioni di vari livelli di robustezza di un sistema, a seconda della capacità che esso ha di resistere ad attacchi basati su vari tipi di informazioni a proposito del sistema stesso. In particolare, i sistemi più robusti sono quelli che soddisfano i requisiti posti dal principio di Kerckhoff, che formulato in ambito steganografico suona più o meno così: la sicurezza del sistema deve basarsi sull’ipotesi che il nemico abbia piena conoscenza dei dettagli di progetto e implementazione del sistema stesso; la sola informazione di cui il nemico non può disporre è una sequenza (corta) di numeri casuali – la chiave segreta – senza la quale, osser vando un canale di comunicazione, non deve avere neanche la più piccola possibilità di verificare che è in corso una comunicazione nascosta.

Se si vuole aderire a questo principio, è evidente che le tecniche esposte fin qui non sono ancora soddisfacenti per caratterizzare un sistema steganografico completo. Infatti, se i dettagli di implementazione dell’algoritmo sono resi di dominio pubblico, chiunque è in grado di accedere a eventuali informazioni nascoste, semplicemente applicando il procedimento inverso (nell’esempio visto, ciò si ottiene “riaggregando” i bit meno significativi dell’immagine). Per affrontare questo problema, è necessario introdurre una fase di pre-elaborazione del file segreto, che lo renda non riconoscibile – da parte del nemico – come portatore di informazioni significative. La soluzione più ovvia è quella di impiegare un sistema di crittografia convenzionale (per esempio, il PGP), il quale garantisce appunto l’inaccessibilità da parte del nemico al messaggio vero e proprio.

La storia purtroppo non è finita qui, perché in questo meccanismo a due stadi il secondo processo è reversibile; in altri termini, chiunque può estrarre il file costituito dalle informazioni che fluiscono dal primo al secondo stadio. Poiché si presume che un crittoanalista esperto possa facilmente riconoscere un file prodotto da un programma di crittografia convenzionale, questo schema è ancora da considerarsi incompleto. Questo punto è di importanza fondamentale, perché rende definitivamente non valido il sistema steganografico, indipendentemente dal fatto che il contenuto dell’informazione segreta resti inaccessibile. Mentre il progettista di un algoritmo di crittografia assume che il nemico impiegherà tutte le risorse possibili per decrittare il messaggio, il progettista di un sistema steganografico deve supporre infatti che il nemico tenterà di rilevare la sola esistenza del messaggio. In altre parole, la crittografia fallisce il suo scopo quando il nemico legge il contenuto del messaggio: la steganografia invece fallisce quando il nemico si rende semplicemente conto che esiste un messaggio segreto dentro il file contenitore, pur non potendolo leggere. È opportuno quindi che il messaggio crittografato, prima di essere immerso nel contenitore, venga “camuffato” in modo da diventare difficilmente distinguibile da semplice rumore. A questo scopo, sono stati escogitati diversi metodi. Il più semplice è quello di eliminare dal file crittato da PGP tutte le informazioni che lo identificano come tale: il PGP, infatti, genera un file che rispetta un particolare formato, contenente, oltre al blocco di dati cifrati vero e proprio, informazioni piuttosto ridondanti che facilitano la gestione del file da parte dello stesso PGP (o di shell in grado di trattare con questo for mato). Esiste un piccolo programma, Stealth, capace di togliere – e di reinserire nella fase di ricostruzione – tutte le infor mazioni diverse dal blocco di dati cifrati. Il file che esce da Stealth appare come una sequenza di bit del tutto casuale, che è molto difficile distinguere da rumore ad alta entropia. Naturalmente, chiunque può provare ad applicare il procedimento inverso (prima Stealth per ricostruire l’intestazione, quindi il PGP), ma solo disponendo della chiave giusta si potrà alla fine accedere al messaggio in chiaro. In caso contrario non si potrà neppure capire se il fallimento sia dovuto al fatto di non disporre della chiave giusta oppure, verosimilmente, al fatto che l’immagine non contiene alcun messaggio nascosto.

Un metodo alternativo all’uso congiunto di PGP e Stealth è dato dall’uso di programmi espressamente progettati per trasfor mare un file in rumore apparente (per esempio, Wnstorm, White Noise Storm). Riassumendo, un sistema steganografico completo deve comprendere due fasi fondamentali: trasformazione del messaggio in chiaro in rumore apparente. Questa fase prevede l’uso di un sistema di crittografia convenzionale e quindi di un qualche tipo di chiave; iniezione nel (o generazione del) messaggio contenitore.

 


Jul 28 2003

Vigenere


by tonycrypt

Il codice di Vigenere, ideato da Blaise De Vigenere nel 1586, può essere considerato un caso particolare del sistema Vernam (che fu ideato da G.S.Vernam nel 1926). Si tratta di un codice a sostituzione polialfabetica, che può essere attaccato col metodo Kasiski. Da un lato il sistema Vigenere può considerarsi un’estensione del codice di Cesare, dove invece di shiftare tutte le lettere di una stessa quantità si effettua l’offset in base alla chiave. In altre parole si effettua la somma dei valori numerici corrispondenti alle lettere del testo in chiaro e a quelle della chiave, per esempio assegnando i numeri (a partire dallo zero) alle lettere alfabeticamente ordinate. Ecco un esempio:

Chiave: FULMINE

Messaggio in chiaro: TANTISALUTIATUTTI

Messaggio cifrato: YUYFQFEQOEUIGYYNT

Alla lettera F della chiave corrisponde il numero 5 (a=0, b=1, ….f=5, …..). Alla lettera T del messaggio corrisponde il numero 20. La somma dei due numeri è 25, a cui corrisponde la lettera y. Si procede allo stesso modo per le altre lettere, riprendendo la chiave dall’inizio se dovesse risultare più corta del testo in chiaro.
Da un altro punto di vista, il codice di Vigenere può essere considerato una restrizione, un caso particolare del sistema Vernam. Mentre il Vernam impone che la lunghezza della chiave sia almeno pari a quella del testo in chiaro, nel Vigenere la chiave è più corta del testo da cifrare e quindi deve essere ripetuta. E questo è proprio il tallone d’Achille del Vigenere, perchè lo rende vulnerabile ad attacchi crittoanalitici di vario genere. Il Vernam è invece un algoritmo perfetto, inviolabile, sempre che la chiave sia generata in modo casuale.

Per velocizzare le operazioni di cifratura-decifratura, Vigenere introdusse una semplice tavola costituita da righe di lettere alfabeticamente ordinate, shiftate di 1 posto riga per riga:

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
B C D E F G H I J K L M N O P Q R S T U V W X Y Z A
C D E F G H I J K L M N O P Q R S T U V W X Y Z A B
D E F G H I J K L M N O P Q R S T U V W X Y Z A B C
E F G H I J K L M N O P Q R S T U V W X Y Z A B C D
F G H I J K L M N O P Q R S T U V W X Y Z A B C D E
G H I J K L M N O P Q R S T U V W X Y Z A B C D E F
H I J K L M N O P Q R S T U V W X Y Z A B C D E F G
I J K L M N O P Q R S T U V W X Y Z A B C D E F G H
J K L M N O P Q R S T U V W X Y Z A B C D E F G H I
K L M N O P Q R S T U V W X Y Z A B C D E F G H I J
L M N O P Q R S T U V W X Y Z A B C D E F G H I J K
M N O P Q R S T U V W X Y Z A B C D E F G H I J K L
N O P Q R S T U V W X Y Z A B C D E F G H I J K L M
O P Q R S T U V W X Y Z A B C D E F G H I J K L M N
P Q R S T U V W X Y Z A B C D E F G H I J K L M N O
Q R S T U V W X Y Z A B C D E F G H I J K L M N O P
R S T U V W X Y Z A B C D E F G H I J K L M N O P S
S T U V W X Y Z A B C D E F G H I J K L M N O P Q R
T U V W X Y Z A B C D E F G H I J K L M N O P Q R S
U V W X Y Z A B C D E F G H I J K L M N O P Q R S T
V W X Y Z A B C D E F G H I J K L M N O P Q R S T U
W X Y Z A B C D E F G H I J K L M N O P Q R S T U V
X Y Z A B C D E F G H I J K L M N O P Q R S T U V W
Y Z A B C D E F G H I J K L M N O P Q R S T U V W X
Z A B C D E F G H I J K L M N O P Q R S T U V W X Y

Supponendo di voler cifrare (vedi esempio sopra) la lettera T, con la chiave F. L’elemento cifrato è quello appartenente alla colonna che inizia per T ed alla riga che inizia per F. Otteniamo così l’elemento y. E’possibile testare in modo automatico questo tipo di crittografia utilizzando il modulo sottostante. Si tratta di un semplice esempio che elabora solo le 26 lettere dell’alfabeto, senza far distinzione tra maiuscole e minuscole. Nel caso in cui la chiave dovesse essere lunga quanto il testo da cifrare, allora state passando dal Vigenere al Vernam.

Prova tu stesso il cifrario Vigenere


Jul 20 2003

Pigpen


by tonycrypt

Il cifrario Pigpen (recinto per maiali) veniva utilizzato nel Settecento, dai massoni, per evitare che le proprie comunicazioni venissero intercettate. Attualmente viene utilizzato per gioco, dagli scolari. Si tratta di una semplicissima sostituzione delle lettere con dei simboli, secondo il seguente schema:

Seguendo tale schema risulterebbe:

a =

b =

……

z =

Dunque secondo tale schema, il codice : andrebbe tradotto semplicemente come “ciao”.

Se è nota la chiave di cifratura del pigpen, allora è semplicissimo decifrarlo. Altrimenti non risulta particolarmente difficile ricavare la chiave giusta, magari con analisi di frequenze.