Obecna wersja beta 0.4.13 nie posiada podpisywania wiadomości i ma inny (prostszy) sposób wymiany kluczy publicznych. Wersja ostateczna będzie spełniać wszystkie założenia. 1. ZAŁOŻENIA : A) Pakiet jest niewykrywalny dla prostego filtra wiadomości (jak wiadomo sms-express tępi, jeśli może, wszelkie ulepszenia programu) Każdy pakiet jest zupełnie inny i zakodowany w base64 (opcjonalnie z losowymi spacjami by przypominało zwykły tekst) Z tego powodu nie ma również automatycznych odpowiedzi na wysłanie klucza publicznego. B) Do szyfrowania używane są algorytmy które dają nadzieje że wiadomość nie będzie dała się odszyfrować w sensowym czasie nawet dla osób/instytucji dysponujących bardzo dużą mocą obliczeniową C) Całość operacji ma przebiegać możliwie szybko na słabych komputerach, deszyfrowanie kluczem prywatnym RSA jest ograniczone do minimum D) Algorytm działania nie wymaga tworzenia sesji i pozwala wysyłać wiadomości w trybie offline E) Użytkownik jest pozbawiony obowiązku wymyślania haseł i przez to osłabienia bezpieczeństwa klucza. F) Kryptografia kluczem publicznym jest używana do szyfrowania klucza symetrycznego co czyni rozmowę odporną na podsłuchiwanie w każdym jej momencie. G) NIE jest sprawdzana integralność wiadomości, w częsci szyfrowanej kluczem symetrycznym. Co pozwoli odkodować niekompeltne wiadomości, ale nie pozwoli na żadne manipulacje treścią. H) Klucz symetryczny jest opcjonalinie cyfrowo podpisywany aby zapobiec aktywnym atakom mitm jak np. http://www.thoughtcrime.org/ie.html Podpisywanie oczywiście ma jedynie sens gdy jesteśmy pewni autentyczności klucza publicznego. I) Do sprawdzenie autentyczności klucza publicznego RSA służy jego fingerprint MD5 możliwy do wyświetlenia w każdej chwili. J) Engine szyfrujący jest przenośny między platformami sprzętowymi i systemowymi (ANSI C) i używa przenośnej biblioteki Openssl. To pozwola na wykorzystnie go w dowolnym kliencie Gadu-Gadu. 2. BUDOWA POJEDYNCZEJ WIADOMOŚCI Każda zaszyfrowana wiadomość ma następującą konstrukcje: typedef struct SIM_Message_t { //--- dane zaszyfrowane kluczem publicznym (RSA 1024 bit ) w trybie OAEP) unsigned char *key; // kluczem symetryczny do reszty pakietu // len = SIM_RSA_KEYSIZE (1024) uint8 flags // flaga, czy klucz jest podpisany (dopiero w planie) unsigned char *signature // cyfrowy podpis DSA klucza symterycznego (dopiero w planie) //--- koniec danych szyrfowanych kluczem publiczny //--- dane zaszyfrowane kluczem symetrycznym *key (Blowfish 128bit w trybie CBC) unsigned char *init; // losowy blok bajtów pełniący rolę IV w trybie CBC // długość dla Blowfisha to 8 bajtów uint16 magicnumber; // ustalona z góry wartość [szczegóły w opisie] uint32 timestamp; // czas wysłania, pozwoli uniknąc powielania pakietów (w planie) char *message; // sama wiadomość //--- koniec danych szyfrowanych kluczem symetrycznym } SIM_Message; 3. WYMIANA KLUCZY PUBLICZNYCH RSA Wysłanie klucza odbywa się na żądanie poprzez wydanie odpowieniej komendy (np. z menu) Format w jakim zostaje wysłany klucz nie powinien zawierać zanych stałych fragmentów tekstu (pkt A) założeń) 4. SZYFROWANIE Aby wysłać pierwszą wiadomość w rozmowie nadawca generuje losowy klucz symetryczny i szyfruje nim treść wiadomości z doklejajonym na początku blokiem init i magicnumber. Opcjonalnie dokleja też cyfrowy podpis. Następnie szyfruje przy użyciu klucza publicznego adresata ten klucz symetryczny i wstawia go na początek pakietu. Przy wysyłaniu kolejnych wiadomości używany jest ten sam klucz symetryczny, mimo to za każdym razem, jego postać zaszyfrowana kluczem publicznym jest wstawiana na początku pakietu. Powodem takiego działania jest trudność zdefiniowania sesji w gadu-gadu a także możliwość zawieszenia się programu po jednej ze stron. Dodatkowo, mimo że klucz symetryczny w rozmowie jest stały to jego postać zaszyfrowana jest za każdym razem inna (RSA w trybie OAEP z pkcs#1) 5. DESZYFROWANIE Odbiorca chcąc odszyfrować pierwszą wiadomość w rozmowie używa swojego klucza prywatnego do odszyfrowania klucza symetrycznego (opcjonalinie sprawdzając jego podpis) a następnie nim deszyfruje resztę pakietu. Porównuje z góry zdefiniowany stały magicnumber, jeśli się nie zgadza uznaje że wiadomość nie była szyfrowana i zwraca na ekran w niezmienionej postaci. Następne wiadomości w rozmowie (wtedy gdy posiada zachace'owany klucz symetryczny) próbuje deszyfrować od razu od drugiej części pakietu, jeśli magicnumber się nie zgadza to postępuje tak jak przy pierwszej wiadomości. 7. UWAGI Ten sposób działania ogranicza operacje deszyfrowania RSA do minimum, i nie wymaga tworzenia sesji :) bo każdy szyfrowany pakiet ma taką samą konstrukcje. Mimo to w rozmowie czasochłonne deszyfrowanie RSA będzie wykonane tylko raz, na początku. Mówiąc w skrócie klucz symteryczny jest cache'owany w trakcie trwania rozmowy.