Questo modulo implementa un algoritmo di crittazione basato su rotor, dovuto a Lance Hellinghouse. Il progetto deriva dal dispositivo Enigma, una macchina usata durante la II Guerra Mondiale per cifrare i messaggi. Un rotor è semplicemente una permutazione. Ad esempio, se il carattere `A' è l'origine del rotor, allora un dato rotor può mappare `A' con `L', `B' con `Z', `C' con `G' e così via. Per crittare si scelgono numerosi rotor differenti e si impostano le origini dei rotor sulle posizioni conosciute; la loro posizione iniziale è la chiave di cifratura. Per cifrare un carattere si permuterà il carattere originale con il primo rotor, quindi si applicherà al risultato la permutazione del secondo rotor. Si andrà avanti fino ad aver applicato tutti i rotor. Il carattere risultante è il nostro testo cifrato. A questo punto si cambia l'origine dell'ultimo rotor di una posizione, da `A' a `B'; se l'ultimo rotor ha compiuto un giro completo, allora si ruota di una posizione il penultimo rotor, applicando ripetutamente la stessa procedura. In altre parole, dopo aver cifrato un carattere, si fanno avanzare i rotor allo stesso modo del contachilometri di un auto. La decodifica funziona nello stesso modo, tranne per il fatto che si invertono le permutazioni e le si applicano in ordine inverso.
In questo modulo le funzioni disponibili sono:
key[, numrotors]) |
Gli oggetti rotor possiedono i seguenti metodi:
key) |
plaintext) |
plaintext) |
ciphertext) |
ciphertext) |
Ecco un esempio:
>>> import rotor >>> rt = rotor.newrotor('key', 12) >>> rt.encrypt('bar') '\xab4\xf3' >>> rt.encryptmore('bar') '\xef\xfd$' >>> rt.encrypt('bar') '\xab4\xf3' >>> rt.decrypt('\xab4\xf3') 'bar' >>> rt.decryptmore('\xef\xfd$') 'bar' >>> rt.decrypt('\xef\xfd$') 'l(\xcd' >>> del rt
Il codice del modulo non è l'esatta simulazione del dispositivo Enigma originale; lo schema di crittazione del rotor è implementato in modo diverso dall'originale. La principale differenza è che nell'Enigma originale si avevano in funzione solo 5 o 6 rotor diversi che venivano applicati due volte per ogni carattere; la chiave di cifratura era l'ordine in cui essi venivano posizionati nella macchina. Il modulo rotor di Python usa la chiave fornita per inizializzare un generatore di numeri casuali; le permutazioni dei rotor e le loro posizioni iniziali sono quindi generate casualmente. L'apparecchio originale cifrava solo le lettere dell'alfabeto, mentre questo modulo può gestire qualsiasi dato binario a 8 bit e binario può essere anche il suo output. Inoltre questo modulo può lavorare con un indefinito numero di rotor.
Il codice Enigma originale fu infranto nel 1944. La versione qui implementata ha un algoritmo probabilmente più impegnativo da rompere (specialmente se si usano più rotor), ma non sarebbe impossibile violarne il codice da parte di un attaccante molto abile e ben determinato. Quindi, se si vuole tenere l'NSA alla larga dai file, questo codice rotor potrebbe non essere sicuro ma, probabilmente, andrà più che bene per scoraggiare eventuali sbirciate ai file, garantendo un po' più di sicurezza rispetto all'uso del comando Unix crypt.
Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.