RSA

Ronald Rivest, Adi Shamir, and Leonard Adleman, 1977.

Setup:

Pick two primes p and q.

Compute n=pq.

Pick encryption exponent e such that e and (p-1)(q-1) don't have any common prime factors.

Make n and e public. Keep p and q private.

Example:

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr1.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr3.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr4.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr5.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr6.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr7.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr8.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr9.gif]

Modular Arithmetic

Karl Friedrich Gauss, 1801.

Modular Arithmetic = "Wrap-around" computations

Example: start at 12 o'clock. 5 hours plus 8 hours equals 1 o'clock

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr10.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr11.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr12.gif]

Example: start at 12 o'clock. 11 hours times 5 equals 7 o'clock.

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr13.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr14.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr15.gif]

Encryption:

Anyone can encrypt, because n and e are public.

To encrypt, convert your message into a set of plaintext numbers P, each less than n.

For each P, compute

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr16.gif]

The numbers C are your ciphertext.

Example: send the message "cats and dogs"

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr17.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr18.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr19.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr20.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr21.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr22.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr23.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr24.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr25.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr26.gif]

Trap Door

Leonhard Euler, 1736.

Let

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr27.gif]

be the number of positive integers less than or equal to n which don't have any common factors with n.

Example: If n=15, then the positive integers less than or equal to n which don't have any common factors with n are 1, 2, 4, 7, 8, 11, 13, 14. So

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr28.gif]

In the RSA system n=pq, so

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr29.gif]

is the number of positive integers less than or equal to n which don't have p or q as a factor.

How many positive integers less than or equal to n do have p as a factor?
p, 2p, 3p, ..., n=qp
so there are q of them.

Similarly, there are p positive integers less than or equal to n with q as a factor.

Only one positive integer less than or equal to n has both p and q as factors, namely n=pq. So we should only count this once.

Therefore,

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr30.gif]

This is private! You can't calculate it without knowing p and q.

Euler's Theorem: if x is an integer which has no common prime factors with n, then

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr31.gif]

Why is Euler's Theorem true?

Number Theory idea: We consider the positive integers less than or equal to n which don't have any common factors with n, and multiply each of them by x modulo n. Compare them to the same integers without multplying by x.

Example.

For n=15, consider x, 2x, 4x, 7x, 8x, 11x, 13x, 14x (mod 15), and compare them to 1, 2, 4, 7, 8, 11, 13, 14. If we multiply all of the first set we get

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr32.gif]

and if we multiply all of the second set we get

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr33.gif]

What if we do all of this for x=11? The first set will be

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr34.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr35.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr36.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr37.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr38.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr39.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr40.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr41.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr42.gif]

which is the same as the second set, only in a different order! In fact, this always happens. So

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr43.gif]

or

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr44.gif]
Arthur Cayley, 1878.

Group Theory idea: We make a Cayley diagram for the numbers less than n.

Example.

Say x=11. Follow the arrows from 1 to 11. This is one x14 arrow and two x2 arrows. If you do this 7 more times, you will be following a total of eight x14 arrows and sixteen x2 arrows, and you should end up at 11 to the eighth. However, eight x14 arrows and sixteen x2 arrows clearly ends you up back where you started! (Note that it doesn't matter in what order you follow the arrows....)

So how do we use the trap door?

Decryption:

We need one more piece of (private) information.

Euclid, about 300 B.C.E.

If a and b don't have any common prime factors, then there are integers c and d such that

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr45.gif]

Since we picked e such that e and (p-1)(q-1) don't have any common prime factors, then there are integers c and d such that

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr46.gif]

or

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr47.gif]

Euclid also tells us how to find c and d, using the Euclidean Algorithm.

Once we have found the decryption exponent d, which is private, we can decrypt.

For each C, compute

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr48.gif]

What will this give you?

We know

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr49.gif]

although we don't yet know what P is. So

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr50.gif]

but

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr51.gif]

by Euler's Theorem! So

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr52.gif]

and we get our original plaintext back.

Example:

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr53.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr54.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr55.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr56.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr57.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr58.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr59.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr60.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr61.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr62.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr63.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr64.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr65.gif]

Breaking RSA:

So why do we think RSA is secure?

