blob: 4999c812aa2b16e990ea0a1f598f85493ec4fa40 [file] [log] [blame]
Guido van Rossum470be141995-03-17 16:07:09 +00001\section{Built-in Module \sectcode{rotor}}
Guido van Rossume47da0a1997-07-17 16:34:52 +00002\label{module-rotor}
Guido van Rossum5fdeeea1994-01-02 01:22:07 +00003\bimodindex{rotor}
4
Guido van Rossum16d6e711994-08-08 12:30:22 +00005This module implements a rotor-based encryption algorithm, contributed by
6Lance Ellinghouse. The design is derived from the Enigma device, a machine
7used during World War II to encipher messages. A rotor is simply a
8permutation. For example, if the character `A' is the origin of the rotor,
9then a given rotor might map `A' to `L', `B' to `Z', `C' to `G', and so on.
10To encrypt, we choose several different rotors, and set the origins of the
11rotors to known positions; their initial position is the ciphering key. To
12encipher a character, we permute the original character by the first rotor,
13and then apply the second rotor's permutation to the result. We continue
14until we've applied all the rotors; the resulting character is our
15ciphertext. We then change the origin of the final rotor by one position,
16from `A' to `B'; if the final rotor has made a complete revolution, then we
17rotate the next-to-last rotor by one position, and apply the same procedure
18recursively. In other words, after enciphering one character, we advance
19the rotors in the same fashion as a car's odometer. Decoding works in the
20same way, except we reverse the permutations and apply them in the opposite
21order.
22\index{Ellinghouse, Lance}
23\indexii{Enigma}{cipher}
24
25The available functions in this module are:
26
27\renewcommand{\indexsubitem}{(in module rotor)}
28\begin{funcdesc}{newrotor}{key\optional{\, numrotors}}
Guido van Rossum6bb1adc1995-03-13 10:03:32 +000029Return a rotor object. \var{key} is a string containing the encryption key
Guido van Rossum16d6e711994-08-08 12:30:22 +000030for the object; it can contain arbitrary binary data. The key will be used
31to randomly generate the rotor permutations and their initial positions.
32\var{numrotors} is the number of rotor permutations in the returned object;
33if it is omitted, a default value of 6 will be used.
34\end{funcdesc}
35
36Rotor objects have the following methods:
37
38\renewcommand{\indexsubitem}{(rotor method)}
Barry Warsaw67170301997-01-02 19:48:00 +000039\begin{funcdesc}{setkey}{key}
40Sets the rotor's key to \var{key}.
Guido van Rossum16d6e711994-08-08 12:30:22 +000041\end{funcdesc}
42
43\begin{funcdesc}{encrypt}{plaintext}
Guido van Rossum6bb1adc1995-03-13 10:03:32 +000044Reset the rotor object to its initial state and encrypt \var{plaintext},
Guido van Rossum16d6e711994-08-08 12:30:22 +000045returning a string containing the ciphertext. The ciphertext is always the
46same length as the original plaintext.
47\end{funcdesc}
48
49\begin{funcdesc}{encryptmore}{plaintext}
Guido van Rossum6bb1adc1995-03-13 10:03:32 +000050Encrypt \var{plaintext} without resetting the rotor object, and return a
Guido van Rossum16d6e711994-08-08 12:30:22 +000051string containing the ciphertext.
52\end{funcdesc}
53
54\begin{funcdesc}{decrypt}{ciphertext}
Guido van Rossum6bb1adc1995-03-13 10:03:32 +000055Reset the rotor object to its initial state and decrypt \var{ciphertext},
Guido van Rossum16d6e711994-08-08 12:30:22 +000056returning a string containing the ciphertext. The plaintext string will
57always be the same length as the ciphertext.
58\end{funcdesc}
59
60\begin{funcdesc}{decryptmore}{ciphertext}
Guido van Rossum6bb1adc1995-03-13 10:03:32 +000061Decrypt \var{ciphertext} without resetting the rotor object, and return a
Guido van Rossum16d6e711994-08-08 12:30:22 +000062string containing the ciphertext.
63\end{funcdesc}
64
65An example usage:
66\bcode\begin{verbatim}
67>>> import rotor
68>>> rt = rotor.newrotor('key', 12)
69>>> rt.encrypt('bar')
70'\2534\363'
71>>> rt.encryptmore('bar')
72'\357\375$'
73>>> rt.encrypt('bar')
74'\2534\363'
75>>> rt.decrypt('\2534\363')
76'bar'
77>>> rt.decryptmore('\357\375$')
78'bar'
79>>> rt.decrypt('\357\375$')
80'l(\315'
81>>> del rt
82\end{verbatim}\ecode
Guido van Rossume47da0a1997-07-17 16:34:52 +000083%
Guido van Rossum16d6e711994-08-08 12:30:22 +000084The module's code is not an exact simulation of the original Enigma device;
85it implements the rotor encryption scheme differently from the original. The
86most important difference is that in the original Enigma, there were only 5
87or 6 different rotors in existence, and they were applied twice to each
88character; the cipher key was the order in which they were placed in the
89machine. The Python rotor module uses the supplied key to initialize a
90random number generator; the rotor permutations and their initial positions
91are then randomly generated. The original device only enciphered the
92letters of the alphabet, while this module can handle any 8-bit binary data;
93it also produces binary output. This module can also operate with an
94arbitrary number of rotors.
95
96The original Enigma cipher was broken in 1944. % XXX: Is this right?
97The version implemented here is probably a good deal more difficult to crack
98(especially if you use many rotors), but it won't be impossible for
99a truly skilful and determined attacker to break the cipher. So if you want
100to keep the NSA out of your files, this rotor cipher may well be unsafe, but
101for discouraging casual snooping through your files, it will probably be
Fred Drake6862b461998-01-13 19:03:36 +0000102just fine, and may be somewhat safer than using the \UNIX{} \file{crypt}
Guido van Rossum16d6e711994-08-08 12:30:22 +0000103command.
104\index{National Security Agency}\index{crypt(1)}
105% XXX How were Unix commands represented in the docs?