-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsocket_client.py
More file actions
121 lines (55 loc) · 2.66 KB
/
socket_client.py
File metadata and controls
121 lines (55 loc) · 2.66 KB
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import socket
from threading import Thread
import des
HEADER_LENGTH = 128
client_socket = None
my_key = des.generate_keys()[0] # DES uses symmetric key
def connect(ip, port, my_username, error_callback):
global client_socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
client_socket.connect((ip, port))
except Exception as e:
error_callback('Connection error: {}'.format(str(e)))
return False
username = my_username.encode('utf-8')
username_header = f"{len(username):<{HEADER_LENGTH}}".encode('utf-8')
client_socket.send(username_header + username)
# Send DES key
key = repr(my_key).encode('utf-8')
key_header = f"{len(key):<{HEADER_LENGTH}}".encode('utf-8')
client_socket.send(key_header + key)
return True
def send(message, user):
print(f'\nOriginal message: \n{message}\n')
cipher = des.encrypt(message, user['key'])
print(f'\nEncrypted message: \n{cipher}\n')
message = (cipher + ':>>>:' + user['user']).encode('utf-8')
message_header = f"{len(message):<{HEADER_LENGTH}}".encode('utf-8')
client_socket.send(message_header + message)
def start_listening(incoming_message_callback, error_callback):
Thread(target=listen, args=(incoming_message_callback, error_callback), daemon=True).start()
def listen(incoming_message_callback, error_callback):
global my_key
while True:
try:
while True:
new_header = client_socket.recv(HEADER_LENGTH)
if not len(new_header):
error_callback('Connection closed by the server')
username_length = int(new_header.decode('utf-8').strip())
username = client_socket.recv(username_length).decode('utf-8')
message_header = client_socket.recv(HEADER_LENGTH)
message_length = int(message_header.decode('utf-8').strip())
if username != '__flag__':
cipher = client_socket.recv(message_length).decode('utf-8')
print(f'\nReceived encrypted message: \n{cipher}\n')
decrypted_message = des.decrypt(cipher, my_key)
print(f'\nDecrypted message: \n{decrypted_message}\n')
message = decrypted_message
else:
message = client_socket.recv(message_length).decode('utf-8')
incoming_message_callback(username, message)
except Exception as e:
print(f"Error details: {str(e)}") # Add detailed error logging
error_callback('Reading error: {}'.format(str(e)))