rsa.py
import random
import math #select 2 large prime numbers def generate_p_and_q(): #Calculating 1 to 100 prime numbers numbs = [i for i in range(2,101)] for n in range(2,101): for i in range(2,math.ceil(n/2)+1): if n % i == 0: numbs.remove(n) break else: continue #Selecting any 2 prime numbers randomly p = random.choice(numbs) numbs.remove(p) q = random.choice(numbs) return p, q p,q = generate_p_and_q() print(f'[+] p = {p} and q = {q}') n = p * q phi = (p - 1) * (q - 1) print(f'[+] n = {n} and euler totient = {phi}') #Calculating e -> gcd(e,phi) = 1 and 1 < e <phi. def generate_e(phi): possible_e_values = [] for i in range(2,phi): if math.gcd(i,phi) == 1: e=i possible_e_values.append(e) # print(possible_e_values) return random.choice(possible_e_values) e = generate_e(phi) print(f'[+] e = {e}') def generate_d(e,phi): # d_list = [] for i in range(2,phi): if (i*e) % phi == 1: # ed mod(phi) = 1 d = i # As every unique public key have only one unique private key. # d_list.append(d) break # print(d_list) return d d = generate_d(e,phi) print(f'[+] d = {d}') # Message should be less than n (msg < n) msg = random.randint(1,n) print(f'[+] msg : {msg}') def encrypt(msg,e,n): #(msg^e) mod n c = pow(msg,e,n) return c e_msg = encrypt(msg,e,n) print(f'[+] Encrypted msg : {e_msg}') def decrypt(msg,d,n): #(msg^d) mod n p = pow(msg,d,n) return p d_msg = decrypt(e_msg,d,n) print(f'[+] Decrypted msg : {d_msg}')
-----------------
Output
No comments:
Post a Comment