/enigma

Enigma machine

Primary LanguageTypeScriptThe UnlicenseUnlicense

Enigma Machine

Encrypt

Basic settings.

var input = 'ABCDEFGHIJKLMNOPQRSTUVWXYZAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBABCDEFGHIJKLMNOPQRSTUVWXYZ';
var output = 'BJELRQZVJWARXSNBXORSTNCFMEYHCXTGYJFLINHNXSHIUNTHEORXOPLOVFEKAGADSPNPCMHRVZCYECDAZIHVYGPITMSRZKGGHLSRBLHL';
var machine = new Enigma(['I', 'II', 'III'], 'B', [0, 0, 0], [0, 0, 0]);
assert.ok(output === machine.encrypt(input));

Varied rotors.

var input = 'ABCDEFGHIJKLMNOPQRSTUVWXYZAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBABCDEFGHIJKLMNOPQRSTUVWXYZ';
var output = 'FOTYBPKLBZQSGZBOPUFYPFUSETWKNQQHVNHLKJZZZKHUBEJLGVUNIOYSDTEZJQHHAOYYZSENTGXNJCHEDFHQUCGCGJBURNSEDZSEPLQP';
var machine = new Enigma(['VII', 'V', 'IV'], 'B', [10, 5, 12], [1, 2, 3]);
assert.ok(output === machine.encrypt(input));

Long input.

var input = new Array(500).fill('A').join('');
var output = ('YJKJMFQKPCUOCKTEZQVXYZJWJFROVJMWJVXRCQYFCUVBRELVHRWGPYGCHVLBVJEVTTYVMWKJFOZHLJEXYXRDBEVEHVXKQSBPYZN' +
    'IQDCBGTDDWZQWLHIBQNTYPIEBMNINNGMUPPGLSZCBRJULOLNJSOEDLOBXXGEVTKCOTTLDZPHBUFKLWSFSRKOMXKZELBDJNRUDUCO' +
    'TNCGLIKVKMHHCYDEKFNOECFBWRIEFQQUFXKKGNTSTVHVITVHDFKIJIHOGMDSQUFMZCGGFZMJUKGDNDSNSJKWKENIRQKSUUHJYMIG' +
    'WWNMIESFRCVIBFSOUCLBYEEHMESHSGFDESQZJLTORNFBIFUWIFJTOPVMFQCFCFPYZOJFQRFQZTTTOECTDOOYTGVKEWPSZGHCTQRP' +
    'GZQOVTTOIEGGHEFDOVSUQLLGNOOWGLCLOWSISUGSVIHWCMSIUUSBWQIGWEWRKQFQQRZHMQJNKQTJFDIJYHDFCWTHXUOOCVRCVYOHL');
var machine = new Enigma(['III', 'VI', 'VIII'], 'B', [3, 5, 9], [11, 13, 19]);
assert.ok(output === machine.encrypt(input));

Plug board

4 plugs.

var input = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA';
var output = 'QREBNMCYZELKQOJCGJVIVGLYEMUPCURPVPUMDIWXPPWROOQEGI';
var machine = new Enigma(['I', 'II', 'III'], 'B', [0, 0, 0], [0, 0, 0], 'AC FG JY LW');
assert.ok(output === machine.encrypt(input));

6 plugs.

var input = 'WRBHFRROSFHBCHVBENQFAGNYCGCRSTQYAJNROJAKVKXAHGUZHZVKWUTDGMBMSCYQSKABUGRVMIUOWAPKCMHYCRTSDEYTNJLVWNQY';
var output = 'FYTIDQIBHDONUPAUVPNKILDHDJGCWFVMJUFNJSFYZTSPITBURMCJEEAMZAZIJMZAVFCTYTKYORHYDDSXHBLQWPJBMSSWIPSWLENZ';
var machine = new Enigma(['IV', 'VI', 'III'], 'B', [0, 10, 6], [0, 0, 0], 'BM DH RS KN GZ FQ');
assert.ok(output === machine.encrypt(input));

10 plugs.

var input = 'RNXYAZUYTFNQFMBOLNYNYBUYPMWJUQSBYRHPOIRKQSIKBKEKEAJUNNVGUQDODVFQZHASHMQIHSQXICTSJNAUVZYIHVBBARPJADRH';
var output = 'CFBJTPYXROYGGVTGBUTEBURBXNUZGGRALBNXIQHVBFWPLZQSCEZWTAWCKKPRSWOGNYXLCOTQAWDRRKBCADTKZGPWSTNYIJGLVIUQ';
var machine = new Enigma(['I', 'II', 'III'], 'B', [0, 1, 20], [5, 5, 4], 'AG HR YT KI FL WE NM SD OP QJ');
assert.ok(output === machine.encrypt(input));

Decrypt

Message.

var secret = 'THEONLYWINNINGMOVEISNOTTOPLAY';
var first = new Enigma(['I', 'II', 'III'], 'B', [0, 0, 0], [0, 0, 0]);
var second = new Enigma(['I', 'II', 'III'], 'B', [0, 0, 0], [0, 0, 0]);
assert.ok(second.encrypt(first.encrypt(secret)) === secret);

Notes

  • Typescript port of Mike Pound's Enigma Machine

Resources

  1. Wikipedia
  2. Project page
  3. Youtube video