Implementação de Comunicação em Socket com Criptografia em Python

Sistema de Comunicação Cliente-Servidor com Criptografia

Este projeto demonstra a comunicação entre cliente e servidor usando sockets TCP em Python, com criptografia básica e registro de logs em arquivo.

Servidor (Linha de Comando)

import socket

servidor = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = "0.0.0.0"
porta = 5555
servidor.bind((host, porta))
servidor.listen(5)

print("Servidor aguardando conexões...")
conexao, endereco = servidor.accept()
print(f"Conexão estabelecida com {endereco}")

def cifrar(texto):
    return ''.join(chr(ord(caractere) + 5) for caractere in texto)

def decifrar(texto):
    return ''.join(chr(ord(caractere) - 5) for caractere in texto)

with open("registro_servidor.txt", "w") as log:
    try:
        while True:
            dados = conexao.recv(1024).decode()
            if not dados:
                break
                
            texto_decifrado = decifrar(dados)
            print(f"Mensagem recebida (cifrada): {dados}")
            print(f"Mensagem decifrada: {texto_decifrado}")
            log.write(f"Recebido cifrado: {dados}\n")
            log.write(f"Decifrado: {texto_decifrado}\n\n")
            
            resposta = input("Resposta: ")
            resposta_cifrada = cifrar(resposta)
            conexao.send(resposta_cifrada.encode())
            log.write(f"Enviado decifrado: {resposta}\n")
            log.write(f"Enviado cifrado: {resposta_cifrada}\n\n")
            
    finally:
        conexao.close()
        servidor.close()

Cliente (Linha de Comando)

import socket

cliente = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
cliente.connect(("127.0.0.1", 5555))

def cifrar(texto):
    return ''.join(chr(ord(c) + 5) for c in texto)

def decifrar(texto):
    return ''.join(chr(ord(c) - 5) for c in texto)

with open("registro_cliente.txt", "w") as log:
    try:
        while True:
            mensagem = input("Mensagem: ")
            mensagem_cifrada = cifrar(mensagem)
            cliente.send(mensagem_cifrada.encode())
            log.write(f"Enviado decifrado: {mensagem}\n")
            log.write(f"Enviado cifrado: {mensagem_cifrada}\n\n")
            
            resposta = cliente.recv(1024).decode()
            resposta_decifrada = decifrar(resposta)
            print(f"Resposta recebida (cifrada): {resposta}")
            print(f"Resposta decifrada: {resposta_decifrada}")
            log.write(f"Recebido cifrado: {resposta}\n")
            log.write(f"Decifrado: {resposta_decifrada}\n\n")
            
    finally:
        cliente.close()

Implemenatção com Interface Gráfica

Sistema aprimorado com GUI usando Tkinter e multithreading:

Servidor GUI

import socket
import threading
import tkinter as tk

def cifrar(texto):
    return ''.join(chr(ord(c) + 5) for c in texto)

def decifrar(texto):
    return ''.join(chr(ord(c) - 5) for c in texto)

class ServidorGUI:
    def __init__(self, janela):
        self.janela = janela
        self.janela.title("Servidor de Chat Criptografado")
        
        self.area_chat = tk.Text(janela, state=tk.DISABLED)
        self.area_chat.pack()
        
        self.entrada = tk.Entry(janela)
        self.entrada.pack()
        self.entrada.bind("<Return>", self.enviar_mensagem)
        
        tk.Button(janela, text="Enviar", command=self.enviar_mensagem).pack()
        
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.socket.bind(("0.0.0.0", 5555))
        self.socket.listen(1)
        
        threading.Thread(target=self.aceitar_conexoes, daemon=True).start()
    
    def aceitar_conexoes(self):
        self.conexao, addr = self.socket.accept()
        threading.Thread(target=self.receber_dados, daemon=True).start()
    
    def receber_dados(self):
        while True:
            dados = self.conexao.recv(1024).decode()
            texto_decifrado = decifrar(dados)
            self.mostrar_mensagem(f"Cliente: {texto_decifrado}")
    
    def enviar_mensagem(self, evento=None):
        mensagem = self.entrada.get()
        self.conexao.send(cifrar(mensagem).encode())
        self.mostrar_mensagem(f"Servidor: {mensagem}")
        self.entrada.delete(0, tk.END)
    
    def mostrar_mensagem(self, msg):
        self.area_chat.config(state=tk.NORMAL)
        self.area_chat.insert(tk.END, msg + "\n")
        self.area_chat.config(state=tk.DISABLED)

root = tk.Tk()
app = ServidorGUI(root)
root.mainloop()

Cliente GUI

import socket
import threading
import tkinter as tk

def cifrar(texto):
    return ''.join(chr(ord(c) + 5) for c in texto)

def decifrar(texto):
    return ''.join(chr(ord(c) - 5) for c in texto)

class ClienteGUI:
    def __init__(self, janela):
        self.janela = janela
        self.janela.title("Cliente de Chat Criptografado")
        
        self.area_chat = tk.Text(janela, state=tk.DISABLED)
        self.area_chat.pack()
        
        self.entrada = tk.Entry(janela)
        self.entrada.pack()
        self.entrada.bind("<Return>", self.enviar_mensagem)
        
        tk.Button(janela, text="Enviar", command=self.enviar_mensagem).pack()
        
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.socket.connect(("127.0.0.1", 5555))
        
        threading.Thread(target=self.receber_dados, daemon=True).start()
    
    def receber_dados(self):
        while True:
            dados = self.socket.recv(1024).decode()
            texto_decifrado = decifrar(dados)
            self.mostrar_mensagem(f"Servidor: {texto_decifrado}")
    
    def enviar_mensagem(self, evento=None):
        mensagem = self.entrada.get()
        self.socket.send(cifrar(mensagem).encode())
        self.mostrar_mensagem(f"Cliente: {mensagem}")
        self.entrada.delete(0, tk.END)
    
    def mostrar_mensagem(self, msg):
        self.area_chat.config(state=tk.NORMAL)
        self.area_chat.insert(tk.END, msg + "\n")
        self.area_chat.config(state=tk.DISABLED)

root = tk.Tk()
app = ClienteGUI(root)
root.mainloop()

Análise da Implementação GUI

Prinncipais vantagens da versão com interface gráfica:

  • Processamento paralelo com multithreading para operações de rede
  • Interface responsiva sem bloqueio durante operações I/O
  • Gerenciamento automático de recusros com context managers
  • Tratamento robusto de exceções e desconexões
  • Separação clara entre lógica de rede e interface

Tags: Python sockets TCP criptografia Tkinter

Publicado em 6-17 00:42