home *** CD-ROM | disk | FTP | other *** search
- <TITLE>rotor -- Python library reference</TITLE>
- Prev: <A HREF="../m/mpz" TYPE="Prev">mpz</A>
- Up: <A HREF="../c/cryptographic_services" TYPE="Up">Cryptographic Services</A>
- Top: <A HREF="../t/top" TYPE="Top">Top</A>
- <H1>12.3. Built-in Module <CODE>rotor</CODE></H1>
- This module implements a rotor-based encryption algorithm, contributed by
- Lance Ellinghouse. The design is derived from the Enigma device, a machine
- used during World War II to encipher messages. A rotor is simply a
- permutation. For example, if the character `A' is the origin of the rotor,
- then a given rotor might map `A' to `L', `B' to `Z', `C' to `G', and so on.
- To encrypt, we choose several different rotors, and set the origins of the
- rotors to known positions; their initial position is the ciphering key. To
- encipher a character, we permute the original character by the first rotor,
- and then apply the second rotor's permutation to the result. We continue
- until we've applied all the rotors; the resulting character is our
- ciphertext. We then change the origin of the final rotor by one position,
- from `A' to `B'; if the final rotor has made a complete revolution, then we
- rotate the next-to-last rotor by one position, and apply the same procedure
- recursively. In other words, after enciphering one character, we advance
- the rotors in the same fashion as a car's odometer. Decoding works in the
- same way, except we reverse the permutations and apply them in the opposite
- order.
- The available functions in this module are:
- <P>
- <DL><DT><B>newrotor</B> (<VAR>key</VAR>[, <VAR>numrotors</VAR>]) -- function of module rotor<DD>
- Return a rotor object. <VAR>key</VAR> is a string containing the encryption key
- for the object; it can contain arbitrary binary data. The key will be used
- to randomly generate the rotor permutations and their initial positions.
- <VAR>numrotors</VAR> is the number of rotor permutations in the returned object;
- if it is omitted, a default value of 6 will be used.
- </DL>
- Rotor objects have the following methods:
- <P>
- <DL><DT><B>setkey</B> () -- Method on rotor<DD>
- Reset the rotor to its initial state.
- </DL>
- <DL><DT><B>encrypt</B> (<VAR>plaintext</VAR>) -- Method on rotor<DD>
- Reset the rotor object to its initial state and encrypt <VAR>plaintext</VAR>,
- returning a string containing the ciphertext. The ciphertext is always the
- same length as the original plaintext.
- </DL>
- <DL><DT><B>encryptmore</B> (<VAR>plaintext</VAR>) -- Method on rotor<DD>
- Encrypt <VAR>plaintext</VAR> without resetting the rotor object, and return a
- string containing the ciphertext.
- </DL>
- <DL><DT><B>decrypt</B> (<VAR>ciphertext</VAR>) -- Method on rotor<DD>
- Reset the rotor object to its initial state and decrypt <VAR>ciphertext</VAR>,
- returning a string containing the ciphertext. The plaintext string will
- always be the same length as the ciphertext.
- </DL>
- <DL><DT><B>decryptmore</B> (<VAR>ciphertext</VAR>) -- Method on rotor<DD>
- Decrypt <VAR>ciphertext</VAR> without resetting the rotor object, and return a
- string containing the ciphertext.
- </DL>
- An example usage:
- <UL COMPACT><CODE>>>> import rotor<P>
- >>> rt = rotor.newrotor('key', 12)<P>
- >>> rt.encrypt('bar')<P>
- '\2534\363'<P>
- >>> rt.encryptmore('bar')<P>
- '\357\375$'<P>
- >>> rt.encrypt('bar')<P>
- '\2534\363'<P>
- >>> rt.decrypt('\2534\363')<P>
- 'bar'<P>
- >>> rt.decryptmore('\357\375$')<P>
- 'bar'<P>
- >>> rt.decrypt('\357\375$')<P>
- 'l(\315'<P>
- >>> del rt<P>
- </CODE></UL>
- The module's code is not an exact simulation of the original Enigma device;
- it implements the rotor encryption scheme differently from the original. The
- most important difference is that in the original Enigma, there were only 5
- or 6 different rotors in existence, and they were applied twice to each
- character; the cipher key was the order in which they were placed in the
- machine. The Python rotor module uses the supplied key to initialize a
- random number generator; the rotor permutations and their initial positions
- are then randomly generated. The original device only enciphered the
- letters of the alphabet, while this module can handle any 8-bit binary data;
- it also produces binary output. This module can also operate with an
- arbitrary number of rotors.
- <P>
- The original Enigma cipher was broken in 1944.
- The version implemented here is probably a good deal more difficult to crack
- (especially if you use many rotors), but it won't be impossible for
- a truly skilful and determined attacker to break the cipher. So if you want
- to keep the NSA out of your files, this rotor cipher may well be unsafe, but
- for discouraging casual snooping through your files, it will probably be
- just fine, and may be somewhat safer than using the Unix <FILE>crypt</FILE>
- command.
-