Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 0 additions & 40 deletions client.py

This file was deleted.

95 changes: 95 additions & 0 deletions client_encrypted.py
Original file line number Diff line number Diff line change
@@ -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)
90 changes: 0 additions & 90 deletions server.py

This file was deleted.

126 changes: 126 additions & 0 deletions server_encrypted.py
Original file line number Diff line number Diff line change
@@ -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()