forked from rejunges/Bate-Papo
-
Notifications
You must be signed in to change notification settings - Fork 0
/
cliente.py
179 lines (140 loc) · 4.58 KB
/
cliente.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
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
import socket
import sys
import threading
import os
import time
from cryptography import AESciph
from cryptography import RSAciph
from cryptography import RSA
#aes = AESciph()
rsa = RSAciph()
class Cliente:
'''Usuário do bate-papo'''
def __init__(self, host = '127.0.0.1', port = 9999):
'''Inicializa as variáveis iniciais do cliente'''
self.host = host
self.port = port
self.aes = AESciph()
def mostrar_chaves(self):
PB_KEY = rsa.get_public_key().exportKey('PEM').decode('utf-8')
PV_KEY = rsa.get_private_key().exportKey('PEM').decode('utf-8')
print(f'\n\nCHAVE PUBLICA - CLIENTE\n\n{PB_KEY}\n\n')
print(f'\n\nCHAVE PRIVADA - CLIENTE\n\n{PV_KEY}\n\n')
print(f'\n\nCHAVE PUBLICA - SERVIDOR\n\n{self.SERVIDOR_KEY}\n\n')
def envia_mensagem(self, serv_key):
'''Envia mensagem ao servidor'''
#try:
# importanto a chave do servidor
serv_key = RSA.importKey(serv_key)
while True:
msg = input()
#print('\nEncriptando mensagem...')
self.aes = AESciph()
msg_encr, aes_key, aes_iv = self.aes.encrypto(msg, self.aes.key, self.aes.iv)
#print(f'MSG ENCRIPTO = {msg_encr}\n')
print(f'\nAES KEY = {aes_key}\n')
# print(f'AES IV = {aes_iv}\n')
# print('encriptando chave...')
aes_key_encr = rsa.encrypto(aes_key, serv_key)
#print(f'KEY ENCRIPTO = {aes_key_encr}\n')
#print('encriptando iv...')
aes_iv_encr = rsa.encrypto(aes_iv, serv_key)
#print(f'IV ENCRIPTO = {aes_iv_encr}\n')
#print(f'envidando mensagem...')
self.s.sendall(msg_encr)
time.sleep(0.5)
#print(f'envidando chave...')
self.s.sendall(aes_key_encr)
time.sleep(0.5)
#print(f'envidando iv...\n')
self.s.sendall(aes_iv_encr)
time.sleep(0.5)
#print('mensagem enviada!!!')
#self.s.send(msg.encode('utf-8'))
is_saida = msg.split() #Coloca as substrings da mensagem numa lista
if not is_saida:
continue
if is_saida[0] == '/tchau':
self.s.close()
os._exit(1)
# except: #Trata o CTRL+C
# print("Erro: envio de mesagem errada")
# msg = '/tchau'
# self.s.send(msg.encode('utf-8'))
# self.s.close()
# os._exit(1)
def recebe_msg_chave_iv(self):
msg = self.s.recv(10240)
#print(f'\nMensagem recebida encriptografada = {msg}\n')
time.sleep(0.5)
key = self.s.recv(6144)
#print(f'Chave recebida encriptografada = {key}\n')
time.sleep(0.5)
iv = self.s.recv(6144)
#print(f'iv recebida encriptografada = {iv}\n')
key = rsa.decrypto(key).decode('utf-8')
print(f'chave recebida decriptografada = {key}')
iv = rsa.decrypto(iv).decode('utf-8')
#print(f'iv decriptografada = {iv}')
print(msg)
msg = self.aes.decrypto(msg, key, iv).decode('utf-8')
print(f'mensagem decriptografada = {msg}\n')
def recebe_mensagem_do_servidor(self):
'''Recebe mensagem do servidor'''
while True:
msg = self.s.recv(4096).decode('utf-8')
time.sleep(0.5)
if msg == '/SERVIDOR_OFF': #Servidor por algum motivo encerrou
print('Encerrando conexão, servidor está OFF.')
self.s.close()
os._exit(1)
elif msg.startswith('/BANIDO'):
print(' '.join(msg.split()[1:]))
self.s.close()
os._exit(1)
elif msg == '/vaichave':
self.recebe_msg_chave_iv()
else:
print (msg)
def cria_conexao_tcp(self):
'''Cria conexão TCP com o servidor'''
try:
self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #Cria a conexão TCP
except:
print('Erro ao criar o socket')
os._exit(1)
dest = (self.host, self.port)
try:
self.s.connect(dest) #conecta ao servidor
except:
print("Servidor não está conectado no momento.")
sys.exit()
def main(self):
'''Começa a execução do cliente, conecta socket TCP '''
self.cria_conexao_tcp()
# pegando a chave publica do servidor
self.SERVIDOR_KEY = self.s.recv(2048).decode('utf-8')
# enviando a minha chave publica
self.s.send(rsa.get_public_key().exportKey('PEM'))
# mandando o apelido para o servidor
msg = self.s.recv(4096).decode('utf-8')
self.mostrar_chaves()
apelido = input("Apelido: ")
self.s.sendall(apelido.encode('utf-8'))
thread = threading.Thread(target = self.recebe_mensagem_do_servidor)
thread.start()
self.envia_mensagem(self.SERVIDOR_KEY)
if __name__ == "__main__":
cliente = Cliente()
cliente.main()
# SERVIDOR_KEY = rsa.get_public_key()
# msg = "oi"
# msg_encr, aes_key = aes.encrypto(msg) # bytes
# print(aes_key)
# key_encr = rsa.encrypto(aes_key, SERVIDOR_KEY) # bytes
# print(type(key_encr))
# print(type(msg_encr))
# print(key_encr)
# print(msg_encr)
# print(rsa.decrypto(key_encr).decode('utf-8'))
# print(aes.decrypto(msg_encr, rsa.decrypto(key_encr).decode('utf-8')).decode('utf-8'))