Crypto-WheelLast time I changed job, it meant an increase in commute (from 5 minutes to an hour) which also meant I would not see my kids every morning. So I picked up the habit (since then lost mind you) of setting the table for their breakfast and leaving them a note, wishing them a good day. Who knew that from a simple note, things would evolve to teaching encryption.
Of course, the simple note grew old over time so I started looking for alternatives. After trying the multi-color notes and various “analog” mediums, I turned to Bamboo Paper on the iPad and that provide several options. I also played around with a Boogie Board Rip and that provided an interesting alternative for a few days but it was short lived.

The note content varied from day to day. Some days it was a short simple “Love you both!” and other morning it was a good way to relay important news like the score of the prior night’s Giant game.

After a visit at the International Spy Museum in Washington DC, I decided I could also use the morning note as a teaching tool and set out to teach them about encryption. I baptized my project the “Crypto-Wheel” but later realized the name of such a device is usually Cypher-Disk. The kids helped me as we a fabricated the wheel and we made several improvements over time.

So the concept and instructions were easy, easy enough for my kids to follow:

  • The KEY is set by indicating the letter in WHITE, lined up with the BLUE letter “Q”.
  • Make sure to properly set the wheel to the right KEY before use.
  • Always encrypt from BLUE to WHITE
  • Always decrypt from WHITE to BLUE.

The first message I left they struggled a bit with. But they quickly got the hang of it. As they improved, the messages got longer and longer.

After missing my first train, trying to properly encrypt a message for the kids, I decided I needed a way to quickly produce encoded messages. Using Python, I wrote a short script which allowed me to encrypt or decrypt based on the randomness of this wheel. The result works well:

$ ./ --key=A --text="THIS IS MY STRING" -e

$ ./ --key=A --text="GPXE XE QT EGCXSL" -d

The script uses a rotate_string() function:

def rotate_string(alpha,spaces):
    letters = ['']
    for c in alpha:
        a = ord(c) - 65
        a = (a + spaces)%26 + 65
        a = chr(a)
    return ''.join(letters)

And the letters used in the translation are rotated prior based on the key:

        if (len(key) == 1):
            # Key is "White in front of Blue Q"
            spaces =  ord(key) - ord("A")
            letters = rotate_string(letters, spaces)

I dropped a full copy of the script at Github.

Meanwhile, my own use of the wheel has reduced as my habit of leaving notes did. This is probably something I should resume soon as it is a fun way to communicate with kids, teach them a thing or two and leave them with something fun before they’re off to school.

You can find more information on encryption for kids at NSA’s CryptoKids.