Hai đầu ra nhiều


17

Các thách thức

Tôi giới thiệu với bạn một điệp viên khác và thách thức gián điệp rỗ obfuscators so với crackers. Tuy nhiên, trong trường hợp này, mốc được bảo vệ không phải là đầu vào mà là đầu ra .

Các quy tắc của thử thách rất đơn giản. Viết một thói quen với các thông số kỹ thuật sau:

  1. Thường trình có thể được viết bằng bất kỳ ngôn ngữ nào nhưng không được vượt quá 320 byte.
  2. Thường trình phải chấp nhận ba số nguyên có chữ ký 32 bit làm đầu vào. Nó có thể ở dạng một hàm chấp nhận 3 đối số, một hàm chấp nhận một mảng 3 phần tử hoặc một chương trình hoàn chỉnh đọc 3 số nguyên từ bất kỳ đầu vào tiêu chuẩn nào.
  3. Thường trình phải xuất một số nguyên 32 bit đã ký.
  4. Trên tất cả các đầu vào có thể, thường trình phải xuất ra từ 2 đến 1000 (bao gồm) các giá trị duy nhất. Số lượng giá trị duy nhất mà một thường trình có thể xuất được gọi là khóa của nó .

Ví dụ, chương trình C

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

có một chìa khóa 9, vì nó (hy vọng) chỉ có thể sản lượng chín giá trị 16, 17, 18, 19, 20, 21, 22, 23, và 24.

Một số hạn chế bổ sung như sau:

  1. Thường trình phải hoàn toàn xác định và bất biến theo thời gian, trả về các đầu ra giống hệt nhau cho các đầu vào giống hệt nhau. Các thói quen sẽ không thực hiện cuộc gọi đến các trình tạo số giả ngẫu nhiên.
  2. Thường trình có thể không dựa vào "các biến ẩn" như dữ liệu trong tệp, biến hệ thống hoặc các tính năng ngôn ngữ bí truyền. Ví dụ, các thường trình không nên tham chiếu đến các hằng số trừ khi các hằng số được xác định rõ ràng trong chính mã. Các thường trình dựa trên các quirks của trình biên dịch, các kết quả đầu ra từ các phép toán không xác định về mặt toán học, các lỗi số học, v.v ... cũng không được khuyến khích mạnh mẽ. Khi nghi ngờ, xin hỏi.
  3. Bạn (người viết mã) phải biết chính xác có bao nhiêu đầu ra duy nhất mà thường trình có thể tạo ra và có thể cung cấp ít nhất một chuỗi đầu vào tạo ra mỗi đầu ra. (Vì có khả năng có thể có hàng trăm kết quả đầu ra duy nhất, nên bộ này sẽ chỉ được yêu cầu trong trường hợp khóa của bạn bị tranh cãi.)

Vì vấn đề này không giống với mã hóa cổ điển hơn nhiều so với trước đây, tôi hy vọng nó sẽ có thể truy cập được đối tượng rộng hơn.

Càng sáng tạo càng tốt.

Chấm điểm

Việc gửi không bị bẻ khóa ngắn nhất trên mỗi byte sẽ được tuyên bố là người chiến thắng.

Nếu có bất kỳ sự nhầm lẫn, xin vui lòng hỏi hoặc nhận xét.

Thử thách

Tất cả các độc giả, bao gồm cả những người đã gửi các thói quen của riêng họ, được khuyến khích "bẻ khóa" các bài nộp. Một bài nộp bị bẻ khóa khi khóa của nó được đăng trong phần bình luận liên quan. Nếu một bài nộp tồn tại trong 72 giờ mà không bị sửa đổi hoặc bẻ khóa, nó được coi là "an toàn" và bất kỳ thành công nào sau đó trong việc bẻ khóa, nó sẽ bị bỏ qua vì lợi ích của cuộc thi.

Chỉ có một nỗ lực bẻ khóa cho mỗi lần gửi cho mỗi người đọc được cho phép. Ví dụ: nếu tôi gửi cho người dùng X: "khóa của bạn là 20" và tôi sai, người dùng X sẽ từ chối dự đoán của tôi là không chính xác và tôi sẽ không còn có thể gửi dự đoán bổ sung cho lần gửi đó.

