# TCP Chat com Cifra de César
Instruções de uso
1) Inicie o servidor:
python [Link]
(Por padrão escuta em [Link]:5000 com shift=3)
2) Inicie um cliente em outra máquina/terminal:
python [Link] <host> <port> <shift>
Exemplo:
python [Link] [Link] 5000 3
3) No cliente, digite mensagens e pressione Enter para enviar.
Digite /quit ou pressione Ctrl+C para sair.
Notas:
- As mensagens são cifradas com uma cifra de César simples antes de serem enviadas.
- O shift padrão é 3, mas você pode alterar no servidor e no cliente (devem concordar).
- Este é um exemplo educacional; para uso real, utilize criptografia robusta (TLS).
--- SERVER ([Link]) ---
# [Link]
import socket
import threading
# Simple Caesar cipher
def caesar_encrypt(text, shift=3):
result = []
for ch in text:
if 'a' <= ch <= 'z':
[Link](chr((ord(ch) - ord('a') + shift) % 26 + ord('a')))
elif 'A' <= ch <= 'Z':
[Link](chr((ord(ch) - ord('A') + shift) % 26 + ord('A')))
else:
[Link](ch)
return ''.join(result)
def caesar_decrypt(text, shift=3):
return caesar_encrypt(text, -shift)
def handle_client(conn, addr, shift):
print(f'Cliente conectado: {addr}')
try:
while True:
data = [Link](4096)
if not data:
break
enc = [Link]('utf-8')
dec = caesar_decrypt(enc, shift)
print(f'[{addr}] (decrypted): {dec}')
# Echo back (re-encrypted) so client sees confirmation
resp = f"Servidor recebeu: {dec}"
[Link](caesar_encrypt(resp, shift).encode('utf-8'))
except ConnectionResetError:
print('Conexão encerrada pelo cliente.')
finally:
[Link]()
print(f'Conexão com {addr} encerrada.')
def start_server(host='[Link]', port=5000, shift=3):
s = [Link](socket.AF_INET, socket.SOCK_STREAM)
[Link]((host, port))
[Link](5)
print(f'Servidor ouvindo em {host}:{port} (Caesar shift={shift})')
try:
while True:
conn, addr = [Link]()
t = [Link](target=handle_client, args=(conn, addr, shift), daemon=True)
[Link]()
except KeyboardInterrupt:
print('Servidor encerrado manualmente.')
finally:
[Link]()
if __name__ == '__main__':
# Run with: python [Link]
start_server()
--- CLIENT ([Link]) ---
# [Link]
import socket
import threading
import sys
def caesar_encrypt(text, shift=3):
result = []
for ch in text:
if 'a' <= ch <= 'z':
[Link](chr((ord(ch) - ord('a') + shift) % 26 + ord('a')))
elif 'A' <= ch <= 'Z':
[Link](chr((ord(ch) - ord('A') + shift) % 26 + ord('A')))
else:
[Link](ch)
return ''.join(result)
def caesar_decrypt(text, shift=3):
return caesar_encrypt(text, -shift)
def receive_loop(sock, shift):
try:
while True:
data = [Link](4096)
if not data:
print('Conexão encerrada pelo servidor.')
break
enc = [Link]('utf-8')
dec = caesar_decrypt(enc, shift)
print(f'<< {dec}')
except ConnectionResetError:
print('Conexão perdida.')
finally:
[Link]()
def start_client(host='[Link]', port=5000, shift=3):
sock = [Link](socket.AF_INET, socket.SOCK_STREAM)
[Link]((host, port))
print(f'Conectado a {host}:{port} (Caesar shift={shift})')
t = [Link](target=receive_loop, args=(sock, shift), daemon=True)
[Link]()
try:
while True:
msg = input()
if [Link]() in ('/quit', '/exit'):
print('Encerrando cliente.')
break
enc = caesar_encrypt(msg, shift)
[Link]([Link]('utf-8'))
except KeyboardInterrupt:
print('Encerrando cliente (CTRL+C).')
finally:
[Link]()
if __name__ == '__main__':
# Run with: python [Link]
# Optional: python [Link] <host> <port> <shift>
import sys
host = '[Link]'
port = 5000
shift = 3
if len([Link]) >= 2:
host = [Link][1]
if len([Link]) >= 3:
port = int([Link][2])
if len([Link]) >= 4:
shift = int([Link][3])
start_client(host, port, shift)