· 4 years ago · Jul 31, 2021, 09:38 AM
1import socket
2import sys
3import json
4import threading
5import random
6import base64
7from simplecrypt import encrypt, decrypt
8
9
10from config import SERVER_ADDRESS, BUFSIZE, MODULUS, BASE
11
12sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
13sock.connect(SERVER_ADDRESS)
14
15secret_key = random.randint(1, MODULUS)
16public_key = (BASE ** secret_key) % MODULUS
17e2e_key = None
18
19
20def calculate_e2ekey(pubkey):
21 global e2e_key
22 e2e_key = (pubkey ** secret_key) % MODULUS
23
24
25def send_message(text):
26 sock.send(bytes(json.dumps({'type': 'message', 'text': text}), 'utf8'))
27
28
29def handle_read():
30
31 while True:
32 data = sock.recv(BUFSIZE).decode('utf8')
33 data = json.loads(data)
34
35 if data.get('type') == 'init':
36 # public key lawan chat
37 pubkey = data.get('pubkey')
38 calculate_e2ekey(pubkey)
39 print('system\t>>\tReady! (e2e key={})'.format(e2e_key))
40
41 if data.get('type') == 'system':
42 print('system\t>>\t{}'.format(data['text']))
43
44 # hanya tampilkan pesan dari lawan chat atau system
45 if data.get('type') == 'message' and data.get('name') != sys.argv[1]:
46 decoded = base64.b64decode(data['text'])
47 text = decrypt(str(e2e_key), decoded)
48 print('{}\t>>\t{}'.format(data['name'], text.decode('utf8')))
49
50
51if __name__ == '__main__':
52 print('\nsecret_key={}'.format(secret_key))
53 print('public_key={}\n\n'.format(public_key))
54
55 try:
56 # send init message first
57 sock.send(
58 bytes(json.dumps({'type': 'init', 'name': sys.argv[1], 'pubkey': public_key}), 'utf8'))
59 thread = threading.Thread(target=handle_read).start()
60
61 while True:
62 msg = input()
63 if msg == 'quit':
64 send_message('quit')
65 break
66 else:
67 chipertext = encrypt(str(e2e_key), msg)
68 send_message(base64.b64encode(chipertext).decode('utf8'))
69 finally:
70 sock.close()
71