Dwa wyjścia


17

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:

  1. Procedura może być napisana w dowolnym języku, ale nie może przekraczać 320 bajtów.
  2. 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.
  3. Procedura musi wyprowadzać jedną 32-bitową liczbę całkowitą ze znakiem.
  4. 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:

  1. 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.
  2. 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ć.
  3. 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):

  1. CJam, 105 [Dennis]

Unstoppable Forces (crackers):

  1. Dennis [ Java, 269 ; C 58 ; Mathematica, 29 ]
  2. Martin Büttner [ Java, 245 ]

11
Czy mogę zasugerować [gliniarzy i rabusiów] jako znacznik tych wyzwań? Myślę, że jest to dość dobrze znana nazwa takich gier pod względem bezpieczeństwa i prawdopodobnie wzbudzi większe zainteresowanie niż [przeciwnik].
Martin Ender,

Pewnie. Teraz to zmienię.
COTO,

Jakiego rodzaju wyniki są dopuszczalne? STDOUT, returnitp ...
Ypnypn

2
Twój przykład jest niepoprawny; jego sygnatura to 9.% 5 może zwrócić wszystko od -4 do 4 włącznie.
Keith Randall

1
@Dennis Nic mi nie będzie, gdy spróbujesz ponownie. To moja wina, że ​​to popsuło.
Stretch Maniac

Odpowiedzi:


7

CJam, 105 bajtów

1q~]4G#b2A#md"M-k^XM-WHM-n^GM-0%M-uwM-gM-^XeM-kM-^VO^Ph,M-^MM-^PM-qM-!M-8M-AM-OM-~tM-^FM-cM-h^AM-0M-0M-lM-@M-^[MF=M-^Z^SM-1M-KM-T2M-9M-UmSM-N
M-8M-^^M-n$4M-^M^SM-x M-OM-^@^?"256b@D#Y256#%2+md!A3#*)%)%

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:

1q~]4G#b2A#md
12313030820310059479144347891900383683119627474072658988524821209446180284434934346766561958060381533656780340359503554566598728599799248566073353154035839
@D#Y256#%2+md!A3#*)%)%

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.

" Prepend 1 to the numbers read from STDIN and convert the resulting array into an integer
  (“N”) by considering them digits of a base 2**32 number.                                 ";

1q~]4G#

" Compute “N / 1024” and “N % 1024”.                                                       ";

2A#md

" Push a carefully selected 512 bit semi-prime (“S”).                                      ";

12313030820310059479144347891900383683119627474072658988524821209446180284434934346766561958060381533656780340359503554566598728599799248566073353154035839

" Compute P = (N / 1024) ** 13 % 2 ** 256 + 2.                                             ";

@D#Y256#%2+

" Compute “S / P” and “S % P”.                                                             ";

md

" Compute “M = (S / P) % (1000 * !(S % P) + 1) + 1”.

  “M” is the key if P is a divisor of S; otherwise, “M == 1”.                              ";

!A3#*)%)

" Compute the final output: “N % 1024 % M”.                                                ";

%

Przykładowy przebieg

$ base64 -d > outputs.cjam <<< MXF+XTRHI2IyQSNtZCLrGNdI7gewJfV355hl65ZPEGgsjZDxobjBz/50huPoAbCw7MCbTUY9mhOxy9QyudVtU84KuJ7uJDSNE/ggz4B/IjI1NmJARCNZMjU2IyUyK21kIUEzIyopJSkl
$ wc -c outputs.cjam
105 outputs.cjam
$ LANG=en_US cjam outputs.cjam < outputs.secret; echo
1
$ LANG=en_US cjam outputs.cjam <<< '1 2 3'; echo
0

Jesteś po prostu zbyt dobry w szyfrowaniu. ;)
COTO

11
„To przesłanie wykorzystuje teorię liczb zamiast zaciemniania”. Patrzy na kod „Hmm, racja”.
1ıʇǝɥʇuʎs

4

Java - 269

Dzięki za cierpliwość wszystkich, należy to teraz naprawić.

skrócony:

int a(int a,int b,int c){double d=180-360.0/(int)(Math.abs(Math.sin(a*60))*50+2),e=180-360.0/(int)(Math.abs(Math.cos(b*60))*50+2),f=180-360.0/(int)(Math.atan2(c*60, a*60)*51+2);if(Math.abs(d+e+f-360)<.1)return Integer.valueOf((int)d+""+(int)e+""+(int)f);else return 1;}

Nie skrócony:

int a(int a, int b, int c) {
    double d = 180 - 360.0 / (int) (Math.abs(Math.sin(a * 60)) * 50 + 2);
    double e = 180 - 360.0 / (int) (Math.abs(Math.cos(b * 60)) * 50 + 2);
    double f = 180 - 360.0 / (int) (Math.atan2(c * 60, a * 60) * 51 + 2);
    if (Math.abs(d + e + f - 360) < .1)
        return Integer.valueOf((int) d + "" + (int) e + "" + (int) f);
    else
        return 1;
}

Możesz zapisać cztery znaki, zmieniając double e,f,d=...;e=...;f=...;nadouble d=...,e=...,f=...;
Ypnypn

@Ypnypn Thanks! dodano do wersji golfowej.
Stretch Maniac

