peer-to-peer encrypted chat that runs in your terminal. you host, you control. close the window โ everything's gone.
every "secure" messenger still stores metadata somewhere. this doesn't. it's just two terminals talking over an encrypted tunnel. nothing written to disk, ever.
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ SRP AUTHENTICATION โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ CLIENT SERVER โ
โ โ โ โ
โ โโโโโโโโโโโโโโโ TCP CONNECT โโโโโโโโโโโโโโโโโโโบโ โ
โ โ โ โ
โ โโโโ {"cmd":"srp_init","username","A"} โโโโโโโบ โ โ
โ โ (A = client public ephemeral) โ โ
โ โ โ โ
โ โโโโโโ {"user_id","B","salt","room_salt"} โโโโ โ โ
โ โ (B = server public ephemeral) โ โ
โ โ โ โ
โ โ [client derives room_key via HKDF: โ โ
โ โ room_key = HKDF(password, room_salt)] โ โ
โ โ โ โ
โ โโโโ {"cmd":"srp_verify","user_id","M"} โโโโโโบ โ โ
โ โ (M = client proof) โ โ
โ โ โ โ
โ โโโโโโโโโโ {"H_AMK","session_key"} โโโโโโโโโโโ โ โ
โ โ (H_AMK = server proof) โ โ
โ โ โ โ
โ โ [password never transmitted] โ โ
โ โ [MITM can't derive session key] โ โ
โ โ โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ E2E ENCRYPTED CHAT (same socket) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ โ โ
โ โโโโโโโโโ {"type":"init","messages","users"} โ โ โ
โ โ โ โ
โ โโโดโโ โโโโดโโโ โ
โ โ C โโ {"type":"message","text":encrypted} โโบโ S โ โ
โ โ L โ โ E โ โ
โ โ I โโโโ {"type":"message","data":{...}} โโโโโ R โ โ
โ โ E โ โ V โ โ
โ โ N โโโโ {"type":"user_joined",...} โโโโโโโโโโ E โ โ
โ โ T โ โ R โ โ
โ โ โโโโ {"type":"user_left",...} โโโโโโโโโโโโ โ โ
โ โโโฌโโ โโโโฌโโโ โ
โ โ โ โ
โ โ [server stores ONLY ciphertext] โ โ
โ โ [server CANNOT read messages] โ โ
โ โ [all clients with same password โ โ
โ โ derive identical room_key] โ โ
โ โ โ โ
โ โ Encryption: Fernet (AES-128-CBC + HMAC) โ โ
โ โ Key derivation: HKDF-SHA256 โ โ
โ โ Protocol: newline-delimited JSON over TCP โ โ
โ โ โ โ
โ โ [on disconnect: keys wiped from RAM] โ โ
โ โ โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ KEY HIERARCHY โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ password โโโฌโโโบ SRP โโโบ session_key (per-user, auth only) โ
โ โ โ
โ โโโโบ HKDF(password, room_salt) โโโบ room_key (shared) โ
โ โ
โ room_salt: generated once at server start โ
โ room_key: deterministic, same for all clients with same pwd โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
SRP (Secure Remote Password) โ password is never sent over the network. both sides prove they know it via zero-knowledge proof, then derive identical session keys.
git clone https://github.com/emilycodestar/cmd-chat.git
cd cmd-chat
python -m venv venv && source venv/bin/activate && pip install -r requirements.txtwindows:
python -m venv venv ; .\venv\Scripts\activate ; pip install -r requirements.txtstart server:
python cmd_chat.py serve 0.0.0.0 3000 --password mysecretconnect:
python cmd_chat.py connect SERVER_IP 3000 username mysecret- ram only โ nothing touches disk
- pure sockets โ no http, no websocket, just raw tcp
- srp auth โ password never sent over network
- e2e encryption โ Fernet (AES-128-CBC + HMAC)
- zero dependencies on web frameworks โ only asyncio
MIT
