Skip to content

Commit 40b4c5a

Browse files
committed
add diffie hellman exchange
1 parent 69e4b75 commit 40b4c5a

File tree

1 file changed

+74
-0
lines changed

1 file changed

+74
-0
lines changed

python/cryptography/diffie_hellman.py

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import random
2+
3+
4+
class Network:
5+
def __init__(self) -> None:
6+
self.users = []
7+
self.base = 13
8+
self.mod = random.getrandbits(4000)
9+
10+
def _rotate_users(self):
11+
self.users = self.users[1:] + [self.users[0]]
12+
13+
def key_exchange(self) -> None:
14+
for _ in range(len(self.users)):
15+
curr_base = self.base
16+
17+
for user in self.users:
18+
store_key = user is self.users[-1]
19+
20+
key = user.sign_key(curr_base, store_key)
21+
curr_base = key
22+
23+
self._rotate_users()
24+
25+
26+
class User:
27+
def __init__(self, network: Network) -> None:
28+
self.network = network
29+
self.network.users.append(self)
30+
31+
self.network_key = None
32+
self.private_key = random.randint(self.network.mod//2, self.network.mod-1)
33+
34+
def sign_key(self, key: int, store_key: bool) -> int:
35+
network_key = pow(key, self.private_key, self.network.mod)
36+
37+
if store_key:
38+
self.network_key = network_key
39+
40+
return network_key
41+
42+
43+
44+
45+
if __name__ == "__main__":
46+
# TEST
47+
network1 = Network()
48+
49+
user1 = User(network1)
50+
user2 = User(network1)
51+
user3 = User(network1)
52+
user4 = User(network1)
53+
user5 = User(network1)
54+
user6 = User(network1)
55+
user7 = User(network1)
56+
57+
network1.key_exchange()
58+
59+
check_key = pow(
60+
network1.base,
61+
user1.private_key*
62+
user2.private_key*
63+
user3.private_key*
64+
user4.private_key*
65+
user5.private_key*
66+
user6.private_key*
67+
user7.private_key,
68+
network1.mod
69+
)
70+
71+
for user in network1.users:
72+
assert user.network_key == check_key
73+
74+
print(check_key)

0 commit comments

Comments
 (0)