Cryptography Engineering
A practical guide to building secure systems, co-written by Niels Ferguson, Bruce Schneier, and Tadayoshi Kohno. It is a revised successor to the earlier book Practical Cryptography, aimed at software engineers rather than mathematicians. It covers block ciphers, hash functions, message authentication, key negotiation, and the many ways real implementations go wrong, stressing that using cryptography correctly is harder than picking a strong algorithm. Each chapter includes discussion and exercises. For a technical reader it is a well-regarded introduction to applied cryptography; it is a working reference, not light reading.