To wyzwanie wiąże się z nagrodą w wysokości 200 punktów za pierwszą odpowiedź i pozostaje niepokonane przez co najmniej 3 dni.Zgłoszony przez użytkownika3080953 .
Ostatnio dużo się mówi o szyfrowaniu typu end-to-end i presji na firmy, by usunęły go z ich produktów. Nie interesuje mnie to, co jest dobre i złe, ale zastanawiałem się: jak krótki może być kod, który zmusiłby firmę do wywierania presji na nieużywanie go?
Wyzwanie polega na wdrożeniu wymiany kluczy Diffie Hellman między dwoma systemami sieciowymi, a następnie umożliwieniu użytkownikom komunikacji w obie strony za pomocą wygenerowanego klucza symetrycznego. Na potrzeby tego zadania nie są wymagane żadne inne zabezpieczenia (np. Nie trzeba cyklicznie zmieniać klucza, weryfikować tożsamości, chronić przed DoS itp.) I można założyć otwarty internet (wszystkie porty, na których nasłuchuje się, są dostępne dla wszystkich). Korzystanie z wbudowanych jest dozwolone i zalecane!
Możesz wybrać jeden z dwóch modeli:
- Serwer i klient: klient łączy się z serwerem, a następnie serwer lub klient może wysyłać wiadomości do drugiego. Zewnętrzne strony między nimi muszą nie być w stanie odczytać wiadomości. Przykładowy przepływ może być:
- Użytkownik A uruchamia serwer
- Użytkownik B uruchamia klienta i kieruje go do serwera użytkownika A (np. Przez IP / port), program otwiera połączenie
- Program użytkownika A potwierdza połączenie (opcjonalnie najpierw pytając użytkownika o zgodę)
- Program użytkownika B rozpoczyna generowanie sekretu DH i wysyła wymagane dane (klucz publiczny, liczba pierwsza, generator, wszystko inne, czego potrzebuje Twoja implementacja) do użytkownika A
- Program użytkownika A wykorzystuje przesłane dane do ukończenia generowania wspólnego klucza tajnego i odsyła wymagane dane (klucz publiczny) do użytkownika B. Od tego momentu użytkownik A może wprowadzać wiadomości (np. Przez stdin), które będą szyfrowane i wysyłane do użytkownika B (np. Na standardowe wyjście).
- Program użytkownika B kończy generowanie wspólnego klucza tajnego. Od tego momentu użytkownik B może wysyłać wiadomości do użytkownika A.
- Lub: Serwer z dwoma podłączonymi klientami: każdy klient rozmawia z serwerem, który przekazuje swoją wiadomość do drugiego klienta. Sam serwer (i wszelkie strony trzecie pomiędzy nimi) nie mogą odczytać wiadomości. Poza początkowym połączeniem proces jest taki sam, jak opisany w pierwszej opcji.
Szczegółowe zasady:
- Możesz podać jeden program lub wiele programów (np. Serwer i klient). Twój wynik to całkowity rozmiar kodu we wszystkich programach.
- Twój program musi teoretycznie być w stanie komunikować się przez sieć (ale do testowania localhost jest w porządku). Jeśli twój wybrany język nie obsługuje sieci, możesz połączyć go z czymś, co działa (np. Skrypt powłoki); w tym przypadku twój wynik to całkowity rozmiar kodu we wszystkich używanych językach.
- Generowanie kluczy Diffie Hellman może wykorzystywać zapisane na stałe wartości „p” i „g”.
- Wygenerowany klucz współdzielony musi mieć co najmniej 1024 bity.
- Po udostępnieniu klucza wybór szyfrowania symetrycznego zależy od Ciebie, ale nie możesz wybrać metody, która jest obecnie znana z praktycznego ataku na nią (np. Zmiana Cezara jest trywialna, aby cofnąć bez znajomości klucza ). Przykładowe dozwolone algorytmy:
- AES (dowolny rozmiar klucza)
- RC4 (teoretycznie uszkodzony, ale nie ma żadnych praktycznych ataków, o których mogę wspomnieć, więc jest to dopuszczalne tutaj)
- Użytkownicy A i B muszą mieć możliwość wzajemnego wysyłania komunikatów (dwukierunkowa komunikacja) (np. Czytanie linii ze standardowego wejścia, ciągłe monitowanie lub zdarzenia, takie jak naciśnięcie przycisku). Jeśli to ułatwi, możesz podjąć na przemian konwersację (tj. Po wysłaniu wiadomości przez użytkownika, musi on poczekać na odpowiedź przed wysłaniem następnej wiadomości)
- Wbudowane języki są dozwolone (nie trzeba pisać własnych metod kryptograficznych lub sieciowych, jeśli są już obsługiwane).
- Podstawowy format komunikacji zależy od Ciebie.
- Podane powyżej kroki komunikacji są przykładem, ale nie musisz ich przestrzegać (o ile niezbędne informacje są udostępniane i żaden środkowy człowiek nie jest w stanie obliczyć wspólnego klucza lub wiadomości)
- Jeśli szczegóły potrzebne do połączenia z serwerem nie są znane z góry (np. Jeśli nasłuchuje na losowym porcie), dane te muszą zostać wydrukowane. Możesz założyć, że adres IP urządzenia jest znany.
- Obsługa błędów (np. Nieprawidłowe adresy, utracone połączenia itp.) Nie jest wymagana.
- Wyzwaniem jest kod golfowy, więc wygrywa najkrótszy kod w bajtach.
p
ig
dozwolone?