Click here to Skip to main content
Click here to Skip to main content

Enigma emulator in C#

, 29 Apr 2011 CPOL
Rate this:
Please Sign up or sign in to vote.
This article shows the inner workings of the German Enigma machine used during the WWII, translated to C#.

Enigma emulator main image

Enigma emulator rotor configuration

Introduction

This article shows how to implement an Enigma like cryptography using C#. This kind of cryptography system was used until the 70's. The most famous use of it was by the German army during the WWII. The breaking of this code led the allies to victory. This cryptography method can still be secure enough for use in non critical systems. If the Germans would have used the method with care, maybe the allies would not have discovered their secrets.

Background

The reader might be interested in some general information about Enigma. These links could help you:

Using the code

This code is a complete program that shows the inner workings of such a machine. If the user wants to understand more about the Enigma machine, then he/she would need to Google for more information. This code shows how simple it is to emulate such complicate wirings as those of the Enigma machine, using a modern programming language.

The machine has at least three rotors, each one having the alphabet written on it. The rotors has a visible part which consists of the alphabet and a part that has other letters which are linked to the first one by wires. The three rotors are arranged one after the other from right to left. The rotor is not static.

This kind of machine was a combination of electrical and mechanical cryptography system. Basically, when the user of the machine pressed a key, the current would go to the first rotor to the letter corresponding to that key (let's say 'A'). The wirings of the wheel would lead to an output letter from the first rotor with a different value, let's say 'D', this impulse would then go to the second rotor, and the same thing would happen there, and in the third rotor. From there, the impulse would go to a last wheel - that is named the 'reflector'. This wheel (rotor) is the only non rotating wheel. The impulse would go to this wheel and from here it would return to the third rotor, and make its way backwards. From the first rotor, the current would illuminate a LED under a panel. This would be the encrypted letter.

This is not all. At each key press, the first rotor would rotate with one position so that the output letter would not be the same when you press the same key twice. The second rotor would rotate one position once at every 28 rotations of the first rotor, and the third one once every 28 rotations of the second rotor. As I've said earlier, the reflector is the only static rotor. On some models, the second and third rotor would rotate more than once at every 28 rotations of the previous rotor.

To decrypt the data, you just had to set the rotors at the exact initial position as the rotors on the machine that produced that output and then type in the encrypted data.

There were several rotors and they could be changed. To complicate things even more, the military version had a front panel with letters were you could interconnect two letters so that each time a letter would occur, it would be replaced with the other one. To show this kind of complicated inner workings, the following C# code would suffice:

//encrypt the data in the upper text box, and put the result in the lower one
//this code is taking the data in one text box 
//and puts the crypted/decrypted result
//in another one.
void Button1Click(object sender, System.EventArgs e)
{
   char[] chIn = txtInit.Text.ToUpper().ToCharArray();
   txtFinal.Text = "";
   for(int i=0;i<chIn.Length;i++){
      //we only use the upper letters
      if(chIn[i]>=65 && chIn[i]<=90){
         rr.Move();
         rr.PutDataIn(chIn[i]);
         txtFinal.AppendText(""+rr.GetDataOut());
      }
   }
}

You can see that we only use the upper letters. That's because the existence of punctuation and spaces would help in the decryption of the message.

I've also created a rotor class which practically represents one rotor of the enigma machine. In this class, we have the methods Move which moves the rotor one position and the PutDataIn which emulates the sending of the electric signal to the first rotor. As you can see, we only send the data to the first rotor, which will send the data further down the chain.

Here is the code for this class:

using System;
using System.Text;
using System.Windows.Forms;

namespace Enigma
{

    public class Rotor
    {
        private string layout;
        private byte offset;
        private Rotor previous, next;
        private Label lbl;
        private char cIn = '\0', notchPos;

        public Rotor(string layout,Label lbl,char notchPos)
        {
            this.layout = layout;
            this.previous = previous;
            this.next = next;
            this.lbl = lbl;
            this.notchPos = notchPos;
            offset = 0;

        }

        public string GetLayout(){
            return layout;
        }

        public void SetNextRotor(Rotor next){
            this.next = next;
        }
        public void SetPreviousRotor(Rotor previous){
            this.previous = previous;
        }

        public char GetInverseCharAt(string ch){
            int pos = layout.IndexOf(ch);

            if(offset>pos){
                pos = 26 - (offset-pos);
            }else{
                pos = pos - offset;
            }

            if(previous!=null){
                pos = (pos+previous.GetOffset())%26;
            }

            return (char)(65+pos);
        }

        public int GetOffset(){
            return offset;
        }

        public char GetNotchPos(){
            return notchPos;
        }

        public void ResetOffset(){
            offset = 0;
        }

        public bool HasNext(){
            return next!=null;
        }

        public bool HasPrevious(){
            return previous!=null;
        }

        public void Move(){
            if(next==null){
                return;
            }
            offset++;
            if(offset==26){
                offset = 0;
            }

            if(next!=null && (offset+65) == ((notchPos-65)%26)+66){
                next.Move();
            }
            lbl.Text = ""+((char)(65+offset));
        }

        public void MoveBack(){
            if(offset==0){
                offset = 26;
            }
            offset--;

            lbl.Text = ""+((char)(65+offset));
        }

        public void PutDataIn(char s){
            cIn = s;
            char c = s;
            c = (char)(((c - 65) + offset) % 26 + 65);

            if(next!=null){
                c = layout.Substring((c-65),1).ToCharArray()[0];
                if((((c-65)+(-offset))%26 + 65)>=65){
                    c = (char)(((c-65)+(-offset))%26 + 65);
                }else{
                    c = (char)(((c-65)+(26+(-offset)))%26 + 65);
                }
                next.PutDataIn(c);

            }
        }

        public char GetDataOut(){
            char c = '\0';

            if(next!=null){
                c = next.GetDataOut();
                c = GetInverseCharAt(""+c);
            }else{ //only in the reflector case
                c = layout.Substring((cIn-65),1).ToCharArray()[0];
                c = (char)(((c - 65) + previous.offset)%26+65);

            }

            return c;
        }

    }
}

Points of Interest

Although it seems peculiar, the older the cryptographic algorithm, the safer it is. This is because it means that people have tested it and they did not found any way in. Maybe in a later article, I will show you how to implement an instant messenger that uses this cryptography technique.

History

  • Apr 29, 2011: Updated source code.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

adi_clepcea
Software Developer (Senior)
Romania Romania
No Biography provided

Comments and Discussions

 
NewsArduino Enigma Machine Simulator PinmemberArduinoEnigma24-Nov-14 17:43 
QuestionThis is good, but there's one step missing Pinmemberwarny10-Jun-14 0:13 
GeneralMy vote of 3 PinmemberKatsuneShinsengumi16-Jan-14 3:55 
Questionyou need more of this subject and other programs of this Enigma Machine PinmemberMember 963960218-Dec-13 23:35 
Bugvery small "bug" in the Settings.cs [modified] Pinmemberfred edison24-Aug-11 3:46 
GeneralQuick note on Enigma! Pinmemberegomezb29-Apr-11 14:14 
GeneralRe: Quick note on Enigma! [modified] PinmemberSelvin1-May-11 23:19 
Generalsmall bug with rotor V [modified] Pinmemberfred edison19-Dec-08 8:07 
GeneralRe: small bug with rotor V Pinmemberfred edison19-Dec-08 9:55 
GeneralRe: small bug with rotor V Pinmemberadi_clepcea28-Apr-11 22:33 
GeneralThere is an error in the rotor rotation algorithm PinmemberMember 149490626-Sep-08 4:43 
GeneralEngima coded message Pinmemberrah200618-Aug-08 9:24 
GeneralRe: Engima coded message Pinmemberrah200620-Aug-08 4:27 
GeneralI used your rotor class in my program to brute force Enigma PinmemberDidier Stevens28-Dec-06 2:37 
GeneralRe: I used your rotor class in my program to brute force Enigma Pinmemberadi_clepcea28-Dec-06 2:52 
GeneralRotors' Table Pinmembermrhadiahmadi6-Aug-05 2:11 
GeneralRe: Rotors' Table Pinmemberadi_clepcea6-Aug-05 8:17 
GeneralRe: Rotors' Table PinsussAnonymous8-Aug-05 2:18 
GeneralRe: Rotors' Table Pinmemberadi_clepcea8-Aug-05 18:43 
GeneralStrange problem PinmemberROCKISDEAD5-May-05 0:15 
GeneralRe: Strange problem Pinmemberadi_clepcea8-May-05 20:21 
GeneralRe: Strange problem Pinmemberadi_clepcea9-May-05 20:13 
GeneralRe: Strange problem PinmemberROCKISDEAD9-May-05 21:16 
GeneralButton image files are missing PinmemberSecondNature13-Apr-05 7:42 
GeneralRe: Button image files are missing Pinmemberadi_clepcea13-Apr-05 22:35 
GeneralAlgorithm strength PinmemberStealthyMark13-Apr-05 2:20 
GeneralRe: Algorithm strength Pinmemberadi_clepcea13-Apr-05 3:49 
GeneralCooooool PinsitebuilderUwe Keim13-Apr-05 1:11 
QuestionLED ???? PinmemberW. Kleinschmit12-Apr-05 22:43 
AnswerRe: LED ???? Pinmemberadi_clepcea13-Apr-05 3:52 
AnswerRe: LED ???? PinmemberGiles10-May-05 4:39 
GeneralRe: LED ???? PinmemberRyan Beesley2-Aug-05 23:58 
GeneralRe: LED ???? Pinmemberokmnji915-Jan-08 22:24 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web04 | 2.8.141216.1 | Last Updated 29 Apr 2011
Article Copyright 2005 by adi_clepcea
Everything else Copyright © CodeProject, 1999-2014
Layout: fixed | fluid