Đệ trình bẻ khóa được loại bỏ khỏi sự tranh chấp (miễn là chúng không "an toàn"). Họ không nên được chỉnh sửa. Nếu một người đọc muốn gửi một thói quen mới, anh ta nên làm như vậy trong một câu trả lời riêng.

Điểm của cracker là số lần gửi (có tuân thủ hoặc không) (s) anh ta bẻ khóa. Đối với các cracker có số lượng giống hệt nhau, thứ hạng được xác định bởi tổng số byte trên tất cả các lần gửi bị bẻ khóa (càng cao, càng tốt).

(Các) cracker có số điểm cao nhất sẽ được tuyên bố là người chiến thắng cùng với các nhà phát triển các thói quen chiến thắng.

Xin đừng bẻ khóa trình của bạn.

May mắn nhất. :)

Bảng xếp hạng

Cập nhật lần cuối ngày 2 tháng 9, 10:45 sáng EST

Rào cản bất động (đệ trình không bị bẻ khóa):

  1. CJam, 105 [Dennis]

Lực lượng không thể ngăn cản (crackers):

  1. Dennis [ Java, 269 ; C, 58 ; Toán học, 29 ]
  2. Martin Büttner [ Java, 245 ]

11
Tôi có thể đề nghị [cảnh sát và kẻ cướp] làm thẻ cho những thách thức này không? Tôi nghĩ rằng đó là một cái tên khá thành lập cho các trò chơi như vậy trong bảo mật và nó có thể sẽ gây ra nhiều sự quan tâm hơn sau đó [nghịch cảnh].
Martin Ender

Chắc chắn rồi. Tôi sẽ thay đổi nó ngay bây giờ.
COTO

Những loại đầu ra được chấp nhận? STDOUT, returnv.v ...
Ypnypn

2
Ví dụ của bạn không chính xác; chữ ký của nó là 9.% 5 có thể trả lại mọi thứ từ -4 đến 4, bao gồm.
Keith Randall

1
@Dennis Tôi sẽ ổn khi bạn thử lại. Đó là lỗi của tôi rằng nó đã bị rối tung.
Căng thẳng Maniac

Câu trả lời:


7

CJam, 105 byte

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

Ở trên sử dụng ký hiệu caret và M, vì nó chứa ký tự không thể in được. Sau khi chuyển đổi luồng byte thành số nguyên ( 256b), đoạn mã sau được thực thi:

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

Bạn có thể thử phiên bản trực tuyến này trong trình thông dịch của CJam .

Làm thế nào nó hoạt động

Trình này sử dụng lý thuyết số thay vì obfuscation. Chương trình sẽ trả về 0 cho hầu hết tất cả các đầu vào. Từ một vài đầu vào dẫn đến đầu ra khác không, một mô đun bí mật được dẫn xuất được áp dụng cho 10 bit có ý nghĩa nhỏ nhất của số nguyên thứ ba.

Cách hiệu quả nhất để giải quyết thách thức này (mà tôi có thể nghĩ ra) sẽ là nhân tố số nguyên 512 bit, mà tôi hy vọng sẽ không thể đạt được trong 72 giờ.

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

%

Chạy ví dụ

$ 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

Bạn quá tốt với những thứ mã hóa. ;)
COTO

11
"Trình này sử dụng lý thuyết số thay vì obfuscation." Nhìn vào mã "Hmm, phải."
I Sepuʎs

4

Java - 269

Cảm ơn sự kiên nhẫn của mọi người, điều này bây giờ sẽ được sửa chữa.

rút ngắn:

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

Không rút ngắn:

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

Bạn có thể lưu bốn ký tự bằng cách thay đổi double e,f,d=...;e=...;f=...;thànhdouble d=...,e=...,f=...;
Ypnypn

@Ypnypn Cảm ơn! thêm vào phiên bản golf.
Căng thẳng Maniac

1
Lần thử thứ hai ( với sự cho phép rõ ràng ): 122
Dennis

1
@Dennis làm tốt lắm! (Đó là nó)
Stretch Maniac

