## 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/ ``` 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í) ``` --- ## 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)", "ct": "base64(aes-gcm-ciphertext)" } ``` * tlačítkem **Copy** zkopíruješ, **Clear** vymaže obsah. 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 ``` . ├─ 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. --- # 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ší). ---