billion keys per second, a brute-force attack would, thus, require 1.8 X 10 10 seconds, or some 570 years to explore the full keyspace! Clearly, each extra bit of key size doubles the number of key possibilities. Nowadays, some cryptosystems may use key sizes as large as N = 512 bits or N = 1024 bits, corresponding to huge keyspaces of 10 154 and 10308 respectively. However, one should not conclude that cryptosystems become absolutely safe against attacks when the key size is sufficiently large. This sub- ject being beyond the scope of this chapter, suffice it to state here that one should not underestimate the power of cryptanalysis, and also that the generation of truly random keys is not technically simple. If a code breaker can guess the algorithm used to generate the random keys, his or her task is simplified. But the most straightforward approach is to intercept the key itself, at the time the communicating parties are doing what is referred to as the key exchange. Indeed, the weakness of cryptography lies in the fact that, in order to work, the secret key must be communicated one way or another to the recipient. Such an exchange is not without risk of interception, no matter how rapid and periodically changing. Clearly, the worst situation is to be confident in the safety of a cryptosystem, while the channel used to exchange the keys is in fact being wired! As a matter of fact, cryptography faces a double security problem: transmitting the secret key without any measurable risk of interception, and remaining virtually invulnerable to cryptanalysis. The history of cryptography, or cryptology, represents a succession of increasingly sophisticated cryptoalgorithms, which have invariably been broken at some point by sheer cryptanalysis. Most ancient and pre-computer-era algorithms have been based The concept of code cracking is somewhat different. It could be defined as breaking a code for the first time. Put simply, code crackers are "champion" code breakers. The goal of code crackers is not SO much to retrie