Implementazione JavaScript del Metodo di Vigenère

Pagina creata da Melissa Cattaneo
 
CONTINUA A LEGGERE
Implementazione JavaScript del Metodo di Vigenère
Corso di Crittografia PLS 2006-2007

                      Implementazione JavaScript del Metodo di Vigenère

                                                  Alessandro Dal Maso
                                             Liceo Statale “F. Corradini”, Thiene

                                                          Sommario
      Quest’implementazione in JavaScript consente di applicare con facilità, agilità, ma, soprattutto, velocità ed u-
      sabilità il metodo di Vigenère a qualsiasi testo (per qualsiasi intendo contenente ogni tipo carattere).

1. JavaScript.
Prima di vedere lo script, spieghiamo brevemente cosa sia JavaScript, nonché quale sia la sua indiscutibile
utilità. JavaScript è un linguaggio di scripting lato-client, che viene interpretato dal browser. Dire che Ja-
vaScript è un linguaggio lato client, significa anche che gli script avranno validità all’interno delle singole
pagine web, e non da una pagina all'altra: con JavaScript è possibile, infatti, passare una piccola quantità
di dati da una pagina all’altra, ma è un’operazione che può essere effettuata con una certa difficoltà (coi
linguaggi server side — ASP, PHP, PERL, ad esempio —, si esegue invece in maniera intuitiva); non è
possibile invece trasmettere quantità di dati elevate. JavaScript viene eseguito sul nostro computer di casa
dal browser (è un linguaggio client side o lato client).
Inoltre è un linguaggio di scripting non compilato: questo significa che la sintassi JavaScript si può scrivere
direttamente dentro la pagina HTML, senza bisogno di produrre alcun file compilato: è in un certo senso
un linguaggio open-source. Si può, infatti, visualizzare in qualsiasi momento il codice di una pagina HTML
e leggere le righe di sintassi JavaScript. Dire che è un linguaggio di scripting sottintende dunque il fatto
che sia un linguaggio interpretato: come abbiamo visto non esiste nessun compilatore, ma è direttamente il
browser, tramite un apposito motore di scripting (cioè di visualizzazione), che legge le parti di codice Ja-
vaScript.
È utile poi sottolineare che JavaScript non è Java. Il fatto che i due linguaggi abbiano nomi simili è solo
una trovata di marketing, dovuta all'alleanza tra Netscape e Sun. Una trovata che nel corso degli anni, a
dire la verità, ha generato soltanto confusione. Oggi con Java si realizzano programmi (come StarOffice e
OpenOffice), applet (ma sono in disuso) e applicazioni lato server (J2EE, servlet, JSP...), tutte cose che
con JavaScript lato-client si riesce, purtroppo, a fare. Con JavaScript è possibile intervenire “solo” sulle
pagine web. JavaScript e Java si assomigliano un po’ nella sintassi (nel modo di richiamare oggetti e le loro
proprietà tramite il “.”), ma l'analogia termina lì. In realtà si tratta di due mondi complementari, di due
linguaggi con potenzialità e funzioni completamente differenti.
Perché usare JavaScript, allora, visto che parte svantaggiato già in partenza? Il suo lato interessante è nel
campo di applicazione: oggi, in ogni sito web che si rispetti, c’è sempre un po’ di JavaScript. Con esso si
possono eseguire un’infinità di operazioni che il semplice HTML non permette. Ad esempio roll-over, a-
prire nuove finestre secondarie (pop-up windows) ma, soprattutto, effettuare controlli sui moduli — fon-
damentale, come vedrete anche per la nostra implementazione, per verificare l'input dell'utente —, ma an-
che eseguire azioni “a tempo” («dopo 5 secondi vai a quella pagina»), aggiungere effetti “dinamici” (come
menù a discesa o a comparsa), modificare il contenuto di una pagina. Dire che JavaScript è parte integran-
te del web, significa affermare, dunque, che è interpretabile da qualsiasi sistema operativo (sia esso
Implementazione in Javascript del metodo di Vigenère

Windows, Mac, Linux, anche in una versione obsoleta) dotato di un qualsiasi browser che lo supporta, di
conseguenza, la sua compatibilità risulta pressoché universale.
Infine, la sua sintassi risulta facilmente apprendibile. Motivo che rende JavaScript ottimo banco di prova,
palestra di allenamento, esperienza pedagogica per un successivo sviluppo delle abilità di programmazio-
ne.

