Wyzwanie
Przedstawiam wam kolejne wyzwanie szpiegowskie kontra szpiegowskie rzucające obfuscators kontra krakersy. W tym przypadku dane, które mają być chronione, nie są danymi wejściowymi, lecz wyjściowymi .
Zasady wyzwania są proste. Napisz procedurę z następującymi specyfikacjami:
- Procedura może być napisana w dowolnym języku, ale nie może przekraczać 320 bajtów.
- Procedura musi zaakceptować trzy 32-bitowe liczby całkowite ze znakiem jako dane wejściowe. Może mieć postać funkcji, która akceptuje 3 argumenty, funkcji, która akceptuje pojedynczą tablicę 3-elementową lub kompletnego programu, który odczytuje 3 liczby całkowite z dowolnego standardowego wejścia.
- Procedura musi wyprowadzać jedną 32-bitową liczbę całkowitą ze znakiem.
- We wszystkich możliwych wejściach procedura musi generować od 2 do 1000 (włącznie) unikalnych wartości. Liczba unikalnych wartości, które może wygenerować procedura, nazywana jest jej kluczem .
Na przykład program C.
int foo( int i1, int i2, int i3 ) {
return 20 + (i1^i2^i3) %5;
}
ma klucz 9, ponieważ (miejmy nadzieję) może tylko wyjście wartości dziewięć 16
, 17
, 18
, 19
, 20
, 21
, 22
, 23
, i24
.
Niektóre dodatkowe ograniczenia są następujące:
- Procedura musi być w pełni deterministyczna i niezmienna w czasie, zwracając identyczne wyniki dla identycznych danych wejściowych. Procedura nie powinna wywoływać generatorów liczb pseudolosowych.
- Procedura może nie polegać na „ukrytych zmiennych”, takich jak dane w plikach, zmienne systemowe lub funkcje języka ezoterycznego. Na przykład procedury zwykle nie powinny odnosić się do stałych, chyba że stałe są jasno zdefiniowane w samym kodzie. Procedury oparte na dziwactwach kompilatora, wynikach matematycznie niezdefiniowanych operacji, błędach arytmetycznych itp. Są również mocno odradzane. W razie wątpliwości proszę pytać.
- Ty (koder) musisz dokładnie wiedzieć, ile unikalnych wyjść może wygenerować procedura i powinieneś być w stanie zapewnić przynajmniej jedną sekwencję wejściową, która wytwarza każde wyjście. (Ponieważ potencjalnie mogą istnieć setki unikatowych danych wyjściowych, ten zestaw będzie zawsze wymagany tylko w przypadku zakwestionowania klucza.)
Ponieważ problem ten jest znacznie mniej podobny do klasycznego szyfrowania niż poprzedni, spodziewam się, że będzie on dostępny dla szerszej publiczności.
Im bardziej kreatywny, tym lepiej.
Punktacja
Najkrótsze niezakłócone zgłoszenia w liczbie bajtów zostaną ogłoszone zwycięzcami.
W przypadku jakichkolwiek nieporozumień prosimy pytać lub komentować.
Kontr-wyzwanie
Wszystkich czytelników, w tym tych, którzy przesłali własne procedury, zachęca się do „łamania” zgłoszeń. Zgłoszenie jest łamane, gdy jego klucz jest publikowany w powiązanej sekcji komentarzy. Jeśli przesłanie trwa 72 godziny bez modyfikacji lub krakowania, jest uważane za „bezpieczne”, a wszelkie kolejne sukcesy w krakowaniu będą ignorowane ze względu na konkurs.
Dozwolona jest tylko jedna próba krakowania na zgłoszenie na czytnika. Na przykład, jeśli prześlę użytkownikowi X: „Twój klucz ma 20 lat” i się mylę, użytkownik X zignoruje moje przypuszczenia jako niepoprawne i nie będę już mógł przesyłać dodatkowych domysłów dla tego przesłania.
Zgłoszone zgłoszenia są eliminowane ze sporów (pod warunkiem, że nie są „bezpieczne”). Nie należy ich edytować. Jeśli czytelnik chce przedstawić nową procedurę, powinien to zrobić w osobnej odpowiedzi.
Wynik krakersa to liczba przesłanych przez niego zgłoszeń (zgodnych lub nie). W przypadku krakersów o identycznej liczbie, ranking jest określany przez całkowitą liczbę bajtów dla wszystkich złamanych zgłoszeń (im wyższa, tym lepsza).
Krakersy o najwyższym wyniku zostaną ogłoszone zwycięzcami wraz z twórcami zwycięskich procedur.
Proszę nie łamać własnego zgłoszenia.
Powodzenia. :)
Tabela liderów
Ostatnia aktualizacja 2 września, 10:45 EST
Bariery nieruchome (niezłamane zgłoszenia):
- CJam, 105 [Dennis]
Unstoppable Forces (crackers):
- Dennis [ Java, 269 ; C 58 ; Mathematica, 29 ]
- Martin Büttner [ Java, 245 ]
return
itp ...Odpowiedzi:
CJam, 105 bajtów
W powyższym użyto notacji karetką i literą M., ponieważ zawiera ona znak niezadrukowany. Po przekonwertowaniu strumienia bajtów na liczbę całkowitą (
256b
) wykonywany jest następujący kod:Możesz wypróbować tę wersję online w interpretatorze CJam .
Jak to działa
To przesłanie wykorzystuje teorię liczb zamiast zaciemniania. Program zwróci 0 dla prawie wszystkich danych wejściowych. Z kilku danych wejściowych, które powodują niezerowe wyjście, wyprowadzany jest tajny moduł, który jest stosowany do 10 najmniej znaczących bitów trzeciej liczby całkowitej.
Najskuteczniejszym sposobem rozwiązania tego problemu (o którym mogę pomyśleć) byłoby uwzględnienie 512-bitowej liczby całkowitej, co - mam nadzieję - nie będzie możliwe w ciągu 72 godzin.
Przykładowy przebieg
źródło
Java - 269
Dzięki za cierpliwość wszystkich, należy to teraz naprawić.
skrócony:
Nie skrócony:
źródło
double e,f,d=...;e=...;f=...;
nadouble d=...,e=...,f=...;
1
a także twoja odpowiedź jest nieprawidłowa;) (123 ma rację ... ktoś przychodzi i chwyta wynik cracking ...). I myślę, że Stretch Maniac nie uwzględnił,sin == 1.0
kiedy powiedział, że 122 ma rację.Próbnik
Oczywiście nie jest to oficjalny wpis, a liczba znaków jest zbyt wysoka, ale sądzę, że jeśli ktoś chce zdumiewającego wyzwania, może spróbować określić, ile unikalnych wyników generuje następująca funkcja (biorąc pod uwagę trzy dane wejściowe opisane w OP) :
Tak naprawdę jestem przekonany, że nie da się go przełamać, przyznam każdemu, kto go złamie, nagrodę „Supreme Unstoppable Force of Nature Award”.
Ponieważ naprawdę zasługują na to.
źródło
C, 58 bajtów (pęknięty)
Prosty:
źródło
-15485867, -1299721, -104287, 0, 104287, 1299721, 15485867
).Java - 245
Pęknięty przez Martina Büttnera
Wprowadź dane wejściowe jako tablicę int:
a(new int[]{1,2,3})
. Nie spodziewam się, że minie 72 godziny, ale dobrze się z tym bawię.Oto podział linii, aby był bardziej czytelny:
źródło
Mathematica, 29 bajtów, Klucz: 715, Pęknięty przez Dennisa
To jest tylko poprawiona wersja mojej początkowej odpowiedzi, która nie działała w przypadku danych dodatnich.
Pobiera listę liczb całkowitych takich jak
źródło
349
unikalne wyniki. Zakres był od3
do717
.3 ... 717
).207 znaków, w C / C ++, jeszcze nie zaciemnionych:
źródło