Проблема такая: Нужно написать программу-сервер, которая может принимать несколько подключений. Когда клиент подключается к серверу, он отправляет серверу симметричный ключ, который зашифрован открытым ключом. Сервер должен расшифровать симметричный ключ своим закрытым ключом и отправить расшифрованный ключ обратно клиенту.
Мой алгоритм таков: При подключении, клиент отправляет строку "1001" серверу, в ответ на которую тот посылает открытый ключ. Клиент шифрует данные и отправляет серверу, дальше все по условию. Но по какой-то причине мой сервер просто не принимает данные после "1001"! Прошу помочь разобраться.
Код клиента:
Сервер работает на машине 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
Мой алгоритм таков: При подключении, клиент отправляет строку "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:
b'1001'
[+] Public key was sent
Вывод программы на Ubuntu:
[+] Public key was written
[+] Symmetric key is encrypted
[+] Encrypted key is sent
[+] Decrypted key is received