bgneal@18
|
1 ==========
|
bgneal@18
|
2 Cpp-Enigma
|
bgneal@18
|
3 ==========
|
bgneal@18
|
4 A historically accurate Enigma Machine library written in C++11
|
bgneal@18
|
5 ---------------------------------------------------------------
|
bgneal@18
|
6
|
bgneal@18
|
7 :Author: Brian Neal <bgneal@gmail.com>
|
bgneal@18
|
8 :Version: 0.1
|
bgneal@18
|
9 :Date: July 11, 2012
|
bgneal@18
|
10 :Home Page: https://bitbucket.org/bgneal/cpp-enigma/
|
bgneal@18
|
11 :License: MIT License (see LICENSE.txt)
|
bgneal@18
|
12 :Support: https://bitbucket.org/bgneal/cpp-enigma/issues
|
bgneal@18
|
13
|
bgneal@18
|
14
|
bgneal@18
|
15 Overview
|
bgneal@18
|
16 --------
|
bgneal@18
|
17
|
bgneal@18
|
18 **Cpp-Enigma** is a C++11 library for simulating the `Enigma machines`_ used
|
bgneal@18
|
19 by the German armed forces (Wehrmacht) during World War 2. Cpp-Enigma makes it
|
bgneal@18
|
20 possible to both encrypt and decrypt messages that can be sent to, or received
|
bgneal@18
|
21 from, actual Enigma machines used by the German army (Heer), air force
|
bgneal@18
|
22 (Luftwaffe), and navy (Kriegsmarine).
|
bgneal@18
|
23
|
bgneal@18
|
24 It is my hope that library will be useful to Enigma enthusiasts, historians, and
|
bgneal@18
|
25 students interested in cryptography.
|
bgneal@18
|
26
|
bgneal@18
|
27 Cpp-Enigma is basically a C++11 port of my `Py-Enigma
|
bgneal@18
|
28 <https://bitbucket.org/bgneal/enigma>`_ library, which is written in Python 3.
|
bgneal@18
|
29 Cpp-Enigma was created when I started doing performance intensive hill-climbing
|
bgneal@18
|
30 searches for Enigma keys. The Python library is very convenient for quick
|
bgneal@18
|
31 experiments and simple brute force attacks when most of the key parameters are
|
bgneal@18
|
32 known. Cpp-Enigma is for when you need much greater performance, such as a
|
bgneal@18
|
33 cipher-text only attack involving hill-climbing.
|
bgneal@18
|
34
|
bgneal@18
|
35
|
bgneal@18
|
36 Quick Example
|
bgneal@18
|
37 -------------
|
bgneal@18
|
38
|
bgneal@18
|
39 This example shows how the library can be used to decode a message using the
|
bgneal@18
|
40 procedure employed by the German army::
|
bgneal@18
|
41
|
bgneal@18
|
42 #include <iostream>
|
bgneal@18
|
43 #include <string>
|
bgneal@18
|
44 #include "machine.h"
|
bgneal@18
|
45
|
bgneal@18
|
46 using namespace enigma;
|
bgneal@18
|
47
|
bgneal@18
|
48 int main()
|
bgneal@18
|
49 {
|
bgneal@18
|
50 // setup machine according to specs from a key sheet:
|
bgneal@18
|
51
|
bgneal@18
|
52 enigma_machine em({"II", "IV", "V"}, {1, 20, 11}, "B",
|
bgneal@18
|
53 "AV BS CG DL FU HZ IN KM OW RX");
|
bgneal@18
|
54
|
bgneal@18
|
55 // set initial rotor starting position
|
bgneal@18
|
56 em.set_display("WXC");
|
bgneal@18
|
57
|
bgneal@18
|
58 // decrypt the message key
|
bgneal@18
|
59 const std::string msg_key = em.process_text("KCH");
|
bgneal@18
|
60
|
bgneal@18
|
61 // decrypt the ciphertext with the unencrypted message key
|
bgneal@18
|
62 em.set_display(msg_key);
|
bgneal@18
|
63
|
bgneal@18
|
64 const std::string ciphertext("NIBLFMYMLLUFWCASCSSNVHAZ");
|
bgneal@18
|
65 const std::string plaintext(em.process_text(ciphertext));
|
bgneal@18
|
66
|
bgneal@18
|
67 std::cout << plaintext << std::endl;
|
bgneal@18
|
68 return 0;
|
bgneal@18
|
69 }
|
bgneal@18
|
70
|
bgneal@18
|
71 This program prints::
|
bgneal@18
|
72
|
bgneal@18
|
73 THEXRUSSIANSXAREXCOMINGX
|
bgneal@18
|
74
|
bgneal@18
|
75
|
bgneal@18
|
76 Requirements
|
bgneal@18
|
77 ------------
|
bgneal@18
|
78
|
bgneal@18
|
79 Cpp-Enigma is written in C++, and uses features found in the C++11 standard. The
|
bgneal@18
|
80 code was developed on GCC 4.6.3.
|
bgneal@18
|
81
|
bgneal@18
|
82 Cpp-Enigma ships with SCons_ build files.
|
bgneal@18
|
83
|
bgneal@18
|
84 Cpp-Enigma's unit tests require the CxxTest_ unit test framework. This is only
|
bgneal@18
|
85 required if you plan on running or modifying the tests.
|
bgneal@18
|
86
|
bgneal@18
|
87 Cpp-Enigma has no other requirements or dependencies.
|
bgneal@18
|
88
|
bgneal@18
|
89
|
bgneal@18
|
90 Installation
|
bgneal@18
|
91 ------------
|
bgneal@18
|
92
|
bgneal@18
|
93 You may download a tarball or .zip file of the latest code using the "get
|
bgneal@18
|
94 source" link on the `Cpp-Enigma Bitbucket page`_. Alternatively if you use
|
bgneal@18
|
95 Mercurial_, you can clone the repository with the following command::
|
bgneal@18
|
96
|
bgneal@18
|
97 $ hg clone https://bitbucket.org/bgneal/cpp-enigma
|
bgneal@18
|
98
|
bgneal@18
|
99 Once you have obtained a copy of the source and installed SCons_ the software
|
bgneal@18
|
100 can be compiled on GCC with::
|
bgneal@18
|
101
|
bgneal@18
|
102 $ scons
|
bgneal@18
|
103
|
bgneal@18
|
104 If you have CxxTest_ installed and configured to work with SCons_, you may run
|
bgneal@18
|
105 the unit tests with::
|
bgneal@18
|
106
|
bgneal@18
|
107 $ scons check
|
bgneal@18
|
108
|
bgneal@18
|
109 I have not currently compiled the code on other compilers or environments.
|
bgneal@18
|
110 Patches or pull requests are welcome.
|
bgneal@18
|
111
|
bgneal@21
|
112
|
bgneal@18
|
113 Documentation
|
bgneal@18
|
114 -------------
|
bgneal@18
|
115
|
bgneal@18
|
116 Currently there is no documentation for Cpp-Enigma. However the design and API
|
bgneal@18
|
117 is almost identical to Py-Enigma, which is well documented. I will quote from
|
bgneal@18
|
118 the Py-Enigma README file below:
|
bgneal@18
|
119
|
bgneal@18
|
120 The latest documentation is available at `Read the Docs
|
bgneal@18
|
121 <http://readthedocs.org/projects/py-enigma/>`_. There you can `browse the
|
bgneal@18
|
122 documentation online <http://readthedocs.org/docs/py-enigma/en/latest/>`_, or
|
bgneal@18
|
123 `download it in a variety of formats
|
bgneal@18
|
124 <http://readthedocs.org/projects/py-enigma/downloads/>`_.
|
bgneal@18
|
125
|
bgneal@18
|
126 Sources for the documentation are also included in Sphinx_ format. If you
|
bgneal@18
|
127 install Sphinx you can generate the documentation in several output formats.
|
bgneal@18
|
128
|
bgneal@21
|
129 Between the Python docs and the source code hopefully this will be enough to get
|
bgneal@21
|
130 you going. Proper documentation may be created in the future. Again, patches and
|
bgneal@21
|
131 pull requests are welcome.
|
bgneal@21
|
132
|
bgneal@20
|
133
|
bgneal@18
|
134 Support
|
bgneal@18
|
135 -------
|
bgneal@18
|
136
|
bgneal@18
|
137 Support is provided at the `issue tracker`_ at the `Cpp-Enigma Bitbucket page`_.
|
bgneal@18
|
138 If you have general questions or comments, please feel free to email me (address
|
bgneal@18
|
139 at the top of this file).
|
bgneal@18
|
140
|
bgneal@18
|
141 And please, if you use Cpp-Enigma for anything, even if it is just learning,
|
bgneal@18
|
142 please let me know!
|
bgneal@18
|
143
|
bgneal@18
|
144
|
bgneal@18
|
145 Acknowledgements & References
|
bgneal@18
|
146 -----------------------------
|
bgneal@18
|
147
|
bgneal@18
|
148 This software would not have been possible without the thorough and detailed
|
bgneal@18
|
149 descriptions of the Enigma machine on Dirk Rijmenants' incredible `Cipher
|
bgneal@18
|
150 Machines and Cryptology website`_. In particular, his `Technical Details of the
|
bgneal@18
|
151 Enigma Machine`_ page was a gold mine of information.
|
bgneal@18
|
152
|
bgneal@18
|
153 Dirk has also written an `Enigma simulator`_ in Visual Basic. Although I did not
|
bgneal@18
|
154 look at his source code, I did use his simulator to check the operation of
|
bgneal@18
|
155 Cpp-Enigma.
|
bgneal@18
|
156
|
bgneal@18
|
157 I would also like to recommend the photos and video at Dr. Thomas B. Perera's
|
bgneal@18
|
158 `Enigma Museum`_.
|
bgneal@18
|
159
|
bgneal@18
|
160 Another good website is `The Enigma and the Bombe`_ by Graham Ellsbury.
|
bgneal@18
|
161
|
bgneal@18
|
162 A nice video which shows the basic components and operation of the Enigma
|
bgneal@18
|
163 Machine is on YouTube: `Nadia Baker & Enigma demo`_.
|
bgneal@18
|
164
|
bgneal@18
|
165
|
bgneal@18
|
166 .. _Enigma machines: http://en.wikipedia.org/wiki/Enigma_machine
|
bgneal@18
|
167 .. _Cpp-Enigma Bitbucket page: https://bitbucket.org/bgneal/cpp-enigma
|
bgneal@18
|
168 .. _Mercurial: http://mercurial.selenic.com/
|
bgneal@18
|
169 .. _issue tracker: https://bitbucket.org/bgneal/cpp-enigma/issues
|
bgneal@18
|
170 .. _SCons: http://www.scons.org/
|
bgneal@18
|
171 .. _CxxTest: http://cxxtest.com/
|
bgneal@18
|
172 .. _Sphinx: http://sphinx.pocoo.org/
|
bgneal@18
|
173 .. _Cipher Machines and Cryptology website: http://users.telenet.be/d.rijmenants/index.htm
|
bgneal@18
|
174 .. _Technical Details of the Enigma Machine: http://users.telenet.be/d.rijmenants/en/enigmatech.htm
|
bgneal@18
|
175 .. _Enigma simulator: http://users.telenet.be/d.rijmenants/en/enigmasim.htm
|
bgneal@18
|
176 .. _Enigma Museum: http://w1tp.com/enigma/
|
bgneal@18
|
177 .. _The Enigma and the Bombe: http://www.ellsbury.com/enigmabombe.htm
|
bgneal@18
|
178 .. _Nadia Baker & Enigma demo: http://youtu.be/HBHYAzuVeWc
|