OK, in the previous section we described what is meant by a trap-door cipher, but how do you make one? One commonly used cipher of this form is called ``RSA Encryption'', where ``RSA'' are the initials of the three creators: ``Rivest, Shamir, and Adleman''. It is based on the following idea:
It is very simple to multiply numbers together, especially with computers. But it can be very difficult to factor numbers. For example, if I ask you to multiply together 34537 and 99991, it is a simple matter to punch those numbers into a calculator and 3453389167. But the reverse problem is much harder.
Suppose I give you the number 1459160519. I'll even tell you that I got it by multiplying together two integers. Can you tell me what they are? This is a very difficult problem. A computer can factor that number fairly quickly, but (although there are some tricks) it basically does it by trying most of the possible combinations. For any size number, the computer has to check something that is of the order of the size of the square-root of the number to be factored. In this case, that square-root is roughly 38000.
Now it doesn't take a computer long to try out 38000
possibilities, but what if the number to be factored is not ten
digits, but rather 400 digits? The square-root of a number with
400 digits is a number with 200 digits. The lifetime of the
universe is approximately
seconds - an 18 digit number.
Assuming a computer could test one million factorizations per
second, in the lifetime of the universe it could check
possibilities. But for a 400 digit product, there are
possibilities. This means the computer would have to run for
times the life of the universe to factor the large
number.
It is, however, not too hard to check to see if a number is prime--in other words to check to see that it cannot be factored. If it is not prime, it is difficult to factor, but if it is prime, it is not hard to show it is prime.
So RSA encryption works like this. I will find two huge prime
numbers,
and
that have 100 or maybe 200 digits each. I
will keep those two numbers secret (they are my private key), and
I will multiply them together to make a number
. That
number
is basically my public key. It is relatively easy for
me to get
; I just need to multiply my two numbers. But if you
know
, it is basically impossible for you to find
and
.
To get them, you need to factor
, which seems to be an incredibly
difficult problem.
But exactly how is
used to encode a message, and how are
and
used to decode it? Below is presented a complete example, but I
will use tiny prime numbers so it is easy to follow the arithmetic.
In a real RSA encryption system, keep in mind that the prime numbers
are huge.
In the following example, suppose that person A wants to make a public key, and that person B wants to use that key to send A a message. In this example, we will suppose that the message A sends to B is just a number. We assume that A and B have agreed on a method to encode text as numbers. Here are the steps:
But since we only care about the result
, we can
calculate all the partial results in that modulus, and by repeated
squaring of 545, we can get all the exponents that are powers of 2.
For example,
. Then square again:
, and so on. We obtain the following table:
So the result we want is: