7.7 KiB
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
# 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:
# přes flag
go run . -regen
# nebo přes env proměnnou
REGEN_KEYS=1 go run .
Jak to používat (UI)
-
Otevři
http://localhost:8080/. -
V sekci Můj veřejný klíč stáhni/kopíruj
public.pemneboidentity.crta pošli je kontaktům. -
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:
{
"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:
- Identita – zobrazení / kopírování
public.pemaidentity.crt. - Šifrování – vlož cizí veřejný klíč/cert, napiš zprávu, klikni Encrypt.
- 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:
go run . gui
HTTP server zůstává:
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
-
Máš dva klíče:
- soukromý klíč (jen pro tebe, musíš ho schovat)
- veřejný klíč (můžeš poslat komukoli)
-
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
-
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:
- RSA je jako trezor s klíčem – jen ty máš správný klíč (soukromý).
- 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.