1
Druga próba ( za wyraźnym zezwoleniem ): 122
Dennis

1
@Dennis dobra robota! (To jest to)
Stretch Maniac

1
@Dennis W takim przypadku zapominasz, 1a 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.0kiedy powiedział, że 122 ma rację.
Martin Ender

2

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) :

function z(y,_,$){M=[];N=[];O=[];C=1792814437;P=72;r=t=0;(f=function(a,k,L){if(k<a.length){for(L=a[k],a[k]=0;a[k]<L;a[k]++)f(a,k+1)}else
if(!t){f([P-1,P-1],0,++t);N=M;while(t<2*P){s=!(t&1);f([P,P,P,P],0,++t);r=r||(s?0:t);t&1&&(N=O);O=[]}}else
((t<2)&&(((d=P*a[0]+(P+1)*a[1]+P)<(P<<6))&&(M[d]=(((y^~_)>>a[0])+((_^~$)>>(a[0]-32)))&1),((a[1]<P-a[0])&&
(M[a[1]+(P+1)*a[0]]=(($^C)>>a[0]+16-a[1])&1))||1))||((t&1)&&((O[P*a[2]+a[3]]|=M[a[1]+P*a[2]]&N[P*a[0]+a[3]]&&
!(a[0]-a[1]))||1))||(s|=N[(a[0]+1)*a[1]+a[3]]);})([],0,0);return r;}

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.


1
Powinieneś za to wystawić nagrodę!
Orby

1
@Orby To byłoby fajne, ale trudno jest przyznać nagrodę za komentarz.
Geobits


@COTO czy to wyzwanie wciąż trwa?
Soham Chowdhury,

@SohamChowdhury: Absolutnie. Jeśli to wymyślisz, objaśnię twoje zwycięstwo w PO. Jeśli nie, daj mi znać, a ja opublikuję rozwiązanie.
COTO,

2

C, 58 bajtów (pęknięty)

Prosty:

f(a,b,c){return(long long)a*b*c-0x1d21344f8479d61dLL?0:a;}

2
7 ( -15485867, -1299721, -104287, 0, 104287, 1299721, 15485867).
Dennis

To było szybkie :)
Orby

2

Java - 245

Pęknięty przez Martina Büttnera

int a(int[]_$){return $($($_(_$[0],0)))+$_(_$[1],1)*11+$($($_(_$[1+1],0)))*(1+1);}int $_(int $,int $_){int OO=0,o=1,O=1;for($=$<0?-$:$;++O*O<=$;OO+=$%O<1?O:0,o+=$%O<1?1:0,$/=$%O<1?O--:1);return $_>0?o:OO+$;}int $(int $){return(int)Math.sqrt($);}

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:

int a(int[]_$){return $($($_(_$[0],0)))+$_(_$[1],
1)*11+$($($_(_$[1+1],0)))*(1+1);}int $_(int $,int
$_){int OO=0,o=1,O=1;for($=$<0?-$:$;++O*O<=$;OO+=
$%O<1?O:0,o+=$%O<1?1:0,$/=$%O<1?O--:1);return $_>
0?o:OO+$;}int $(int $){return(int)Math.sqrt($);}

Tylko z brutalizmu ... 90?
Vectorized

@bitpwner Nie, przepraszam.
Geobits

1
Odrobiłem to trochę: pastebin.com/8pvvfFYB (Mam nadzieję, że nie popełniłem żadnych błędów, zastępując nazwy zmiennych.)
Martin Ender

4
Dobra, oto moja próba: 965?
Martin Ender

1
@ MartinBüttner Prawidłowo. Dzięki za zaciemnioną wersję: D
Geobits

1

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.

f=Plus@@Mod[NextPrime@#,240]&

Pobiera listę liczb całkowitych takich jak

f[{1,2,3}]

Znalazłem 349unikalne wyniki. Zakres był od 3do 717.
PhiNotPi

@PhiNotPi Wrong. (Sprawdziłem dwukrotnie)
Martin Ender

Cóż, znalazłem swój błąd i właściwą odpowiedź. Jednak za późno.
PhiNotPi

1
Jeśli rzeczy, które poskładałem z dokumentacji Mathematica i WolframAlpha są poprawne, kluczem jest 715 ( 3 ... 717).
Dennis

2
Mathematica wygląda na fajny język, ale albo jest cholernie drogi, albo jestem cholernie tani ...
Dennis

0

207 znaków, w C / C ++, jeszcze nie zaciemnionych:

int x(int a, int b, int c) {
    int d, e, f;
    for (int i=0; i!=1<<31; ++i) {
        d=10*(b-a);
        e=a*(28-c)-b;
        f=a*b-2.7*c;
        a += d;
        b += e;
        c += f;
    }
    return ((a%5+5)*10+(b%5+5))*10+c%5+5;
}

Próbuję tylko szczęścia ... 729.
Vectorized

@bitpwner Cholera, chciałem to powiedzieć. : D ... Jeśli to źle, to jednak górna granica.
Martin Ender

2
To nie jest prawidłowe zgłoszenie. Wszystkie przypisania w pętli mogą spowodować przepełnienie liczb całkowitych ze znakiem , co ma niezdefiniowane zachowanie.
Dennis
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.