From acc8d6f64f2d93bfe1a81ded0f79b5917abf9d08 Mon Sep 17 00:00:00 2001 From: broBaagas Date: Thu, 9 Oct 2025 21:26:00 +0700 Subject: [PATCH] upload --- client.py | 40 -------------- client_encrypted.py | 95 +++++++++++++++++++++++++++++++++ server.py | 90 ------------------------------- server_encrypted.py | 126 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 221 insertions(+), 130 deletions(-) delete mode 100644 client.py create mode 100644 client_encrypted.py delete mode 100644 server.py create mode 100644 server_encrypted.py diff --git a/client.py b/client.py deleted file mode 100644 index d22bd49..0000000 --- a/client.py +++ /dev/null @@ -1,40 +0,0 @@ -import socket -import threading -import sys -import argparse - -def receive(sock): - while True: - try: - msg = sock.recv(1024).decode() - if msg: - print(msg) - except: - print("[!] Disconnected from server") - break - -def start_client(host, port): - client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - client.connect((host, port)) - - # thread khusus buat nerima pesan - thread = threading.Thread(target=receive, args=(client,), daemon=True) - thread.start() - - print(f"Connected to chat {host}:{port}. Ketik pesanmu (atau 'exit' untuk keluar):") - while True: - msg = input("") - if msg.lower() == "exit": - client.sendall("[Client keluar dari chat]".encode()) - client.close() - print("Bye 👋") - sys.exit(0) - client.sendall(msg.encode()) - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("--host", type=str, required=True, help="Server IP") - parser.add_argument("--port", type=int, required=True, help="Server Port") - args = parser.parse_args() - - start_client(args.host, args.port) diff --git a/client_encrypted.py b/client_encrypted.py new file mode 100644 index 0000000..556af09 --- /dev/null +++ b/client_encrypted.py @@ -0,0 +1,95 @@ +# client.py +# Chat Client terenkripsi dua arah menggunakan Fernet (AES-GCM) +# Jalankan: python client.py --host 127.0.0.1 --port 12345 +# Pastikan: pip install cryptography + +import socket +import threading +import sys +import argparse +from cryptography.fernet import Fernet + +KEY_FILE = "secret.key" + +# Load key (harus sama dengan server) +try: + with open(KEY_FILE, "rb") as f: + KEY = f.read() +except FileNotFoundError: + print(f"[!] File '{KEY_FILE}' tidak ditemukan. Copy dari server terlebih dahulu.") + sys.exit(1) + +CIPHER = Fernet(KEY) + + +def receive(sock): + """Thread untuk menerima pesan terenkripsi dari server.""" + while True: + try: + data = sock.recv(4096) + if not data: + print("[!] Koneksi ke server terputus.") + break + + # Dekripsi pesan dari server + try: + plain = CIPHER.decrypt(data).decode() + print(plain) + except Exception: + try: + print(data.decode()) + except: + print("[!] Pesan tidak dapat didekripsi.") + except Exception: + print("[!] Terputus dari server.") + break + + +def start_client(host, port): + """Mulai koneksi ke server dan kirim pesan terenkripsi.""" + client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + try: + client.connect((host, port)) + except Exception as e: + print(f"[x] Gagal terhubung ke server {host}:{port} — {e}") + sys.exit(1) + + threading.Thread(target=receive, args=(client,), daemon=True).start() + + print(f"Connected to chat {host}:{port}") + print("Ketik pesanmu (atau 'exit' untuk keluar):") + + while True: + try: + msg = input("") + if msg.strip() == "": + continue + + if msg.lower() == "exit": + encrypted_exit = CIPHER.encrypt("exit".encode()) + client.sendall(encrypted_exit) + client.close() + print("Bye 👋") + sys.exit(0) + + # Enkripsi pesan sebelum dikirim + encrypted_msg = CIPHER.encrypt(msg.encode()) + client.sendall(encrypted_msg) + + except KeyboardInterrupt: + print("\n[!] Keluar dengan Ctrl+C") + client.close() + sys.exit(0) + except Exception as e: + print(f"[!] Error: {e}") + client.close() + break + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--host", type=str, required=True, help="Alamat IP server") + parser.add_argument("--port", type=int, required=True, help="Port server") + args = parser.parse_args() + + start_client(args.host, args.port) diff --git a/server.py b/server.py deleted file mode 100644 index ad75732..0000000 --- a/server.py +++ /dev/null @@ -1,90 +0,0 @@ -import socket -import threading -import sys -import os - -HOST = "0.0.0.0" -PORT = 12345 - -clients = [] - -# handle client -def handle_client(conn, addr): - print(f"[+] Connected with {addr}") - while True: - try: - msg = conn.recv(1024).decode() - if not msg: - break - - if msg.lower().strip() == "exit": - print(f"[-] {addr} keluar dari chat") - break - - print(f"{addr}: {msg}") - - # broadcast ke semua client lain - for client in clients: - if client != conn: - try: - client.sendall(f"{addr}: {msg}".encode()) - except: - pass - except: - break - - conn.close() - if conn in clients: - clients.remove(conn) - print(f"[-] Disconnected {addr}") - - -# console input thread buat exit server -def server_console(): - if sys.stdin.isatty(): # hanya aktif kalau ada terminal - while True: - cmd = input("> ") - if cmd.lower() == "exit": - print("[!] Server keluar...") - # close semua client - for c in clients: - try: - c.sendall("[Server ditutup]".encode()) - c.close() - except: - pass - os._exit(0) - else: - print("[*] No console input available (running in background)") - - -def start_server(): - server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - server.bind((HOST, PORT)) - server.listen() - print(f"[*] Server running on {HOST}:{PORT}") - - # start console thread - threading.Thread(target=server_console, daemon=True).start() - - while True: - try: - conn, addr = server.accept() - clients.append(conn) - thread = threading.Thread(target=handle_client, args=(conn, addr)) - thread.start() - except KeyboardInterrupt: - print("\n[!] Server dimatikan manual via Ctrl+C") - for c in clients: - try: - c.sendall("[Server dimatikan]".encode()) - c.close() - except: - pass - server.close() - sys.exit(0) - - -if __name__ == "__main__": - start_server() diff --git a/server_encrypted.py b/server_encrypted.py new file mode 100644 index 0000000..5e4b038 --- /dev/null +++ b/server_encrypted.py @@ -0,0 +1,126 @@ +# server.py +# Chat Server terenkripsi dua arah menggunakan Fernet (AES-GCM) +# Jalankan: python server.py +# Pastikan: pip install cryptography + +import socket +import threading +import sys +import os +from cryptography.fernet import Fernet + +HOST = "0.0.0.0" +PORT = 12345 +KEY_FILE = "secret.key" + +clients = [] + + +# ----------------------------- +# Fungsi untuk memuat atau membuat key +# ----------------------------- +def load_or_create_key(path=KEY_FILE): + if os.path.exists(path): + with open(path, "rb") as f: + key = f.read() + print(f"[*] Loaded existing key from {path}") + else: + key = Fernet.generate_key() + with open(path, "wb") as f: + f.write(key) + print(f"[*] Generated new key and saved to {path}") + return key + + +KEY = load_or_create_key() +CIPHER = Fernet(KEY) + + +# ----------------------------- +# Fungsi untuk menangani client +# ----------------------------- +def handle_client(conn, addr): + print(f"[+] Connected with {addr}") + clients.append(conn) + + while True: + try: + data = conn.recv(4096) + if not data: + break + + # Dekripsi pesan dari client + try: + msg = CIPHER.decrypt(data).decode() + except Exception: + msg = data.decode(errors="ignore") + + if msg.lower().strip() == "exit": + print(f"[-] {addr} keluar dari chat") + break + + print(f"{addr}: {msg}") + + # Enkripsi ulang pesan untuk dikirim ke client lain + broadcast_text = f"{addr}: {msg}" + encrypted_broadcast = CIPHER.encrypt(broadcast_text.encode()) + + for client in clients: + if client != conn: + try: + client.sendall(encrypted_broadcast) + except: + pass + + except Exception: + break + + conn.close() + if conn in clients: + clients.remove(conn) + print(f"[-] Disconnected {addr}") + + +# ----------------------------- +# Fungsi untuk console server +# ----------------------------- +def server_console(): + if sys.stdin.isatty(): + while True: + cmd = input("> ") + if cmd.lower() == "exit": + print("[!] Server dimatikan...") + for c in list(clients): + try: + c.sendall(CIPHER.encrypt("[Server dimatikan]".encode())) + c.close() + except: + pass + os._exit(0) + + +# ----------------------------- +# Fungsi utama server +# ----------------------------- +def start_server(): + server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + server.bind((HOST, PORT)) + server.listen() + print(f"[*] Server running on {HOST}:{PORT}") + print(f"[*] Key file: {KEY_FILE}") + + threading.Thread(target=server_console, daemon=True).start() + + try: + while True: + conn, addr = server.accept() + threading.Thread(target=handle_client, args=(conn, addr), daemon=True).start() + except KeyboardInterrupt: + print("\n[!] Server dihentikan manual.") + server.close() + sys.exit(0) + + +if __name__ == "__main__": + start_server()