-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdiffie-hellman.py
99 lines (67 loc) · 2.64 KB
/
diffie-hellman.py
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
from time import sleep
def is_prime(number):
factors = []
for i in range(2, int(number**0.5)+1):
if (number/i)%1 == 0:
factors.append(i)
if len(factors) > 0:
return False
else:
return True
def calculate_generator(prime):
if is_prime(prime) == False:
return False
generators = []
for i in range(2, prime):
results = []
for j in range(2, prime):
results.append(pow(i, j, prime))
if len(set(results)) == len(results):
generators.append(i)
return generators
def create_pub_key(generator, private_key, prime):
return pow(generator, private_key, prime)
def encode_string(string):
char_array = []
for char in string:
char_array.append(ord(char))
return char_array
def encrypt_message(super_key, message_array, prime):
encrypted_array = []
for num in message_array:
encrypted_array.append(num + super_key % prime)
return encrypted_array
def decrypt_message(super_key, encrypted_array, prime):
decrypted_message = []
for num in encrypted_array:
decrypted_message.append(num - super_key % prime)
return decrypted_message
def dh():
p1 = input("Person 1's name: ")
p2 = input("Person 2's name: ")
prime = int(input("choose a shared prime number: "))
while is_prime(prime) == False:
prime = int(input("that's not prime, try again: "))
gen = int(input(f"select a shared generator from the list {calculate_generator(prime)}: "))
p1private_key = int(input(f"{p1} select a private key: "))
p1public_key = create_pub_key(gen, p1private_key, prime)
p2private_key = int(input(f"{p2} select a private key: "))
p2public_key = create_pub_key(gen, p2private_key, prime)
print("calculating public keys: a**(private_key) % p \n")
sleep(2)
print(f"{p1}'s private key: {p1private_key}, public key: {p1public_key}")
print(f"{p2}'s private key: {p2private_key}, public key: {p2public_key}")
input(f"Your shared numbers are p: {prime}, a: {gen}")
print("calculating super key")
sleep(2)
super_key1 = pow(p2public_key, p1private_key, prime)
super_key2 = pow(p1public_key, p2private_key, prime)
if super_key1 != super_key2:
print("Oops, something went wrong...")
print(f"super key is {super_key1}")
message = input(f"{p1}, what message do you want to send to {p2}? ")
message_array = encode_string(message)
print(message_array)
print("now encrypting message (each letter individually)")
encrypted = encrypt_message(super_key1, message_array, prime)
print(encrypted)