124 lines
2.9 KiB
Markdown
124 lines
2.9 KiB
Markdown
## Šifrovací appka
|
||
|
||
Mini Go/HTMX app na šifrování zpráv cizím veřejným klíčem.
|
||
|
||
* Při startu vygeneruje/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**.
|
||
* UI je čisté přes **HTMX**, tlačítka „Copy“ všude, kde to dává smysl.
|
||
|
||
---
|
||
|
||
## Požadavky
|
||
|
||
* Go 1.21+
|
||
* (volitelné) Make, Docker, atd. – není potřeba pro základní běh
|
||
|
||
---
|
||
|
||
## Rychlý start
|
||
|
||
```bash
|
||
# stačí spustit
|
||
go run .
|
||
|
||
# otevři v prohlížeči
|
||
http://localhost:8080/
|
||
```
|
||
|
||
Na prvním startu se vytvoří soubory:
|
||
|
||
```
|
||
identity_key.pem # RSA private key (PKCS#1)
|
||
public.pem # veřejný klíč PEM (PKIX)
|
||
identity.crt # self-signed cert s veřejným klíčem (jen „vizitka“)
|
||
```
|
||
|
||
---
|
||
|
||
## Regenerace klíčů
|
||
|
||
Chceš 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 kontaktům.
|
||
3. V sekci **Šifrovat pro cizí klíč** vlož svou zprávu a **cizí** public key/cert → klikni **Encrypt**.
|
||
|
||
* Výstup (**Zašifrovaný payload**) se ukáže **hned pod formulářem** a má tvar JSON:
|
||
|
||
```json
|
||
{
|
||
"ek": "base64(RSA-OAEP(aesKey))",
|
||
"n": "base64(nonce)",
|
||
"ct": "base64(aes-gcm-ciphertext)"
|
||
}
|
||
```
|
||
4. Příjemce vloží payload do sekce **Dešifrovat** → dostane plaintext.
|
||
5. Všude můžeš použít tlačítko **Copy**.
|
||
|
||
---
|
||
|
||
## HTTP endpointy
|
||
|
||
* `GET /` – HTMX UI
|
||
* `GET /public.pem` – veřejný klíč (PEM)
|
||
* `GET /public.crt` – self-signed cert (PEM)
|
||
* `POST /encrypt` – form fields:
|
||
|
||
* `message` – plaintext k zašifrování
|
||
* `pubkey` – cílový klíč (PEM `PUBLIC KEY` **nebo** `CERTIFICATE`)
|
||
* `POST /decrypt` – form field:
|
||
|
||
* `payload` – JSON s poli `ek`, `n`, `ct` (viz výše)
|
||
* `GET /static/style.css` – styl
|
||
|
||
---
|
||
|
||
## Struktura
|
||
|
||
```
|
||
.
|
||
├─ main.go
|
||
├─ templates/
|
||
│ ├─ index.html
|
||
│ ├─ encrypt.html
|
||
│ └─ decrypt.html
|
||
└─ static/
|
||
└─ style.css
|
||
```
|
||
|
||
---
|
||
|
||
## Bezpečnostní poznámky
|
||
|
||
* Klíče se ukládají **lokálně** vedle binárky. Chraň `identity_key.pem` (chmod 600 je nastaven).
|
||
* Certifikát je jen pro sdílení veřejného klíče (nepoužívá se pro TLS).
|
||
* RSA-OAEP se SHA-256 + AES-GCM (12B nonce) pro zprávy libovolné délky.
|
||
* Pro produkci řeš správu identit (HSM, password-protected export, rotace, audit).
|
||
|
||
---
|
||
|
||
## Problémy & tipy
|
||
|
||
* „Neplatný public key/cert“ – zkontroluj, že vkládáš **PEM blok** (`-----BEGIN ...`).
|
||
* Payload musí být validní JSON, base64 hodnoty bez zalomení.
|
||
* Pokud migruješ mezi stroji, přenes `identity_key.pem` + `public.pem` + `identity.crt`.
|
||
|
||
---
|
||
|
||
## Licence
|
||
|
||
MIT (nebo si dopiš dle potřeby).
|