2 대 출력


17

도전

나는 너에게 또 다른 스파이 대 스파이 도전 구덩이 난 독자 대 크래커를 선물한다. 그러나이 경우 보호 할 데이텀은 입력이 아니라 출력 입니다.

도전의 규칙은 간단합니다. 다음 스펙으로 루틴을 작성하십시오.

  1. 루틴은 모든 언어로 작성 될 수 있지만 320 바이트를 초과 할 수 없습니다.
  2. 루틴은 세 개의 32 비트 부호있는 정수를 입력으로 허용해야합니다. 3 개의 인수를 허용하는 함수, 단일 3 요소 배열을 허용하는 함수 또는 표준 입력에서 3 개의 정수를 읽는 완전한 프로그램의 형태를 취할 수 있습니다.
  3. 루틴은 부호있는 32 비트 정수를 출력해야합니다.
  4. 가능한 모든 입력에서 루틴은 2-1000 (포함)의 고유 한 값 사이에서 출력해야합니다. 루틴이 출력 할 수있는 고유 한 값의 수를 라고합니다 .

예를 들어, C 프로그램

int foo( int i1, int i2, int i3 ) {
    return 20 + (i1^i2^i3) %5;
}

9의 키를 가지고 있기 때문에 (희망) 그 수에만 출력 아홉 개 값 16, 17, 18, 19, 20, 21, 22, 23, 및 24.

몇 가지 추가 제한 사항은 다음과 같습니다.

  1. 루틴은 완전히 결정적이고 시간이 변하지 않아야하며 동일한 입력에 대해 동일한 출력을 반환해야합니다. 루틴은 의사 난수 생성기를 호출하지 않아야합니다.
  2. 이 루틴은 파일의 데이터, 시스템 변수 또는 난해한 언어 기능과 같은 "숨겨진 변수"에 의존하지 않을 수 있습니다. 예를 들어, 루틴 자체는 상수가 코드 자체에 명확하게 정의되어 있지 않으면 상수를 참조해서는 안됩니다. 컴파일러 쿼크, 수학적으로 정의되지 않은 연산의 출력, 산술 오류 등을 사용하는 루틴도 권장하지 않습니다. 의심스러운 경우 문의하십시오.
  3. 사용자 (코더)는 루틴이 생성 할 수있는 고유 한 출력 수를 정확하게 알고 있어야하며 각 출력을 생성하는 하나 이상의 입력 시퀀스를 제공 할 수 있어야합니다. (수백 개의 고유 한 출력이있을 수 있으므로이 세트는 키가 경쟁하는 경우에만 요청됩니다.)

이 문제는 이전 암호화보다 기존 암호화와 훨씬 유사하지 않기 때문에 더 많은 사용자가 액세스 할 수있을 것으로 기대합니다.

창의성이 높을수록 좋습니다.

득점

바이트 수당 가장 짧은 비 균열 제출물이 승자로 선언됩니다.

혼동이 있으시면 언제든지 문의하거나 의견을 보내주십시오.

카운터 챌린지

자신의 루틴을 제출 한 독자를 포함한 모든 독자는 제출물을 "크랙"할 것을 권장합니다. 키가 관련 댓글 섹션에 게시되면 제출 내용이 해독됩니다. 제출물이 수정되거나 깨지지 않은 상태로 72 시간 동안 지속되는 경우 "안전한"것으로 간주되며 이후의 크래킹 성공은 컨테스트를 위해 무시됩니다.

리더 당 제출 당 하나의 크래킹 시도 만 허용됩니다. 예를 들어, 사용자 X에게 "귀하의 키는 20입니다"라는 메시지를 제출했는데 틀린 경우 사용자 X는 내 추측을 틀린 것으로 간주하지 않으며 더 이상 해당 제출에 대한 추가 추측을 제출할 수 없습니다.

금이 간 제출은 경합에서 제거됩니다 ( "안전하지 않은"경우). 편집해서는 안됩니다. 독자가 새로운 루틴을 제출하려면 별도의 답변으로 제출해야합니다.

크래커의 점수는 자신이 크랙 한 제출 수 (준수 여부에 관계없이)입니다. 카운트가 동일한 크래커의 경우 순위는 모든 크래킹 된 제출에 대한 총 바이트 수로 결정됩니다 (높을수록 좋습니다).

가장 높은 점수를받은 크래커는 우승 루틴 개발자와 함께 승자로 선언됩니다.

직접 제출하지 마십시오.

행운을 빌어 요. :)

리더 보드

마지막 업데이트 9 월 2 일 오전 10:45 EST

움직일 수없는 장벽 (금이없는 제출) :

  1. CJam, 105 [데니스]

막을 수없는 힘 (크래커) :

  1. 데니스 [ 자바, 269 ; C, 58 ; 매스 매 티카, 29 ]
  2. 마틴 부트 너 [ Java, 245 ]

11
이러한 도전에 대한 태그로 [cops-and-robbers]를 제안해도 될까요? 나는 그것이 보안에있어서 그러한 게임들에 대해 상당히 확립 된 이름이라고 생각하며 아마도 [대적]보다 더 많은 관심을 불러 일으킬 것이다.
Martin Ender

확실한. 지금 바꾸겠습니다.
COTO

어떤 종류의 출력이 허용됩니까? STDOUT, return등 ...
Ypnypn

2
귀하의 예가 잘못되었습니다. 서명은 9입니다. % 5는 -4에서 4까지의 값을 반환 할 수 있습니다.
Keith Randall

1
@Dennis 다시 시도해 보시기 바랍니다. 그것이 엉망인 것은 내 잘못이었다.
Stretch Maniac