As far as we know, the only way to break RSA is to find p and q by factoring n. The fastest known factoring algorithm takes something about like

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr66.gif]

time units to factor n. (The size of the time unit depends on things like how fast the computer is!) For the fastest computers in 1992, it would have taken about 4 million years to factor a number with 200 decimal digits.

On the other hand, finding p and q and multiplying them together is very fast. Finding a number p which is (probably) prime takes about

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr67.gif]

time units. This looks large, but it isn't really; for a 200-digit number this should only take a few minutes. (Multiplying p and q together is even faster.)

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr68.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr69.gif]

Digital Signatures:

As a bonus, RSA gives us a way to digitally "sign" messages, thereby proving who wrote them. This uses the same public n and e and private d as before.

For each plaintext P, compute

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr70.gif]

The numbers S are your signed message.

Since only you know the decryption d, only you can sign a message. The person you send it to can prove it was you by computing

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr71.gif]

(since e is public) and getting back

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr72.gif]

which we know is congruent to P. If this matches the P you sent separately, then the message was correctly signed, so it must have come from someone who knows d.

Example: suppose that instead of encrypting the message "cats and dogs" we wanted to sign it.

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr73.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr74.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr75.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr76.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr77.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr78.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr79.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr80.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr81.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr82.gif]

Then anyone who looked up our public n and e could prove that we had sent it:

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr83.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr84.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr85.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr86.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr87.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr88.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr89.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr90.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr91.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr92.gif]

One can even sign an encrypted message this way. Suppose Alice wants to send Bob an encrypted message. Then she first encrypts with Bob's public n(B) and e(B). Secondly, she signs the message with her n(A) and private d(A). Since her d(A) is different from Bob's d(B), they don't cancel out. Then Bob can "unsign" the message with Alice's public n(A) and e(A) and finally decrypt the message with his n(B) and private d(B)!

Example:

Alice

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr93.gif]

(private)

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr94.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr95.gif]

(public)

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr96.gif]

(public)

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr97.gif]

(private)

Bob

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr98.gif]

(private)

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr99.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr100.gif]

(public)

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr101.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr102.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr103.gif]

(public)

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr104.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr105.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr106.gif]

(private)

Alice encrypts the message with Bob's public information:

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr107.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr108.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr109.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr110.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr111.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr112.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr113.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr114.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr115.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr116.gif]

Alice signs the message with her private information and send the result to Bob:

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr117.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr118.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr119.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr120.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr121.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr122.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr123.gif]

Bob "unsigns" the message using Alice's public information:

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr124.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr125.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr126.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr127.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr128.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr129.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr130.gif]

and then decrypts it using his private information:

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr131.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr132.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr133.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr134.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr135.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr136.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr137.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr138.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr139.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr140.gif]

Attacks on RSA:

Finding out someone's private d is probably as hard as factoring n. But sometimes we can find out a particular message without breaking the general code. Usually this is because e is too small --- small e makes the encrypting faster, but can weaken security.

Small message attack

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr141.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr142.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr143.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr144.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr145.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr146.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr147.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr148.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr149.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr150.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr151.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr152.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr153.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr154.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr155.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr156.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr157.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr158.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr159.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr160.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr161.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr162.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr163.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr164.gif]

Common exponent attack

Suppose we're sending the same message to Alice, Bob, and Carol, and they all have the same small exponent.

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr165.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr166.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr167.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr168.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr169.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr170.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr171.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr172.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr173.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr174.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr175.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr176.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr177.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr178.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr179.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr180.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr181.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr182.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr183.gif]

Message to Alice:

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr184.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr185.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr186.gif]

Message to Bob:

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr187.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr188.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr189.gif]

Message to Carol:

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr190.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr191.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr192.gif]

Eve (an eavesdropper) hears the messages. Eve knows

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr193.gif]

and similarly for the second half of the message. (Everything here except P is public information!) Then the Chinese Remainder Theorem (c. 1st century C.E.) says Eve can recover

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr194.gif]

using the magic formula

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr195.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr196.gif]

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr197.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr198.gif]

But now Eve can use the small message attack:

[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr199.gif]
[Graphics:rsa-mhcgr2.gif][Graphics:rsa-mhcgr200.gif]

This is guaranteed to work if there are at least e messages. Moral: don't send identical messages!