2 대 출력 변수”에 의존하지 않을

도전

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

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

  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 ]


답변

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


답변

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


답변

샘플러

물론 공식적인 출품작이 아니고 문자 수가 너무 많지만 누군가 마음을 사로 잡는 도전을 원한다면 다음 기능이 생성하는 고유 한 출력 수를 결정하려고 시도 할 수 있습니다 (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”를 수상한 사람에게 수여 할 것이다.

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


답변

C, 58 바이트 (크랙 됨)

간단한 것 :

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


답변

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


답변

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

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

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

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

f[{1,2,3}]


답변

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