2. Il cifrario di Vigenère.
Dopo aver compreso, per sommi capi, cosa sia e a cosa serve JavaScript, non mi dilungo in questa sede a
commentare l’origine, la storia e i limiti del cifrario polialfabetico di Vigenère, ma ritengo sia utile richia-
marne in breve la logica, in modo da comprendere più facilmente come è stato scritto l’algoritmo. Mi ri-
chiamo a questo esempio1.
Supponiamo di lavorare con l’alfabeto di 26 lettere e di voler cifrare il seguente testo usando il codice di
Vigenère.

                                     sono hormai trenta anni che per haver spie mi truovo qui

Scegliamo innanzitutto una chiave segreta, ad esempio la parola sole, e quindi riscriviamo il testo in chiaro
in blocchi che contengono un numero di lettere pari a quello della chiave ossia in blocchi di quattro lettere
come nella Tabella 1.

                                     s        o        l      e
                                     s        o        n      o
                                     h        o        r      m
                                     a        i        t      r
                                     e        n        t      a
                                     a        n        n      i
                                     c        h        e      p
                                     e        r        h      a
                                     v        e        r      s
                                     p        i        e      m
                                     i        t        r      u
                                     o        v        o      q
                                     u        i        x      y
Tabella 1. Codice di Vigenère - testo chiaro

Nell’alfabeto di 26 lettere che abbiamo scelto la chiave sole corrisponde alla quaterna di numeri 18 − 14 −
11 − 4 (s è la lettera 18, o la lettera 14 ecc.). Consideriamo allora la quaterna di funzioni di cifratura di Ce-
sare (f18, f14, f11, f4) ed utilizziamo ciascuna di esse per cifrare rispettivamente la prima, la seconda, la terza e
la quarta colonna del messaggio a blocchi di Tabella 2.

                                     f18,     f14,     f11,   f4
                                     k        c         y      s
                                     z        c        c      q
                                     s        w        e       v
                                     w        b        e      e
                                     s        b        y      m
                                     u        v        p      t
                                     w        f        s      e
                                     n        s        c      w
                                     h        w        p      q

1
  L’esempio è quello pubblicato in Crittografia per studenti, a cura di Andrea Centomo e Francesca Mantese. Rimando alla stessa
pubblicazione per comprendere il funzionamento del cifrario di Cesare.
                                                                   2
A. Dal Maso

                               a       h        c        y
                               g       j        z        u
                               m       w        i        c
Tabella 2. Codice di Vigenère - testo cifrato

La sostituzione polialfabetica operata dal codice di Vigenère rende più complessa la decrittazione dei mes-
saggi ma il metodo presenta delle debolezze che via via hanno condotto al suo superamento. Il primo a
pubblicare un metodo di decrittazione del codice di Vigenère fu il colonnello prussiano F. Kasiski nel
1863.

3. L’implementazione.
Dopo queste premesse, veniamo alla vera e propria implementazione, la cui sorgente è il Listato 3. Le righe
di codice si possono scrivere con un qualsiasi editor di testo (va benissimo il “Blocco Note” di Windows).
Vanno salvate poi in formato HTML (le cui principali estensioni sono .htm o .html) in modo che siano
riconosciute come tali dal sistema operativo. Il codice sorgente sarà sempre visualizzabile con il comando
“mostra sorgente” o “mostra HTML” di qualsiasi browser. In grigio sono indicati i commenti di spiega-
zione.
Il vero e proprio codice è quello contenuto nel tag2 , che va inserito all’inizio del documento
(vedi più avanti per la spiegazione), mentre gli altri tag costituiscono la pagina stessa. Anzi tutto, abbiamo
bisogno di creare un modulo (tag , v. r. 67), proprio come quelli prestampati, in cui inserire delle
caselle di testo, attraverso il tag  (v. dalla r. 74) del linguaggio HTML. Qui l’utente potrà pre-
cisare (attraverso una semplice digitazione) l’alfabeto che si intende usare nel messaggio, il messaggio stes-
so da crittare che chiameremo input, e una parola chiave, da cui ricaveremo le nostre funzioni di crittazio-
ne. Il messaggio crittato sarà indicato con output. Poi costruiamo dei pulsanti, (tag , righe 81-86) che richiameranno l’operazione del nostro algoritmo da eseguire.
Dopo aver considerato la struttura HTML della pagina, analizziamo il codice. Intitoliamo il nostro algo-
ritmo Vigenere, gli argomenti della funzione, o meglio le variabili utilizzate, saranno input, chiave,
output e crypter. Quest’ultima, che è una variabile booleana, se sarà vera (true, e tale valore le viene
attribuito quando si cliccherà su “Cifra”) indicherà che bisogna crittare, se falsa (false, valore attribuito
quando il clic è effettuato su “Decifra”), al contrario, decrittare.
Alcune operazioni preliminari. Per prima cosa, recuperiamo il nostro alfabeto inserendolo nella variabile
omonima, mentre inseriamo nella variabile alfabetoLunghezza il numero dei caratteri dello stesso alfa-
beto. Poi, verifichiamo che l’utente abbia inserito la chiave del messaggio (righe 14-31). Se manca, com-
parirà un messaggio d’errore che inviterà a ripetere l’operazione (attraverso il metodo alert()).
Veniamo ora alla parte più interessante. Puliamo anzi tutto il campo output in cui comparirà il messaggio
cifrato. Poi creiamo la variabile chiave_index che indicherà la posizione della chiave in cui ci si trova
(per es., per “sole”, se ci troveremo alla lettera “o”, chiave_index varrà 1), precisiamo di trovarci
all’inizio della chiave (imponiamo, infatti, a chiave_index il valore 0). Dopo di che, ripetiamo per ogni
lettera del messaggio (con un ciclo for, dalla riga 37) l’operazione di crittatura, con la relativa funzione
dipendente dalla posizione della chiave in cui ci troviamo. Nella variabile Lettera, va il carattere alla po-
sizione del messaggio in cui ci troviamo, i, nella variabile nLettera va, invece, il numero della lettera
dell’alfabeto alla posizione i, ricavato dalla sua posizione nella stringa alfabeto (si parte sempre da 0).
Poi, se bisogna crittare, aggiungo al numero della lettera, il numero della lettera nella posizione della chia-
ve (applico cioè la mia f), se bisogna decrittare, invece, sottraggo al numero della lettera il numero della

