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

Carnivore


by tonycrypt

Carnivore è il sistema d’intercettazione delle e-mail messo in piedi dall’FBI, molto simile ad Echelon, che intercetta anche i messaggi SMS e le comunicazioni wireless. Il DCS 1000, noto al grande pubblico come Carnivore, è un sistema che permette alla nota agenzia investigativa di controllare indiscriminatamente tutte le e-mail degli utenti americani. Lo scopo dichiarato è quello di effettuare indagini in maniera più efficiente, ma, fin da quando si è venuto a sapere della sua esistenza, si è scatenata una vera e propria bufera di polemiche. Sono in molti a ritenere che questo sistema sia un’inaccettabile violazione del diritto alla privacy dei normali onesti cittadini: infatti, per trovare le comunicazioni sospette, Carnivore deve scandagliare tutte le e-mail e quindi deve entra nella corrispondenza privata delle persone. La sua legalità è tuttora oggetto di controllo anche da parte del Dipartimento di Giustizia americano.

Ma è in particolare dal giorno dei grandi attentati di Settembre negli USA che Carnivore viene sfruttato al massimo delle sue potenzialità. E, in clima di guerra e terrorismo, si mette al primo posto la sicurezza trascurando concetti come privacy o anonimato. Gli USA ammettono chiaramente il ricorso a Carnivore, vista la grave situazione venutasi a creare in seguito all’attacco terroristico. Ma, per garantire maggiore sicurezza in futuro, sarà rispettata la privacy? Non solo: gli Stati Uniti chiedono la chiusura dei remailers, strumenti indispensabili per garantirsi un certo anonimato.

 


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.