# fckeuspy-go ## Co to je Mini Go/HTMX aplikace pro šifrování zpráv cizím veřejným klíčem. * Při startu vygeneruje nebo načte RSA identitu (2048 bitů). * Umožní sdílet veřejný klíč (`public.pem`) a self-signed cert (`identity.crt`). * Šifruje hybridně: **RSA-OAEP (SHA-256) + AES-256-GCM**. * Rozhraní přes **HTMX**, moderní responzivní layout (2 sloupce na desktopu, 1 sloupec na mobilu). * Všude jsou tlačítka **Copy** a **Clear** pro snadnou práci s texty. --- ## Požadavky * Go 1.21+ * Není potřeba databáze ani další služby --- ## Rychlý start ```bash # spustí server go run . # otevři v prohlížeči http://localhost:8080/ ```text Na prvním startu se vytvoří: ``` identity_key.pem # RSA private key (PKCS#1) public.pem # veřejný klíč PEM (PKIX) identity.crt # self-signed cert (vizitka pro sdílení) ``` ```text identity_key.pem # RSA private key (PKCS#1) public.pem # veřejný klíč PEM (PKIX) identity.crt # self-signed cert (vizitka pro sdílení) ``` --- ## Regenerace klíčů Pokud chceš vygenerovat novou identitu: ```bash # přes flag go run . -regen # nebo přes env proměnnou REGEN_KEYS=1 go run . ``` --- ## Jak to používat (UI) 1. Otevři `http://localhost:8080/`. 2. V sekci **Můj veřejný klíč** stáhni/kopíruj `public.pem` nebo `identity.crt` a pošli je kontaktům. 3. V sekci **Šifrovat pro cizí klíč**: * napiš zprávu, * vlož **cizí** public key nebo cert (PEM blok), * klikni **Encrypt**. * Výsledek (**Zašifrovaný payload**) se zobrazí hned pod formulářem jako JSON: ```json { "ek": "base64(RSA-OAEP(aesKey))", "n": "base64(nonce)", ```text "ct": "base64(aes-gcm-ciphertext)" } ``` * tlačítkem **Copy** zkopíruješ, **Clear** vymaže obsah. ```text 4. Příjemce vloží payload do sekce **Dešifrovat** a klikne **Decrypt** → objeví se plaintext. --- ## HTTP endpointy * `GET /` – hlavní UI (HTMX) * `GET /public.pem` – veřejný klíč PEM * `GET /public.crt` – self-signed cert PEM * `POST /encrypt` – form fields: * `message` – plaintext * `pubkey` – cílový veřejný klíč (PEM `PUBLIC KEY` nebo `CERTIFICATE`) * `POST /decrypt` – form field: * `payload` – JSON se strukturou `{"ek","n","ct"}` * `GET /static/style.css` – CSS --- ## Struktura projektu ```text . ├─ main.go ├─ templates/ │ ├─ index.html # UI s Copy/Clear tlačítky │ ├─ encrypt.html # výstup šifrování │ └─ decrypt.html # výstup dešifrování └─ static/ └─ style.css # responzivní layout (1 sloupec mobile, 2 desktop) ``` --- ## Bezpečnostní poznámky * Soukromý klíč se ukládá lokálně (`identity_key.pem`, chmod 600). * Certifikát je jen vizitka (není pro TLS). * Použitý algoritmus: RSA-OAEP se SHA-256 + AES-GCM. * Pro produkci bys měl řešit: správu identit, heslem chráněný export, rotaci klíčů. --- ## Tipy * „Copy“ používá **Clipboard API** (funguje na `localhost`). * „Clear“ vyprázdní textareu. * Layout: mobil → 1 sloupec, desktop → 2 sloupce. --- ## Fyne GUI režim Projekt teď obsahuje i desktop GUI (Fyne v2) se třemi záložkami: 1. Identita – zobrazení / kopírování `public.pem` a `identity.crt`. 2. Šifrování – vlož cizí veřejný klíč/cert, napiš zprávu, klikni Encrypt. 3. Dešifrování – vlož JSON payload, klikni Decrypt. Funkce navíc: * Tlačítko 🌗 Motiv – přepíná jednoduchý light/dark vzhled (uložen do preferencí). * Posledně vybraný tab, velikost okna i motiv se automaticky obnoví při dalším spuštění. * Výstupní pole jsou read-only, aby se předešlo nechtěné editaci. Spuštění GUI: ```bash go run . gui ``` HTTP server zůstává: ```bash go run . http ``` --- --- ## Jak to funguje podle chatGPT Ok, pojďme úplně jednoduše, krok za krokem – bez odborných keců 👇 --- ## Jak to celé funguje 1. **Máš dva klíče**: * **soukromý klíč** (jen pro tebe, musíš ho schovat) * **veřejný klíč** (můžeš poslat komukoli) 2. Když ti někdo chce poslat zprávu: * vezme tvůj veřejný klíč * vytvoří si jednorázový **tajný kód (klíč)** pro šifrování * ten kód uzamkne tvým veřejným klíčem (aby ho uměl odemknout jen tvůj soukromý klíč) * zprávu zašifruje tím jednorázovým kódem 3. Ty zprávu dostaneš: * odemkneš si tím svým **soukromým klíčem** ten jednorázový kód * a tím kódem si dešifruješ samotnou zprávu 💡 Proč to takhle? Protože šifrovat velké zprávy přímo RSA by bylo pomalé a nepraktické. Proto se vždycky kombinuje: * RSA jen na uzamčení malého tajného klíče, * rychlý algoritmus (AES) na šifrování celé zprávy. --- ### Jak silné to je (2025) * **RSA 2048 bitů** * to je ta „velká matematika“ (pracuje s obrovskými prvočísly) * dnes to *nikdo na světě neumí rozlousknout* běžnými prostředky * odhady: kdybys měl všechny počítače světa, tak bys to lámal tisíce let * pro běžnou komunikaci je to **naprosto bezpečné** * **AES 256 bitů** * to je ten rychlý algoritmus na zprávy * 256 bitů = tak obrovské množství možností, že brute force (zkoušet všechny klíče) je nereálný i s kvantovým počítačem, co si dnes umíme představit * používají to banky, armády i vlády --- ### Přirovnání * Tvůj systém = **dvě zámky**: 1. RSA je jako **trezor s klíčem** – jen ty máš správný klíč (soukromý). 2. AES je jako **řetěz a visací zámek na balíku zprávy** – kód k odemčení toho visacího zámku je schovaný v trezoru. * Útočník by musel buď: * **vykrást trezor RSA 2048** (prakticky nemožné), * nebo **prolomit AES 256** (prakticky nemožné). --- ### Shrnutí * To, co máš teď, je na úrovni **toho, co reálně používá PGP, banky a vlády**. * **Prolomení?**: * Dnes = nerealistické * Do cca 2030 = pořád v pohodě (RSA 2048) * Pokud chceš být „future-proof“ na desítky let, můžeš jít na **RSA 3072 nebo 4096** (je to jen pomalejší). --- ## Jak je to s certifikaty podle chatGPT ## `identity_key.pem` * **Soukromý klíč** (private key) * Tenhle soubor je jen pro tebe. * Obsahuje čísla, kterými dokážeš: * odemknout zprávy, co ti někdo zašifroval tvým veřejným klíčem * (a kdybys chtěl, tak i podepisovat zprávy, aby bylo vidět, že jsi je poslal ty) * **NESMÍŠ** to nikomu posílat. Když to někdo získá, může číst všechny tvoje zprávy. * Je to nejcennější část tvé identity. --- ## `public.pem` * **Veřejný klíč** (public key) * To je „vizitka“, kterou pošleš ostatním. * Pomocí něj ti ostatní **zašifrují zprávu**. * Bez tvého soukromého klíče ji nikdo jiný nerozluští. * Je to čistě klíč, bez dalších informací. --- ## `identity.crt` * **Certifikát** (self-signed = podepsaný sám sebou) * Je to vlastně balíček, který obsahuje: * tvůj veřejný klíč * plus pár informací „kdo jsi“ (u nás jen jednoduché jméno *Encryptor Local Identity*) * a podpis tím tvým soukromým klíčem → to ukazuje, že to opravdu patří k sobě * Prakticky slouží taky jen ke sdílení tvého veřejného klíče, ale v „certifikátové podobě“. * Výhoda: některé aplikace umí pracovat s certifikáty rovnou, aniž by řešily syrový public key. --- ## Shrnutí v řeči pro normální lidi * `identity_key.pem` → **tajný klíč** = schovej do trezoru, nikomu nedávej. * `public.pem` → **veřejný klíč** = pošli komukoli, aby ti mohl šifrovat zprávy. * `identity.crt` → **certifikát** = taky můžeš poslat lidem, je to jen jiná „obalená“ forma veřejného klíče. ---