fckeuspy-go/README.md
2025-09-15 22:42:22 +02:00

7.7 KiB
Raw Blame History

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)

  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:
   {
     "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:

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

  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.pemtajný klíč = schovej do trezoru, nikomu nedávej.
  • public.pemveřejný klíč = pošli komukoli, aby ti mohl šifrovat zprávy.
  • identity.crtcertifikát = taky můžeš poslat lidem, je to jen jiná „obalená“ forma veřejného klíče.