Mercurial > public > pelican-blog
diff content/Coding/018-pyenigma.rst @ 4:7ce6393e6d30
Adding converted blog posts from old blog.
author | Brian Neal <bgneal@gmail.com> |
---|---|
date | Thu, 30 Jan 2014 21:45:03 -0600 |
parents | |
children | 49bebfa6f9d3 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/content/Coding/018-pyenigma.rst Thu Jan 30 21:45:03 2014 -0600 @@ -0,0 +1,84 @@ +Introducing Py-Enigma +##################### + +:date: 2012-06-06 18:45 +:tags: Python, Py-Enigma, Enigma +:slug: introducing-py-enigma +:author: Brian Neal + +Py-Enigma +--------- + +For some strange reason, I don't even remember why or how, I found myself +browsing the `Wikipedia page for the Enigma Machine +<http://en.wikipedia.org/wiki/Enigma_machine>`_. I quickly became fascinated and +started surfing around some more. I found several Enigma machine simulators, +some of them even online. It suddenly occured to me that it would be a fun +project to try and write my own in Python_. I wanted to challenge myself to see +if I could figure it all without help, so I vowed not to look at anyone else's +source code. + +In order to write an Enigma simulator, you need a really good technical +explanation of how it worked, along with numerous details like how the rotors +were wired. Fortunately I very quickly found Dirk Rijmenants' incredible `Cipher +Machines and Cryptology website`_. In particular, his `Technical Details of the +Enigma Machine`_ page was exactly what I was looking for, a real gold mine of +information. + +I had a long Memorial Day weekend, so I spent many hours in front of the +computer, consuming every word of Dirk's explanations and trying to sort it all +out in my head. And so a very fun marathon hacking session began. In the end I +got it figured out, and you cannot believe how excited I was when I was able to +decode actual Enigma messages from World War II! + +And so `Py-Enigma <https://bitbucket.org/bgneal/enigma>`_ was born! Py-Enigma is +a historically accurate simulation library for war-time Enigma machines, written +in Python 3. I also included a simple command-line application for doing +scripting or quick commad-line experiments. + +Lessons learned +--------------- + +Since I didn't really know what I was doing at first, I wrote little classes for +each of the components and unit tested them. I'm really glad I did this because +not only did it find bugs, it also made me think harder about the problem and +made me realize I didn't understand everything. When you make a mistake in +cryptography, very often the answer you get is gibberish and there is no way to +tell how close you are to the right answer. This was almost the case here, and I +think I stumbled upon an Enigma weakness that the allied codebreakers must have +seen also. I had a bug in my rotor stepping algorithm, and I got the right +answer up until the point where the right rotor stepped the middle rotor, then +the output went all garbage. Once I noticed this, I was able to focus on the +stepping algorithm and find the bug. I'm sure the allied codebreakers must have +experienced the same thing when they were guessing what rotors were being used +for the message they were cracking. + +I also decided to use this little project to really learn Sphinx_. I had dabbled +around in it before when I contributed some documentation patches to Django_. I +think writing the documentation took almost as long as my research and coding, +but with Sphinx at least it was fun! It is a very useful and powerful package. I +also checked out the awesome `readthedocs.org <http://readthedocs.org>`_ and +quickly got my documentation `hosted there +<http://py-enigma.readthedocs.org/>`_. What a fantastic service! Now whenever I +push changes to bitbucket my docs are automatically built on readthedocs! + +This was also my second project that I put up on PyPI. I'm a little bit more +comfortable with the packaging process, but it is still a bit bewildering given +all the choices. + +Conclusion +---------- + +I hope folks who are interested in history, cryptography, World War II, and +Python find Py-Enigma useful and fun! You can get the code from either the +`Py-Enigma Bitbucket page`_ or from PyPI_. And a big thank-you to Dirk +Rijmenants! Without his hard work and detailed explanation, Py-Enigma would +have been considerably more difficult. + +.. _Python: http://www.python.org +.. _Cipher Machines and Cryptology website: http://users.telenet.be/d.rijmenants/index.htm +.. _Technical Details of the Enigma Machine: http://users.telenet.be/d.rijmenants/en/enigmatech.htm +.. _Sphinx: http://sphinx.pocoo.org/ +.. _Django: http://www.djangoproject.com/ +.. _Py-Enigma Bitbucket page: https://bitbucket.org/bgneal/enigma +.. _PyPI: http://pypi.python.org/pypi/py-enigma/