fckeuspy-go/README.md
2025-09-08 22:22:03 +02:00

248 lines
6.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 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ší).
---
# 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.
---