답변:


7

CJam, 105 바이트

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#*)%)%

위의 내용은 인쇄 할 수없는 문자를 포함하므로 캐럿 및 M 표기법을 사용합니다. 바이트 스트림을 정수 ( 256b) 로 변환 한 후 다음 코드가 실행됩니다.

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

CJam 인터프리터 에서이 버전을 온라인으로 사용해 볼 수 있습니다 .

작동 원리

이 제출물은 난독 화 대신 숫자 이론을 사용합니다. 프로그램은 거의 모든 입력에 대해 0을 반환합니다. 0이 아닌 출력을 초래하는 소수의 입력으로부터, 세 번째 정수의 10 개의 최하위 비트에 적용되는 비밀 계수가 도출됩니다.

이 문제를 해결하는 가장 효율적인 방법은 생각할 수있는 512 비트 정수를 인수 분해하는 것이므로 72 시간 안에는 달성 할 수 없기를 바랍니다.

" 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”.                                                ";

%

예제 실행

$ 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

당신은 암호화에 너무 과감합니다. ;)
COTO

11
"이 제출물은 난독 화 대신 숫자 이론을 사용합니다." 코드 "흠, 맞아"를 봅니다.
ɐɔıʇǝɥʇuʎs

4

자바-269

모두의 인내심에 감사드립니다. 이제이 문제가 해결되었습니다.

단축 :

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;}

단축되지 않음 :

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;
}

당신은 변경하여 네 개의 문자를 저장할 수 double e,f,d=...;e=...;f=...;double d=...,e=...,f=...;
Ypnypn

@Ypnypn 감사합니다! 골프 버전에 추가되었습니다.
스트레칭 미치 광

1
두 번째 시도 ( 명시 적 허가 ) : 122
Dennis

1
@Dennis 좋은 직업! (그것이
끝났

1
@Dennis이 경우, 당신은 잊고 1있고 당신의 대답도 잘못되었습니다;) (123 정확합니다. 누군가가 와서 크래킹 점수를 잡습니다 ...). 그리고 Stretch Maniac는 sin == 1.0122가 맞다고 말했 을 때 설명하지 않았다고 생각 합니다.
Martin Ender

2

샘플러

물론 공식적인 출품작이 아니고 문자 수가 너무 많지만 누군가 마음을 사로 잡는 도전을 원한다면 다음 기능이 생성하는 고유 한 출력 수를 결정하려고 시도 할 수 있습니다 (OP에 설명 된대로 3 개의 입력 제공) :

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;}

사실, 나는 그것이 깨질 수 없다고 확신한다. 나는 "Supreme Unstoppable Force of Nature Award"를 수상한 사람에게 수여 할 것이다.

정말로, 그들은 그것을받을 자격이 있기 때문에.


1
현상금을 내야합니다!
Orby

1
@Orby 그것은 좋을 것입니다, 그러나 의견에 현상금을 수여하기는 어렵습니다.
Geobits


@COTO이 도전이 아직 진행 중입니까?
Soham Chowdhury

@SohamChowdhury : 물론입니다. 이해하면 OP에서 승리를 설명하겠습니다. 그렇지 않은 경우 알려 주시면 솔루션을 게시하겠습니다.
COTO

2

C, 58 바이트 (크랙 됨)

간단한 것 :

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

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

그것은 빠르다 :)
Orby

2

자바-245

마틴 부트 너에 의해 금이

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($);}

입력을 int 배열로 공급하십시오 a(new int[]{1,2,3}). 나는 72 시간이 걸릴 것으로 기대하지 않지만 재미있게 놀아 라.

좀 더 읽기 쉽게하기 위해 줄 바꿈이 있습니다.

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($);}

무차별 공격에서 ... 90?
벡터화

@bitpwner 아니요, 죄송합니다.
Geobits

1
: 나는 조금 deobfuscated pastebin.com/8pvvfFYB (내가 변수 이름을 교체하는 동안 내가 어떤 실수를하지 않았다 바랍니다.)
마틴 청산

4
좋아, 여기 내 시도가있다 : 965?
Martin Ender

1
@ MartinBüttner 맞습니다. 모호한 버전 주셔서 감사합니다 : D
Geobits

1

Mathematica, 29 바이트, 키 : 715, Cracked by Dennis

이것은 초기 답변의 고정 버전이며 양수가 아닌 입력에는 작동하지 않습니다.

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

같은 정수 목록을 가져옵니다.

f[{1,2,3}]

349독특한 출력을 찾았습니다 . 범위는 3~ 사이 717입니다.
PhiNotPi

@PhiNotPi 잘못되었습니다. (나는 다시 확인)
마틴 엔더

글쎄, 나는 내 실수와 정답을 발견했다. 너무 늦었 어.
PhiNotPi

1
내가 Mathematica 문서와 WolframAlpha에서 함께 만든 것들이 맞다면, 열쇠는 715 ( 3 ... 717)입니다.
Dennis

2
Mathematica는 좋은 언어처럼 보이지만 너무 비싸거나 너무 비싸다 ...
Dennis

0

C / C ++에서 207 문자는 아직 난독 처리되지 않았습니다.

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;
}

그냥 내 행운을 시도 ... 729.
벡터화

@ bitpwner 젠장, 난 그냥 그렇게 말할거야. : D ... 그것이 틀렸다면 그것은 상한입니다.
마틴 엔더

2
유효한 제출물이 아닙니다. 루프 내부의 모든 할당은 부호있는 정수 overflow를 발생시킬 수 있으며 이는 정의되지 않은 동작을 갖습니다.
Dennis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.