15.5 rotor -- Crittazione e decrittazione di tipo Enigma

Deprecato dalla versione 2.3 di Python. L'algoritmo di crittazione non è sicuro.

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:

newrotor( key[, numrotors])
Restituisce un oggetto rotor. key è una stringa contenente la chiave di cifratura dell'oggetto; può contenere dati binari arbitrari ma non byte null. La chiave verrà usata per generare casualmente le permutazioni del rotor e le loro posizioni iniziali. numrotors è il numero delle permutazioni del rotor dell'oggetto restituito. Se omesso verrà usato il valore predefinito 6.

Gli oggetti rotor possiedono i seguenti metodi:

setkey( key)
Imposta key come chiave del rotor. key non dovrà contenere byte null.

encrypt( plaintext)
Reinizializza l'oggetto rotor e critta plaintext, restituendo una stringa contenente il testo cifrato. Il testo cifrato è sempre di lunghezza uguale al testo in chiaro plaintext.

encryptmore( plaintext)
Critta plaintext senza resettare l'oggetto rotor, e restituisce una stringa contenente testo cifrato.

decrypt( ciphertext)
Reinizializza l'oggetto rotor e decritta ciphertext, restituendo una stringa contenente il testo in chiaro. La stringa di testo in chiaro avrà sempre la stessa lunghezza del testo cifrato.

decryptmore( ciphertext)
Decritta ciphertext senza resettare l'oggetto rotor e restituisce una stringa contenente il testo in chiaro.

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.