# HW4

## Due Date: Feb 25, before midnight (11:59:59PM)

This assignment comprises both written questions and implementation-based lab.

## HW4

Answer the following questions from the DPV book i) Q1.33, ii) Q1.39, iii) Q1.40, and iv) Q1.42.

## Lab4: Generating Large Primes for Cryptography

Random Prime: Both RSA and Diffie-Hellman (DH) schemes require large prime numbers as keys. Given $n$, the number of bits, write a program to generate a random $n$-bit prime number, using the method described in sec 1.3.1 in the book. Basically, you will generate a random $n$-bit (odd) number and test whether it is a prime using the MillerRabin method you implemented in the previous lab. If the number is not a prime, repeat, until you generate a prime. Your method should print out the $n$-bit prime number, and the number of trials it took to generate one prime (note that the number of trials is different from the $k$ value you use in MillerRabin, which you can set to $k=10$.)

Random Relative Prime: RSA scheme also requires a random public key $e$ chosen so that it must be relatively prime to $M=(p-1) \cdot (q-1)$, where $p$ and $q$ are two random $n$-bit primes. You need to write a function to generate two random $n$-bit primes using the random prime algorithm above, and then you should generate $e$, a random (odd) number in the range $2$ to $M-1$ that is relative prime to $M$. Think about how you can efficiently generate such an $e$ and write a function to generate it.

Verification of $e$: When you generate $e$, you must verify that it is relatively prime to $M$ by checking whether their GCD is indeed $1$ via the Euclid algorithm in Fig 1.5.

Use submitty to submit exactly one PDF and one .py script. The .py script must be implemented in Python3. You can hand write your solutions to the HW, take pics, or you can type up your answers and convert to PDF.

The PDF file must contain your solutions to the HW, and the output from the python script. The script output the following information:

'p', number of bits in p, number of trials it took to generate $p$, value of $p$

'q', number of bits in q, number of trials it took to generate $q$, value of $q$

'e', number of bits in e, number of trials it took to generate $e$, value of $e$

'M', the GCD of $e$ and $M$, vaule of $M$

Try you code for $n=256, 512$. Try $n=1024$ if you can, or larger!