1
@Dennis Trong trường hợp đó, bạn đang quên 1và câu trả lời của bạn cũng không chính xác;) (123 là chính xác ... ai đó đi cùng và lấy điểm số bẻ khóa ...). Và tôi đoán Stretch Maniac đã không tính đến sin == 1.0khi anh ấy nói rằng 122 là chính xác.
Martin Ender

2

Một mẫu

Tất nhiên không phải là mục chính thức và số lượng ký tự quá cao, nhưng tôi nghĩ rằng nếu có ai muốn thử thách trí óc, họ có thể cố gắng xác định có bao nhiêu đầu ra duy nhất mà hàm sau tạo ra (đưa ra ba đầu vào như được mô tả trong 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;}

Trên thực tế, tôi rất tự tin rằng nó không thể bị bẻ khóa, tôi sẽ trao giải cho bất kỳ ai phá vỡ nó là "Giải thưởng sức mạnh tự nhiên không thể ngăn cản tối cao".

Bởi vì thực sự, họ xứng đáng với điều đó.


1
Bạn nên đưa ra một tiền thưởng cho nó!
Orby

1
@Orby Điều đó thật tuyệt, nhưng thật khó để trao tiền thưởng cho một bình luận.
Geobits


@COTO thử thách này vẫn còn?
Soham Chowdhury

@SohamChowdhury: Hoàn toàn đúng. Nếu bạn tìm ra nó, tôi sẽ khai thác chiến thắng của bạn trong OP. Nếu không, hãy cho tôi biết và tôi sẽ đăng giải pháp.
COTO

2

C, 58 byte (Cracked)

Một cái đơn giãn:

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

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

Điều đó thật nhanh chóng :)
Orby

2

Java - 245

Bị nứt bởi Martin Büttner

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

Cung cấp đầu vào dưới dạng một mảng int: a(new int[]{1,2,3}) . Tôi không mong đợi nó sẽ đi 72 giờ, nhưng hãy vui vẻ với nó.

Đây là dấu ngắt dòng, để làm cho nó dễ đọc hơn một chút:

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

Chỉ từ bruteforcing ... 90?
Vectorized

@bitpwner Không, xin lỗi.
Geobits

1
Tôi đã giải thích nó một chút: pastebin.com/8pvvfFYB (Tôi hy vọng tôi đã không phạm sai lầm nào trong khi thay thế tên biến.)
Martin Ender

4
Được rồi, đây là nỗ lực của tôi: 965?
Martin Ender

1
@ MartinBüttner Đúng. Cảm ơn phiên bản bị xáo trộn: D
Geobits

1

Mathicala, 29 byte, Khóa: 715, Bị bẻ khóa bởi Dennis

Đây chỉ là phiên bản cố định của câu trả lời ban đầu của tôi, không hoạt động đối với đầu vào không tích cực.

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

Có một danh sách các số nguyên như

f[{1,2,3}]

Tôi tìm thấy 349kết quả đầu ra độc đáo. Phạm vi là từ 3đến 717.
PhiNotPi

@PhiNotPi Sai. (Tôi đã kiểm tra lại)
Martin Ender

Vâng, tôi đã tìm thấy sai lầm của mình và câu trả lời đúng. Quá muộn mặc dù.
PhiNotPi

1
Nếu những thứ tôi ghép lại từ tài liệu Mathicala và WolframAlpha là chính xác, thì khóa là 715 ( 3 ... 717).
Dennis

2
Mathematica trông giống như một ngôn ngữ hay, nhưng nó quá đắt hoặc tôi quá rẻ ...
Dennis

0

207 ký tự, trong C / C ++, chưa bị xáo trộn:

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

Chỉ cần thử vận ​​may của tôi ... 729.
Vectorized

@bitpwner Chết tiệt, tôi vừa định nói thế. : D ... Nếu đó là sai, mặc dù đó là giới hạn trên.
Martin Ender

2
Đây không phải là một đệ trình hợp lệ. Tất cả các bài tập bên trong vòng lặp có thể dẫn đến tràn số nguyên đã ký , có hành vi không xác định.
Dennis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.