# RSA * `p * q = n` * Coprime Phi is calculated either by [Euler Totient](https://en.wikipedia.org/wiki/Euler's_totient_function) or [greatest common divisor](https://en.wikipedia.org/wiki/Greatest_common_divisor) via [euclidean algorithm](https://crypto.stanford.edu/pbc/notes/numbertheory/euclid.html) * \\(1 < $\phi$ < n \\) * There is also $\phi$ = (p-1) * (q-1) * Encryption, public key `e` is a prime between 2 and phi --> \\( 2 < e < $\phi$ \\) ```python possible_e = [] for i in range (2, phi): if gcd(n, i) == 1 and gcd(phi, i) == 1: possible_e.append() ``` * Decryption, private key `d` --> \\( d * e mod $\phi$ = 1 \\) ```python possible_d = [] for i in range (phi + 1, phi + foo): if i * e mod phi == 1 : possible_d.append() ``` * \\( Cipher = msg ** d mod $\phi$ \\) * \\( Cleartext = cipher ** e mod $\phi$ ) ## Euklid Just a short excourse: A greatest common divisior out of an example a = 32 and b = 14 would be the groups of the following divisors ```sh a = 32, b = 24 a = {1, 2, 4, 8, 16} b = {1, 2, 3, 8, 12} gcd(a,b) = 8 ``` ### Greatest Common Divisor (GCD) Two values are prime and have themselves and only `1` as a divisor are called coprime. To check if a and b have a greatest common divisor do the euclidean algorithm. ```python def gcd(a, b): if b == 0: return a return gcd(b, a % b) ``` ### Extended GCD #TODO ## Links * [Encryption+Decryption](https://www.cs.drexel.edu/~jpopyack/Courses/CSP/Fa17/notes/10.1_Cryptography/RSA_Express_EncryptDecrypt_v2.html) * [Extended GCD](http://www-math.ucdenver.edu/~wcherowi/courses/m5410/exeucalg.html)