Форум программистов, компьютерный форум, киберфорум
Python: Сети
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 21.05.2022
Сообщений: 22
1

tcpServer не получает данные

14.07.2022, 05:36. Показов 568. Ответов 8

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

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

Код сервера:
Python
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
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
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
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
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.07.2022, 05:36
Ответы с готовыми решениями:

Можно ли получить ПОТОКОВЫЕ данные из открытой книги Excel, который одновременно получает данные из Power Query
Ситуация такая. Открытый лист Excel получает данные раз в минуту с Power Query из sql-сервера. В...

$.getJSON не получает данные
Доброго времени суток! Делаю выборку данных с помощью календаря в БД, задаю дату начал и конца,...

HttpURLConnection не получает данные на планшете
Добрый день. Столкнулся со странной ситуацией, которую никак не могу понять. ...

RedBeanPHP не получает данные из таблицы
Дело в том, что я использую RedBeanPHP. И я строю запросы таким образом: $userID = $_GET; ...

$_FILE не получает данные формы
<article> <div class="blockNews"><img src="data:image/jpeg;base64, <?php echo...

8
4284 / 964 / 138
Регистрация: 29.01.2013
Сообщений: 5,673
14.07.2022, 15:41 2
Я плохо понимаю, что тут происходит, но хорошо понимаю, что тестировать софт на kali не следует. клиент-сервер для начала можно тестить вообще на одной машине
Kali - вообще не для повседневных задач.
0
Эксперт по компьютерным сетям
5898 / 3355 / 1035
Регистрация: 03.11.2009
Сообщений: 10,003
14.07.2022, 18:35 3
Проблема в том, что у Вас сервер принимает одно сообщение и handler этого соединения завершается. Если нужно читать больше, чем одно сообщение - этого недостаточно.
1
1 / 1 / 0
Регистрация: 21.05.2022
Сообщений: 22
14.07.2022, 18:44  [ТС] 4
Так тут дело вообще не в Kali. У меня вопрос по коду((

Добавлено через 1 минуту
Цитата Сообщение от Jabbson Посмотреть сообщение
Проблема в том, что у Вас сервер принимает одно сообщение и handler этого соединения завершается. Если нужно читать больше, чем одно сообщение - этого недостаточно.
А как принимать больше сообщений?
0
Эксперт по компьютерным сетям
5898 / 3355 / 1035
Регистрация: 03.11.2009
Сообщений: 10,003
14.07.2022, 18:44 5
в цикле можно, например
0
1 / 1 / 0
Регистрация: 21.05.2022
Сообщений: 22
14.07.2022, 18:47  [ТС] 6
Цитата Сообщение от Jabbson Посмотреть сообщение
в цикле можно, например
Не подскажете, где можно посмотреть пример? Или какой кусок кода нужно поместить в цикл?
0
Эксперт по компьютерным сетям
5898 / 3355 / 1035
Регистрация: 03.11.2009
Сообщений: 10,003
14.07.2022, 18:50 7
первая ссылка, что была в гугле - https://realpython.com/python-sockets/#echo-server
видите, где "while True" - это цикл на принятие сообщение
0
1 / 1 / 0
Регистрация: 21.05.2022
Сообщений: 22
14.07.2022, 20:08  [ТС] 8
Цитата Сообщение от Jabbson Посмотреть сообщение
первая ссылка, что была в гугле - https://realpython.com/python-sockets/#echo-server
видите, где "while True" - это цикл на принятие сообщение
Благодарю, попытаюсь разобраться
0
Эксперт по компьютерным сетям
5898 / 3355 / 1035
Регистрация: 03.11.2009
Сообщений: 10,003
14.07.2022, 20:09 9
Цитата Сообщение от slyuqi Посмотреть сообщение
Благодарю, попытаюсь разобраться
Всегда пожалуйста. Там не должно быть сложно, пару строк добавить в код.
0
14.07.2022, 20:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.07.2022, 20:09
Помогаю со студенческими работами здесь

Клиент не получает найденные данные
Сервер: #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<iostream>...

Сервер не получает данные с $_POST
Записываю данные яваскриптом в поле так var formData = $('#Upload_data'); var imgData =...

Ajax не получает данные от сервера
При первом клике на ссылку данные не приходят при втором клике данные приходят. Ток начинаю...

Клиент на Android не получает данные с сервера
Сервер на компе, написан на .Net, клиент на Android, ставится на устройство. Находясь в одной сети...

Документ слияния получает данные с БД Access
Документ Word получает данные из запроса в базе данных Access, которая распроложена на диске D....

Неправильно получает данные скрипт. Подробнее внутри
Есть такой скрипт: v0=prompt("Введите начальную скорость", ""); sum=0; do{...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru