• XSS.stack #1 – первый литературный журнал от юзеров форума

TCPServer не принимает данные

koukishinouse

floppy-диск
Пользователь
Регистрация
14.07.2022
Сообщения
8
Реакции
1
Проблема такая: Нужно написать программу-сервер, которая может принимать несколько подключений. Когда клиент подключается к серверу, он отправляет серверу симметричный ключ, который зашифрован открытым ключом. Сервер должен расшифровать симметричный ключ своим закрытым ключом и отправить расшифрованный ключ обратно клиенту.

Мой алгоритм таков: При подключении, клиент отправляет строку "1001" серверу, в ответ на которую тот посылает открытый ключ. Клиент шифрует данные и отправляет серверу, дальше все по условию. Но по какой-то причине мой сервер просто не принимает данные после "1001"! Прошу помочь разобраться.

Python:
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import hashes
import socketserver
 
 
class ClientHandler(socketserver.BaseRequestHandler):
    def handle(self):
        data = self.request.recv(4096)
        print(data)
 
        if data.decode() == "1001":
            with open("public_key.key", "rb") as file:
                key = file.read()
            self.request.sendall(key)
            print("[+] Public key was sent")
        else:
            print("[+] Encrypted key is recieved")
 
            with open("pub_priv_pair.key", "rb") as key_file:
                private_key = serialization.load_pem_private_key(
                        key_file.read(),
                        password=None)
                print("[+] Private key is read")
            
            decrypted_key = private_key.decrypt(
                data,
                padding.OAEP(
                        mgf=padding.MGF1(algorithm=hashes.SHA256()),
                        algorithm=hashes.SHA256(),
                        label=None))
            print("[+] Symmetric key is decrypted")
 
            self.request.sendall(decrypted_key.encode())
            print("[+] Decrypted key was sent")
 
 
if __name__ == "__main__":
    HOST, PORT = "", 8000
    tcpServer = socketserver.TCPServer((HOST, PORT), ClientHandler)
    try:
        tcpServer.serve_forever()
    except:
        print("There was an error")
Код клиента:
Python:
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives import hashes
from cryptography.fernet import Fernet
import sys
import socket
 
 
def get_public_key(socket):
    with open("public_key.key", "wb") as file:
        file.write(socket.recv(3072))
        print("[+] Public key was written")
    
    with open("public_key.key", "rb") as file:
        public_key = serialization.load_pem_public_key(
            file.read(),
            backend=default_backend()
        )
    return public_key
 
 
def encrypt_symmetric_key(public_key):
    symmetricKey = Fernet.generate_key()
    encrypted_key = public_key.encrypt(
        symmetricKey,
        padding.OAEP(
            mgf=padding.MGF1(algorithm=hashes.SHA256()),
            algorithm=hashes.SHA256(),
            label=None
        )
    )
    print("[+] Symmetric key is encrypted")
    return encrypted_key
 
 
IP = sys.argv[1]
if __name__ == "__main__":
    clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    clientSocket.connect((IP, 8000))
    clientSocket.send("1001".encode())
    encrypted_key = encrypt_symmetric_key(get_public_key(clientSocket))
    clientSocket.send(encrypted_key)
    print("[+] Encrypted key is sent")
    decrypted_key = clientSocket.recv(3072).decode()
    print("[+] Decrypted key is received")
    print(decrypted_key)
Сервер работает на машине Kali Linux, а клиент на Ubuntu.

Вывод программы на Kali:
b'1001'
[+] Public key was sent

Вывод программы на Ubuntu:
[+] Public key was written
[+] Symmetric key is encrypted
[+] Encrypted key is sent
[+] Decrypted key is received
 
Может быть потому, что серверный хендлер принимает соединение, а не отдельное сообщение? Оберни код хендлера в while True
Python:
def handle(self):
    while True:
        data = self.request.recv(4096)
        if len(data) == 0: break # клиент закрыл соединение
        print(data)
 
Последнее редактирование:
Понял, большое спасибо.
Может быть потому, что серверный хендлер принимает соединение, а не отдельное сообщение? Оберни код хендлера в while True
Python:
def handle(self):
    while True:
        data = self.request.recv(4096)
        if len(data) == 0: break # клиент закрыл соединение
        print(data)
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх