-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathclient.py
More file actions
93 lines (75 loc) · 3.04 KB
/
client.py
File metadata and controls
93 lines (75 loc) · 3.04 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
import rsa
import socket
import threading
from time import time, sleep
import PySimpleGUI as sg
class Client:
def __init__(self, ip, port, name):
self.msg = ''
self.name = name
# rsa setup
self.n, self.e, self.d = rsa.keygen(2048)
# connect to server
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.connect((ip, port))
self.setup()
# Start thread to receive messages asyncronously I believe
threading.Thread(target=self.receive).start()
# Create GUI
sg.theme('DarkAmber')
self.layout = [
[sg.Multiline(size=(50, 20), key='-MSG-', disabled=True, autoscroll=True)],
[sg.Input(key='-IN-', size=(50, 1)), sg.Button('Send')]
]
self.window = sg.Window('Chat App - ' + name, self.layout)
# Main loop
while True:
event, values = self.window.read(timeout=0)
if event == sg.WIN_CLOSED:
# closes the connection
self.sock.send(bytes(self.encrypt('quit'), 'utf-8'))
break
if self.msg != '':
# updates window when self.receive() modifies self.msg
self.window['-MSG-'].print(self.msg)
self.msg = ''
if event == 'Send':
message = values['-IN-']
if message != '':
self.window['-IN-'].update('')
self.sock.send(bytes(self.encrypt(message), 'utf-8'))
self.sock.close()
self.window.close()
def setup(self):
# send setup info to server
# send clients public key n,e as string
self.sock.send(bytes(str(self.n), 'utf-8')); sleep(.2)
self.sock.send(bytes(str(self.e), 'utf-8'))
# receive servers public key n_server, es. Then send encrypted name
self.n_server = int(self.sock.recv(1024).decode('utf-8')); sleep(.2);
self.e_server = int(self.sock.recv(1024).decode('utf-8'))
self.sock.send(bytes(str(self.encrypt(f'{self.name}')), 'utf-8'))
#print(f'ns:{self.n_server}, es:{self.e_server}')
def receive(self):
while True:
try:
self.msg = self.decrypt(self.sock.recv(1024).decode('utf-8'))
#print(self.msg)
except OSError:
break
def encrypt(self, message):
strr = ''
width = rsa.bitLength(self.n_server)
for c in message:
strr += rsa.dec2bin(rsa.encrypt(ord(c), self.n_server, self.e_server), width)
return(strr)
def decrypt(self, message):
width = rsa.bitLength(self.n)
strr = ''
for i in range(0, len(message) - 1, width):
# Sub-stringing the string
s = message[i: i + width]
y = rsa.bin2dec(s)
y = rsa.decrypt(y, self.n, self.d)
strr += chr(y)
return strr