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?Odpowiedzi:
Node.js (
372423 + 94 = 517513 bajtów)Grał w golfa
Dodano podział linii dla „czytelności”.
chat.js (
423419 bajtów)Brak podziałów linii
Podziały wierszy
echo_server.js (94 bajty)
Nie golfił
Węzeł ma wbudowane funkcje sieciowe i kryptograficzne. Używa TCP do sieci (ponieważ jest prostszy niż interfejs Node dla HTTP i ładnie gra ze strumieniami).
Używam szyfru strumieniowego (RC4) zamiast AES, aby uniknąć konieczności radzenia sobie z rozmiarami bloków. Wikipedia wydaje się sądzić, że może być podatna na ataki, więc jeśli ktoś ma wgląd w preferowane szyfry, byłoby świetnie.
Uruchom serwer echa,
node echo_server.js
który nasłuchuje na porcie 9. Uruchom dwie instancje tego programu za pomocąnode chat.js <server IP>
inode chat.js <server IP> 1
(ostatni argument po prostu ustawia, który z nich wysyła pierwszą). Każda instancja łączy się z serwerem echa. Pierwsza wiadomość obsługuje generowanie klucza, a kolejne wiadomości korzystają z szyfru strumieniowego.Serwer echa po prostu wysyła wszystko z powrotem do wszystkich podłączonych klientów oprócz oryginalnego.
Klient
Serwer Echo
Dzięki Dave za wszystkie wskazówki + opinie!
źródło
Node.js,
638607 bajtówTeraz, gdy został dobrze pokonany (w tym samym języku), oto moja testowa odpowiedź:
Lub z opakowaniem:
Stosowanie
Jest to implementacja serwer / klient; jedna instancja będzie serwerem, a druga klientem. Serwer jest uruchamiany z określonym portem, a następnie klient jest wskazywany na port serwera. Konfiguracja może potrwać kilka sekund, jeśli w urządzeniu brakuje entropii, więc pierwsze wiadomości mogą być nieco opóźnione.
Awaria
Jedynym wymaganiem dla tokenów jest to, aby zawierały one co najmniej jeden znak niebędący heksadecymem, dlatego w skróconym kodzie używane są inne stałe ciągów (
data
ihex
).źródło