The project is designed as a way for you to do hands-on work with cryptographic systems in a field of your choice. Each project should contain at least some of each of these three things:

- Research: look up the prior work, to see what other people have done. Prioritize books or PDF academic papers over HTML (blog posts, comments, Wikipedia).
- Code: write some actual hands-on crypto code. Any language is fine, although what you turn in should be structured nicely and well commented.
- Analysis: check the statistics, histograms, or correlations of your output. Or measure the runtime performance, in nanoseconds per byte or round. Or measure *something* quantifiable and numeric.

Friday, April 19, in class: be prepared to talk about your
project topic for about two minutes, and try to contribute
something useful for each other student's project topic (maybe
just "That's a neat topic!"). I'll be in Texas (for the National
Collegiate Cyber-Defense Contest, along with half the class!), but
I'll try to connect into BlackBoard during this class.

Monday, April 22: no class, instead go and work on your projects!

Wednesday, May 1: Rough draft due.

Friday, May 3 and Monday, May 6: Present project results in class (6-8 minutes each).

Wednesday, May 8: Final exam, and final draft code by midnight.

- Do something interesting with Elliptic Curves, because in
crypto work they are The New Hotness
^{tm}.

- Implement a cryptanalytic attack, like brute force key enumeration (pick a managable keyspace), meet-in-the-middle hashtable attack for split keys, or any of the many flavors of statistical analysis.
- Implement your own Feistel-type cipher, or a Feisteloid round-style cipher. Be sure to analyze the runtime performance, differential behavior, and statistical output of your cipher for varying keys and number of rounds.
- Implement your own round-based cryptographic hash function, using a non-invertible round function. Again, analyze the statistics and differential output of your hash for varying number of rounds.
- Implement any decent existing cipher or hash (AES, DES, RC5, SHA-1, SHA-256 are all reasonable choices).
- Implement any decent existing digital signature algorithm
(RSA, DSA, ECDSA are all reasonable choices).

- Do something interesting in a (Galois) Finite Field. For example, it's likely that the highest performance GPU implementations of Finite Field operations will not use tables, but independently manipulate bits.