summaryrefslogtreecommitdiffstats
path: root/docs/crypto/rsa.txt
blob: f9442fcd1342a5f779de4c0743c50ad3fd92cc89 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
Brief summary of RSA algorithm / crypto system
----------------------------------------------
# https://www.cs.utexas.edu/~mitra/honors/soln.html

Choose 2 large, random prime numbers, p and q.

n = p * q
phi = (p-1) * (q-1)

Choose e, such that `1 < e < phi` and e and phi are coprime (*) (**) (***)
Compute d, such that `e * d mod phi == 1` (****)

Public key = (e, n)
Private key = (d, n)

cyphertext =  plaintext ^ e mod n
plaintext  = cyphertext ^ d mod n


(*) It is important for e and phi to be coprime, to prevent ambiguous
    decryption.  See https://crypto.stackexchange.com/questions/12255/

(**) A very common value for e is (the prime) 65537

(***) RSA can become more vulnerable to cracking with low values of e.
      See https://crypto.stackexchange.com/questions/6713/.
      TODO: Explain the attack here.

(****) Calculate d using modular inverse (see below...)



Python tips
-----------
Implementations for fast modular exponentiation and modular inverse already
exist in Python, via the pow() function.

pow() supports a third argument, which is the modulus value: pow(b, e, n).

To perform fast mod expo for encryption, use pow(plaintext,  e, n)
                     ... for decryption, use pow(cyphertext, d, n)

To calculate mod inverse, use pow(e, -1, phi).



Extras
------
http://factordb.com/