rjw245 / crypto-in-a-box

Turns an Arduino (I used a RedStick from Sparkfun) in a cryptography token, allowing you to encrypt and decrypt messages with an unknown secret key using the NaCl encryption algorithm.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

crypto-in-a-box

Turns an Arduino (I used a RedStick from Sparkfun) in a cryptography token, allowing you to encrypt and decrypt messages with an unknown secret key using the NaCl encryption algorithm.

The protocol is as follows:

Byte 0 Byte 1 ... Byte N-1 Byte N
Input len Input ... Input 'E' or 'D'

Sending an 'E' as the last character tells the Arduino to attempt to encrypt the input, and send back the result.

Sending a 'D' as the last character tells the Arduino to attempt to decrypt the input, and send back the result.

This was a cool opportunity to experiment with a few different things:

  • NaCl encryption with the TweetNaCl library written in C
  • State machine design patterns in C

The Arduino running this program effectively becomes a security "token", or in other words, a physical device one needs in order to create/parse encrypted messages. This was a cool concept to explore: secrets embedded in a physical device.

I was also inspired by the book "Patterns in C", which describes a few software design patterns and their implementations in C. This project was a great opportunity to use a state machine, as different actions need to be taken as character inputs come in. You'll notice that despite Arduino supporting C++ (and thus object-oriented design which would make implementing the STATE pattern that much easier) I've stuck to C constructs exclusively, for my own benefit. I use C day to day and want to get better at implementing desing patterns without object-oriented language support.

About

Turns an Arduino (I used a RedStick from Sparkfun) in a cryptography token, allowing you to encrypt and decrypt messages with an unknown secret key using the NaCl encryption algorithm.


Languages

Language:C 81.2%Language:C++ 11.3%Language:Python 6.3%Language:Arduino 1.2%