# <center>Programowanie sieciowe - projekt</center>
## <center>Temat: Implementacja bezpiecznej aplikacji typu czat</center>
### <center>Jakub Liana, Mikołaj Kraczek, Michał Zięba</center>
### Czat dwuosobowy
**IK_public** - Identity Key, publiczny, generowany przez użytkownika i publikowany na serwerze
**IK_priv** - Identity Key, prywatny, generowany przez użytkownika i nie udostępniadny nigdzie
**PK_public** - Publiczny Pre-Key: raz na konkretny interwał czasowy klucz wygenerowany lokalnie u użytkownika i publikowany na serwerze
**PK_priv** - Prywatny Pre-Key raz na konkretny interwał czasowy klucz wygenerowany lokalnie u użytkownika i nie udostępniany nigdzie
**SPK** - Signed Pre-Key podpisany PK_public przy użyciu IK_priv i publikowany na serwerze
Sekwencja utworzenia klucza sesji (*A - użytkownik inicjaluzujący połączenie, B - użytkownik do, którego A chce wysłać wiadomość*):
1. Użytkownik A pobiera z sererwa *pakiet* użytkownika B (IK_public, PK_public, SPK)
2. Weryfikuje czy PK faktycznie pochodzi od użytkowanika B
3. Tworzy parę publiczny i prywatny EK (Ephemeral Key)
4. Użytkownik A oblicza 3 operacje Diffie-Hellman:
- `DH1 = DH(IK_A_priv, SPK_B_public)`
- `DH2 = DH(EK_priv, IK_B_public)`
- `DH3 = DH(EK_priv, SPK_B_public)`
5. Użytkownik A generuje SK (session key): `SK = KDF(DH1 || DH2 || DH3)`
6. Użytkownik A wysyła do B EK_public oraz wiadomość inicjalizacyjną zaszyfrowaną SK
7. Użytkownik B również oblicza te same 3 operacje Diffie-Hellman:
- `DH1 = DH(IK_A_public, SPK_B_priv)`
- `DH2 = DH(EK_public, IK_B_priv)`
- `DH3 = DH(EK_public, SPK_B_priv)`
8. Użytkownik B generuje SK `SK = KDF(DH1 || DH2 || DH3)`
9. Wszyscy są happy, mają ten sam klucz
### Czat grupowy
#TODO
### Bazy danych
Szyfrujemy całą bazę danych a nie pojedyncze pola. Pomysły na to są 2:
- Szyfrowanie dynamiczne: przy zakończeniu sesji szyfrujemy aktualnym SK (albo ewentualnie jakimś jego hashem) i zapisujemy sobie ten klucz. Przy rozpoczęciu nowej sesji odszyfrowujemy bazę stałym kluczem i po zakończeniu z powrotem szyfrujemy aktualnym kluczem, stary usuwamy i zapisujemy ten.
- Albo używając klucza **IK_priv**, który i tak nie opuszcza aplikacji, więc możemy go użyć do innych celów przy okazji. Jest to rozwiązanie łatwiejsze w implementacji
### konczenie dzialania klienta
musimy przechwytywac wszystkie sygnaly konczace program, aby poprawnie zamknac polaczenie i co najwazniejsze zaszyfrowac baze danych etc