TITLE

Crypt::Enigma - Perl implementation of the Enigma cipher

DESCRIPTION

This module is a complete working Perl implementation of the Enigma Machine used during World War II. The cipher calculations are based on actual Enigma values and the resulting ciphered values are as would be expected from an Enigma Machine.

The implementation allows for all of the Rotors and Reflectors available to the real world Enigma to be used. A Steckerboard has also been implemented, allowing letter substitutions to be made.

The list of available rotors is as follows:

RotorI, RotorII, RotorIII, RotorIV, RotorV, RotorVI, RotorVII, RotorVIII, RotorBeta, RotorGamma.

The list of available reflectors is as follows:

ReflectorB, ReflectorBdunn, ReflectorC, ReflectorCdunn.

As with the real world Enigma, a minimum of 3 and a maximum of 5 rotors along with 1 reflector may be defined for each encryption/decryption.

SYNOPSIS

use Crypt::Enigma;

my $args = {
  rotors       => [ 'RotorI', 'RotorII', 'RotorIII' ],
  startletters => [ 'A', 'B', 'C' ],
  ringsettings => [ '0', '5', '10' ],
  reflector    => 'ReflectorB',
};

$enigma = Crypt::Enigma->new( $args );

# Change rotor settings
$enigma->setRotor( 'RotorVI', 'Z', '3', 1 );

# Set the letter substitutions
$enigma->setSteckerBoard( [ 'G', 'C' ] );

# Encode the plaintext
$cipher_text = $enigma->cipher( $plain_text );

# Decode the ciphertext 
$plain_text = $enigma->cipher( $cipher_text );

CLASS INTERFACE

CONSTRUCTORS

A Crypt::Enigma object is created by calling the new constructor either with, or without arguments. If the constructor is called without arguments the defaults values will be used (unless these are set using the setRotor method detailed below).

new ( ARGS )

The arguments which can be used to create a Crypt::Enigma instance are as follows:

-rotors
-startletters
-ringsettings
-stecker
-reflector

The first four are to be passed in as references to arrays, while the last argument is a scalar.

OBJECT METHODS

cipher ( ARGS )

This method crypts and decrypts the supplied argument containing a string of text. Any characters which are not from the English alphabet (punctuation, numerics, etc) are ignored.

setRotor ( ARGS )

The setRotor method is called to set a rotor of the Enigma to specific settings. The arguments to be passed in are as follows:

-rotor name (eg. RotorI, RotorII, etc)
-initial start letter (eg. 'A', 'B', etc)
-ring setting (eg. '0', '1', etc)
-rotor number (eg. '1', '2', etc)

If incorrect values are passed in, the default settings are used.

setReflector ( ARG )

The setReflector method is called to set the reflector of the Enigma Machine. The argument to be passed in is a string containing the name of any of the available reflectors.

setSteckerBoard ( ARGS )

The Steckerboard is set by calling the setSteckerBoard method and supplying a reference to an array as the first argument.

The array should contain a set of letter pairs, such as:

[ 'A', 'B', 'C', 'D' ];

In this example, each instance of the letter 'A' will be replaced with the letter 'B' (and vice-versa) and each instance of the letter 'C' will be replaced with the letter 'D' (and vice-versa).

getRotorNames

Returns an array containing the rotor names currently defined for encryption/decryption.

getStartLetters

Returns an array containing the start letters currently defined for encryption/decryption.

getRingSettings

Returns an array containing the ring settings currently defined for encryption/decryption.

getReflector

Returns a string containing the name of the reflector currently defined for encryption/decryption.

dumpSettings

This method will print out (to STDERR) the current rotor settings.

setDebug ( ARG )

The setDebug method is used to set the debug value of the Crypt::Enigma object. The value of the argument can be either 1 (debug on) or 0 (debug off). The debug value is set to 0 by default.

KNOWN BUGS

None, but that does not mean there are not any.

AUTHOR

Alistair Francis, <cpan@alizta.com>