2
  Con il termine “tag” si indicano i comandi dell’HTML. I “tag” possono venire aperti e/o chiusi. La sintassi dell’apertura è que-
sta: , quella di chiusura è la seguente . Facciamo un esempio, se desidero che il browser scriva in grassetto, digiterò
testo da scrivere in grassetto. Alcuni tag presentano degli attributi, che sono ulteriori proprietà.
                                                              3
Implementazione in Javascript del metodo di Vigenère

lettera nella posizione della chiave (applicando f—1 ovvero la funzione inversa). Aggiungo, ancora, al nume-
ro della lettera in output il numero totale di segni dell'alfabeto, senza dimenticare che il dominio della fun-
zione è Zn, ovvero ZalfabetoLunghezza, cioè, nel nostro esempio, Z26 , e quindi che devo tornare indietro ogni 26
caratteri dell’alfabeto (il resto di una certa divisione si ottiene con l’operazione %=3, più conosciuta come
“mod”).
Ancora — ma abbiamo, con questo, finito — aggiungiamo al messaggio criptato la lettera che abbiamo
appena codificato (r. 56), e, al prossimo giro, indichiamo di avanzare di una lettera nella chiave, cioè di
cambiare funzione di crittazione o decrittazione.
Prima di chiudere il tag  ricordiamoci di chiudere con le parentesi graffe anche i vari blocchi if,
for e la stessa funzione, in modo da evitare errori di sintassi.

Listato 3. Implementazione Javascript del metodo di Vigenère

                   Vigenère
5
A. Dal Maso

50                           nLettera += alfabetoLunghezza;
                             //torno indietro ogni numero totale di segni dell'alfabeto
                             nLettera %= alfabetoLunghezza;
                             //aggiungo alla stringa "output" la lettera codificata
                             output.value+=alfabeto.charAt(nLettera);
55                           //al prossimo giro, dico di avanzare di una lettera nella chiave
                             chiave_index = (chiave_index+1) % chiaveLunghezza;
                     }
             }
     }
60
     //-->
     
65    
     Metodo di Vigenère
     Inserire la chiave, il messaggio da crittare o
     decrittare nell'apposito campo. Il programma accetta solo i caratteri inseriti
     nel campo "alfabeto".
70
     Alfabeto:ABCDEFGHIJKLMNOPQRSTUVWXYZ

     Testo da codificare:
75
     Chiave:

     Testo codificato:
85
     ©2007 Alessandro Dal Maso.
     
90

Se tutto funziona correttamente (controllare la sintassi, i nomi delle variabili, ecc. non è superfluo) questo
dovrebbe essere l’aspetto della finestra del browser (v. figura 4). Ora non resta che eseguire un test di pro-
va riempendo tutti i campi richiesti e cliccando su “Codifica con Vigenère”. È opportuno ricordare che lo
script accetta solamente i caratteri digitati nel campo alfabeto.

                                                    5
Implementazione in Javascript del metodo di Vigenère

Figura 4. Implementazione Javascript del metodo di Vigenère: il file visualizzato con Internet Explorer.

                                                              6
Puoi anche leggere