Click here to Skip to main content
11,718,289 members (84,136 online)
Click here to Skip to main content

Enigma emulator in C#

, 29 Apr 2011 CPOL 117.3K 3.8K 48
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

You may also be interested in...

Comments and Discussions

 
QuestionNullReferenceException Pin
Member 1122029810-Aug-15 0:27
professionalMember 1122029810-Aug-15 0:27 
NewsArduino Enigma Machine Simulator Pin
ArduinoEnigma24-Nov-14 16:43
memberArduinoEnigma24-Nov-14 16:43 
QuestionThis is good, but there's one step missing Pin
warny9-Jun-14 23:13
memberwarny9-Jun-14 23:13 
GeneralMy vote of 3 Pin
KatsuneShinsengumi16-Jan-14 2:55
memberKatsuneShinsengumi16-Jan-14 2:55 
Questionyou need more of this subject and other programs of this Enigma Machine Pin
Member 963960218-Dec-13 22:35
memberMember 963960218-Dec-13 22:35 
Bugvery small "bug" in the Settings.cs [modified] Pin
fred edison24-Aug-11 2:46
memberfred edison24-Aug-11 2:46 
GeneralQuick note on Enigma! Pin
egomezb29-Apr-11 13:14
memberegomezb29-Apr-11 13:14 
GeneralRe: Quick note on Enigma! [modified] Pin
Selvin1-May-11 22:19
memberSelvin1-May-11 22:19 
Generalsmall bug with rotor V [modified] Pin
fred edison19-Dec-08 7:07
memberfred edison19-Dec-08 7:07 
GeneralRe: small bug with rotor V Pin
fred edison19-Dec-08 8:55
memberfred edison19-Dec-08 8:55 
GeneralRe: small bug with rotor V Pin
adi_clepcea28-Apr-11 21:33
memberadi_clepcea28-Apr-11 21:33 
GeneralThere is an error in the rotor rotation algorithm Pin
Member 149490626-Sep-08 3:43
memberMember 149490626-Sep-08 3:43 
GeneralEngima coded message Pin
rah200618-Aug-08 8:24
memberrah200618-Aug-08 8:24 
GeneralRe: Engima coded message Pin
rah200620-Aug-08 3:27
memberrah200620-Aug-08 3:27 
GeneralI used your rotor class in my program to brute force Enigma Pin
Didier Stevens28-Dec-06 1:37
memberDidier Stevens28-Dec-06 1:37 
GeneralRe: I used your rotor class in my program to brute force Enigma Pin
adi_clepcea28-Dec-06 1:52
memberadi_clepcea28-Dec-06 1:52 
GeneralRotors' Table Pin
mrhadiahmadi6-Aug-05 1:11
membermrhadiahmadi6-Aug-05 1:11 
GeneralRe: Rotors' Table Pin
adi_clepcea6-Aug-05 7:17
memberadi_clepcea6-Aug-05 7:17 
GeneralRe: Rotors' Table Pin
Anonymous8-Aug-05 1:18
sussAnonymous8-Aug-05 1:18 
GeneralRe: Rotors' Table Pin
adi_clepcea8-Aug-05 17:43
memberadi_clepcea8-Aug-05 17:43 
GeneralStrange problem Pin
ROCKISDEAD4-May-05 23:15
memberROCKISDEAD4-May-05 23:15 
GeneralRe: Strange problem Pin
adi_clepcea8-May-05 19:21
memberadi_clepcea8-May-05 19:21 
GeneralRe: Strange problem Pin
adi_clepcea9-May-05 19:13
memberadi_clepcea9-May-05 19:13 
GeneralRe: Strange problem Pin
ROCKISDEAD9-May-05 20:16
memberROCKISDEAD9-May-05 20:16 
GeneralButton image files are missing Pin
SecondNature13-Apr-05 6:42
memberSecondNature13-Apr-05 6:42 

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
Web03 | 2.8.150901.1 | Last Updated 29 Apr 2011
Article Copyright 2005 by adi_clepcea
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid