1. La frase chiave dev'essere PIU' LUNGA della frase in chiaro. (L'applet funziona anche se la frase chiave è piu' corta, ma il risultato è assolutamente insicuro).
2. Ogni volta si deve usare una chiave diversa (utilizzare sempre una stessa chiave, anche se robusta, è poco sicuro).
Sebbene un testo lungo quanto la frase in chiaro possa essere un buon tentativo di chiave, è ancora un metodo imperfetto.
Un buon metodo potrebbe essere usare un output sufficientemente disordinato (molti file che usiamo correntemente sono disordinati nella struttura: file compressi, file contenenti immagini, suoni o filmati) e ricavare in qualche modo una sequenza di numeri tra 32 e 123 che attraverso lo Unicode generi un testo da copiare/incollare nell'applet. Rimane ancora il problema di scambiare la frase chiave con il destinatario, ma questo è un altro discorso.
Il sistema diventa perfetto quando si è in grado di generare un output pseudo-casuale crittograficamente sicuro. Si trovano molti generatori di numeri pseudo-casuali (provane uno). L'ideale per il mittente e il destinatario sarebbe generare indipendentemente la sequenza pseudo-casuale a partire da un parametro noto solo a loro due.
Cosa vuol dire output pseudo-casuale crittograficamente sicuro? Vuol dire che la sequenza di caratteri deve resistere ai più forti test statistici (per esempio il test universale di Maurer). JaVi fornisce un test che valuta la forza della chiave immessa (il test di Maurer è il migliore che io conosca, può darsi che lo implementerò in futuro; se qualcuno conosce una implementazione Java me lo faccia sapere!).
JaVi, nella classe Vigenere, fa un test che valuta le frequenze nella chiave delle sotto-stringhe di lunghezza da 1 a 30 . L'idea è che una chiave casuale sufficientemente lunga avrà le frequenze di ogni lettera molto vicine alla frequenza media (cioè 1/92, perchè in JaVi si usano 92 simboli alfanumerici dello Unicode).
E cosi' saranno le frequenze delle stringhe di lunghezza 2 ("aa","ab","ac", ecc.), lunghezza 3 e cosi' via. Per misurare di quanto si allontanano le frequenze ho usato la deviazione standard, cioè la radice quadrata della varianza. La varianza è data dalla formula:
n e' il numero di stringhe possibili per la lunghezza fissata
Quindi prima calcolo la deviazione standard per le stringhe di lunghezza 1, cioè tutti i caratteri nell'intervallo Unicode 32-123; poi per le stringhe di lunghezza 2, 3, ecc.. fino alla lunghezza della chiave o comunque fino a un massimo di 30. A questo punto ho un array con queste deviazioni standard: per essere più selettivo considero solo la peggiore, ovvero la piu' elevata, e ottengo la forza desiderata in percentuale. Questo metodo comunque non può valutare molto precisamente delle differenze minime tra chiavi forti: in pratica se la valutazione sara' dal 95% in su non è detto che altri test più forti non trovino invece dei difetti. Per essere più sicuri consiglio quindi di cercare in rete altri test come quello di Maurer.