A post-quantum key distribution protocol for purely classical parties.


A love for cryptography, and a belief in the fundamental right of privacy. Moreover, NTRU is a rather unique cryptosystem and was incredibly fun to implement.

What it does:

The project is a command line interface for NTRU encrypt. It allows a user to generate NTRU key pairs and encrypt randomized 256-bit keys to be used in symmetric protocols with trusted parties. Currently the main supported functions are: genKeys->(h,(f,g)), where h is the public key, and (f,g) are the private keys; encrypt(bob) encrypt a key for a user in your key ring; decrypt(c) decrypt a key sent to you to use in protocol like AES.

How we built it:

It is a pure Python implementation, all algorithms are from scratch. The only dependency is PyCrypto which is used for a secure PRG.

Challenges we ran into:

Documentation for NTRU is somewhat hard to find and the algorithms are not trivial. Implementing the cryptosystem was incredibly challenging, but we pushed through.

Accomplishments that we're proud of:

A number of the algorithms and data structures for NTRU are very hard to implement. In no particular order we are quite proud of the following implementations: * Robust Truncated Polynomial Ring Class * Efficient Convolution Product Algorithm * Efficient Almost Inverse Algorithm in mod 3 and mod 2^r * Fast Key Gen Algorithm * Ternary encoder

What we learned:

We learned a lot about NTRU Encrypt and working with the PyCrypto library. Moreover, we learned a lot about the intersection of math and programming.

What's next:

We would like to extend our work to a more full cryptographic suite, something like a post-quantum "update" of PGP with stronger guarantees.

Built with:

Original spec papers, emacs, blood, sweat and tears.

Prizes we're going for:

TBI Pro Gaming Headset

Grand Prize

$100 Amazon Gift Cards

Team Members

Sam Markelon, Andy Guo, Mitchell Chan
View on Github