Implementazione JavaScript del Metodo di Vigenère
←
→
Trascrizione del contenuto della pagina
Se il tuo browser non visualizza correttamente la pagina, ti preghiamo di leggere il contenuto della pagina quaggiù
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