Coprime (or relatively prime) means that e and 3120 should have no common (positive) factor other than 1. Let's try e = 17. Since e is prime, we just have to check that e does not divide 3120 exactly.
e is called the public key exponent.
So the public key would be (n = 3233, e = 17). The encryption function is
The plaintext message would be padded first with extra bits. Now, suppose we want to encrypt the message m = 65. In Python we do
m**e % n
:Our ciphertext is 2790.
We compute the private key exponent, d, as the modular multiplicative inverse of e (mod φ(n)).
Consider an integer a. The modular multiplicative inverse of a is designated a-1 where
Here then, we want d such that d * e = 1 (mod 3120). There is an algorithm called the extended Euclidean algorithm to do this. Here we simply note that d = 2753 is a solution since:
Note that the calculation required (effective) knowledge of p and q through the use of φ(n).
In order to decrypt the ciphertext 2790, we do
c**d % n
:That is some serious exponentiation.
From the terminal I do:
The file has this:
I'm very surpised to see that this is like ascii alphanumeric or something. I'll have to look into that.
[ UPDATE: it is base 64 (RSA format here), which I'd never heard of but makes a lot of sense: uppercase + lowercase + digits = 62. We just need two more symbols, which are '+' and '/' (here). ]
A key size of 2048 bits would be common for RSA. This would give about a 600 digit number in base 10:
Not sure what part of that is e versus n, but most of it is probably n, and since pq = n we're talking about quite large prime numbers.