-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsec_ecdh.py
65 lines (43 loc) · 1.63 KB
/
sec_ecdh.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
#!/usr/bin/env python3
from ecdsa import ECDH, NIST256p
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
from Crypto.Util.Padding import pad, unpad
class C_ECDH:
def __init__(self):
"""
"""
self.ecdh = ECDH(curve=NIST256p)
self.ecdh.generate_private_key()
def get_public_key(self):
"""
"""
return self.ecdh.get_public_key().to_pem()
def generate_secret(self, peer_public_key):
"""
"""
"""
with open("remote_public_key.pem") as e:
remote_public_key = e.read()
"""
self.ecdh.load_received_public_key_pem(peer_public_key)
self.b_secrets = self.ecdh.generate_sharedsecret_bytes()
def encrypt(self, data: str) -> bytes:
vector = get_random_bytes(AES.block_size)
cipher = AES.new(self.b_secrets, AES.MODE_CBC, vector)
return vector + cipher.encrypt(pad(data.encode(), AES.block_size))
def decrypt(self, data: bytes) -> bytes:
iv = data[:16]
data = data[16:]
decryption_cipher = AES.new(self.b_secrets, AES.MODE_CBC, iv)
return unpad(decryption_cipher.decrypt(data), AES.block_size)
if __name__ == "__main__":
client1 = C_ECDH()
client2 = C_ECDH()
client1_public_key = client1.get_public_key()
client2_secrets = client2.generate_secret(client1_public_key)
client1_secrets = client1.generate_secret(client2.get_public_key())
text = "hello world"
e_text_client1 = client1.encrypt(text)
e_text_client2 = client2.encrypt(text)
assert(client1.decrypt(e_text_client1) == client2.decrypt(e_text_client2))