เอาท์พุทสองหลาย


17

ความท้าทาย

ฉันขอเสนออีกสายลับเทียบกับสายลับที่ท้าทายการเจาะรู obfuscators เมื่อเทียบกับแคร็กเกอร์ ในกรณีนี้ แต่ตัวเลขที่จะป้องกันไม่ได้ใส่ แต่เอาท์พุท

กฎของการท้าทายนั้นง่าย เขียนรูทีนด้วยข้อกำหนดต่อไปนี้:

  1. ชุดคำสั่งอาจเขียนเป็นภาษาใดก็ได้ แต่ต้องไม่เกิน 320 ไบต์
  2. รูทีนต้องยอมรับจำนวนเต็ม 32- บิตที่ได้รับการรับรองทั้งสามเป็นอินพุต มันสามารถอยู่ในรูปแบบของฟังก์ชั่นที่ยอมรับ 3 ข้อโต้แย้งฟังก์ชั่นที่ยอมรับอาร์เรย์ 3 องค์ประกอบเดียวหรือโปรแกรมสมบูรณ์ที่อ่านจำนวนเต็ม 3 จำนวนจากอินพุตมาตรฐานใด ๆ
  3. รูทีนต้องเอาท์พุทจำนวนเต็ม 32- บิตที่เซ็นชื่อหนึ่งชุด
  4. โดยอินพุตที่เป็นไปได้ทั้งหมดรูทีนต้องส่งออกระหว่างค่าเฉพาะ 2 ถึง 1,000 (รวม) จำนวนของค่าที่ไม่ซ้ำกันการส่งออกสามารถประจำเรียกว่ามันสำคัญ

ดังตัวอย่างโปรแกรม C

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

มีที่สำคัญของ 9 เพราะมัน (หวังว่า) เท่านั้นที่สามารถส่งออกค่าเก้า16, 17, 18, 19, 20, 21, 22, และ2324

ข้อ จำกัด เพิ่มเติมบางประการมีดังนี้:

  1. ชุดคำสั่งจะต้องกำหนดอย่างเต็มที่และไม่แปรผันตามเวลาส่งคืนเอาต์พุตที่เหมือนกันสำหรับอินพุตที่เหมือนกัน ชุดคำสั่งไม่ควรทำการโทรไปยังเครื่องกำเนิดหมายเลขเทียมเทียม
  2. รูทีนอาจไม่พึ่งพา "ตัวแปรที่ซ่อนอยู่" เช่นข้อมูลในไฟล์ตัวแปรระบบหรือคุณสมบัติทางภาษาที่ลึกลับ ตัวอย่างเช่นกิจวัตรโดยทั่วไปไม่ควรอ้างถึงค่าคงที่เว้นแต่ค่าคงที่จะถูกกำหนดไว้อย่างชัดเจนในรหัสตัวเอง รูทีนที่ต้องพึ่งพาคอมไพเลอร์ quirks, เอาต์พุตจากการดำเนินการที่ไม่ได้กำหนดทางคณิตศาสตร์, ข้อผิดพลาดทางคณิตศาสตร์และอื่น ๆ หากมีข้อสงสัยโปรดสอบถาม.
  3. คุณ (coder) ต้องทราบอย่างแม่นยำถึงจำนวนเอาต์พุตที่ไม่ซ้ำกันที่รูทีนสามารถสร้างได้และควรสามารถจัดเตรียมอินพุตลำดับอย่างน้อยหนึ่งลำดับที่สร้างแต่ละเอาต์พุต (เนื่องจากอาจมีเอาต์พุตที่ไม่ซ้ำกันหลายร้อยชุดชุดนี้จะถูกร้องขอในกรณีที่คีย์ของคุณเข้าร่วมเท่านั้น)

เนื่องจากปัญหานี้มีความคล้ายคลึงกับการเข้ารหัสแบบดั้งเดิมน้อยกว่าการเข้ารหัสก่อนหน้านี้ฉันจึงคาดว่าจะสามารถเข้าถึงผู้ชมได้กว้างขึ้น

ยิ่งสร้างสรรค์ยิ่งดี

เกณฑ์การให้คะแนน

การส่งที่ไม่แตกสั้นที่สุดต่อจำนวนไบต์จะถูกประกาศให้เป็นผู้ชนะ

หากมีความสับสนใด ๆ โปรดอย่าลังเลที่จะถามหรือแสดงความคิดเห็น

การท้าทาย

ผู้อ่านทุกคนรวมถึงผู้ที่ส่งกิจวัตรของตนเองได้รับการสนับสนุนให้ "ส่งเสียงดัง" การส่งจะแตกเมื่อคีย์ของมันถูกโพสต์ในส่วนความคิดเห็นที่เกี่ยวข้อง หากการส่งยังคงมีอยู่เป็นเวลา 72 ชั่วโมงโดยไม่มีการดัดแปลงหรือแตกมันจะถือว่า "ปลอดภัย" และความสำเร็จใด ๆ ที่ตามมาในการถอดรหัสจะถูกเพิกเฉยเพราะการประกวด

อนุญาตให้แคร็กได้หนึ่งครั้งต่อการส่งต่อผู้อ่านเท่านั้น ตัวอย่างเช่นหากฉันส่งให้กับผู้ใช้ X: "คีย์ของคุณคือ 20" และฉันผิดผู้ใช้ X จะปฏิเสธการเดาของฉันว่าไม่ถูกต้องและฉันจะไม่สามารถส่งการเดาเพิ่มเติมสำหรับการส่งนั้นได้อีก

การส่งที่แคร็กจะถูกกำจัดออกจากการแข่งขัน (หากไม่ปลอดภัย) ไม่ควรแก้ไข หากผู้อ่านประสงค์ที่จะส่งกิจวัตรใหม่เขาควรทำในคำตอบที่แยกต่างหาก

คะแนนของแคร็กเกอร์คือจำนวนของการส่ง (ตามหรือไม่) (s) เขาแตก สำหรับแครกเกอร์ที่มีจำนวนเท่ากันการจัดอันดับจะพิจารณาจากจำนวนไบต์ทั้งหมดในการส่งข้อมูลที่ถอดรหัสทั้งหมด (ยิ่งสูงยิ่งดี)

แคร็กเกอร์ที่มีคะแนนสูงสุดจะถูกประกาศให้กับผู้ชนะพร้อมกับผู้พัฒนาของกิจวัตรที่ชนะ

โปรดอย่าถอดรหัสของคุณเอง

ขอให้โชคดี :)

ลีดเดอร์บอร์ด

อัปเดตล่าสุด 2 กันยายนเวลา 22:45 น. EST

ปัญหาและอุปสรรคที่ไม่สามารถเคลื่อนย้ายได้

  1. CJam, 105 [เดนนิส]

กองกำลัง Unstoppable (แครกเกอร์):

  1. เดนนิส [ Java, 269 ; C, 58 ; Mathematica, 29 ]
  2. Martin Büttner [ Java, 245 ]

11
ฉันขอแนะนำ [ตำรวจและโจร] เป็นแท็กสำหรับความท้าทายเหล่านี้ได้ไหม ฉันคิดว่ามันเป็นชื่อที่สร้างขึ้นอย่างเป็นธรรมสำหรับเกมดังกล่าวในด้านความปลอดภัยและมันอาจจะทำให้เกิดความสนใจมากขึ้นในเวลาต่อมา [ฝ่ายต่อต้าน]
Martin Ender

แน่ใจ ฉันจะเปลี่ยนตอนนี้
COTO

เอาต์พุตชนิดใดที่ยอมรับได้? STDOUT, returnฯลฯ ...
Ypnypn

2
ตัวอย่างของคุณไม่ถูกต้อง ลายเซ็นของมันคือ 9. % 5 สามารถส่งคืนอะไรได้ตั้งแต่ -4 ถึง 4 รวม
Keith Randall

1
@Dennis ฉันจะสบายดีถ้าคุณลองอีกครั้ง มันเป็นความผิดของฉันที่มันเกิดความสับสน
ยืด 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 สำหรับอินพุตเกือบทั้งหมด จากอินพุตไม่กี่ตัวที่ส่งผลให้เอาต์พุตไม่เป็นศูนย์มอดูลัสลับจะถูกนำมาใช้กับ 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
"การส่งนี้ใช้ทฤษฎีจำนวนแทนการทำให้งงงวย" ดูรหัส "อืมใช่แล้ว"
Sepıʇǝɥʇuʎs

4

Java - 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 ขอบคุณ! เพิ่มไปยังรุ่น golfed
ยืด Maniac

1
ความพยายามครั้งที่สอง ( โดยได้รับอนุญาตอย่างชัดเจน ): 122
เดนนิส

1
@Dennis ทำได้ดีมาก! (นั่นแหล่ะ)
ยืด Maniac

1
@Dennis ในกรณีนี้คุณลืมไป1แล้วและคำตอบของคุณก็ไม่ถูกต้องเช่นกัน) (123 ถูกต้อง ... มีใครบางคนเข้ามาและคว้าคะแนนถอดรหัส ... ) และฉันเดาว่า Stretch Maniac ไม่ได้คิดsin == 1.0เมื่อเขาบอกว่า 122 ถูกต้อง
Martin Ender

2

ตัวอย่าง

ไม่ใช่รายการอย่างเป็นทางการของหลักสูตรและจำนวนตัวละครนั้นสูงเกินไป แต่ฉันคิดว่าถ้าใครต้องการความท้าทายที่ทำให้มึนงงพวกเขาสามารถลองกำหนดจำนวนผลลัพธ์ที่เป็นเอกลักษณ์ของฟังก์ชั่นต่อไปนี้ได้ :

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

ในความเป็นจริงฉันมั่นใจมากว่ามันไม่สามารถถอดออกได้ฉันจะให้รางวัลกับใครก็ตามที่ได้รับรางวัล "พลังแห่งการทำลายล้างสูงสุดจากธรรมชาติ"

เพราะพวกเขาสมควรได้รับจริงๆ


1
คุณควรจะรับรางวัลสำหรับมัน!
Orby

1
@Orby นั่นคงจะดี แต่ก็ยากที่จะให้รางวัลกับความคิดเห็น
Geobits


@COTO ความท้าทายนี้ยังคงอยู่หรือไม่
Soham Chowdhury

@SohamChowdhury: แน่นอน ถ้าคุณคิดออกฉันจะอธิบายชัยชนะของคุณใน OP ถ้าไม่แจ้งให้เราทราบและฉันจะโพสต์วิธีแก้ปัญหา
COTO


2

Java - 245

ถูกแคร็กโดย 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($);}

ฟีดการป้อนข้อมูลที่เป็นอาร์เรย์ a(new int[]{1,2,3})int: ฉันไม่ได้คาดหวังว่าจะใช้เวลา 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($);}

เพียงแค่จาก bruteforcing ... 90
Vectorized

@bitpwner Nope ขอโทษ
Geobits

1
ฉัน deobfuscated มันบิต: pastebin.com/8pvvfFYB (. ฉันหวังว่าฉันไม่ได้ทำผิดพลาดใด ๆ ในขณะที่การเปลี่ยนชื่อตัวแปร)
มาร์ตินเอนเดอร์

4
ตกลงนี่คือความพยายามของฉัน: 965?
Martin Ender

1
@ MartinBüttnerถูกต้อง ขอบคุณสำหรับรุ่นที่สับสน: D
Geobits

1

Mathematica, 29 ไบต์, รหัส: 715, แคร็กโดยเดนนิส

นี่เป็นเพียงคำตอบเริ่มต้นที่คงที่ของฉันซึ่งไม่สามารถใช้กับอินพุตที่ไม่เป็นบวกได้

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

ใช้รายการของจำนวนเต็มเช่น

f[{1,2,3}]

ฉันพบ349ผลลัพธ์ที่เป็นเอกลักษณ์ ช่วงที่เกิดจากการ3 717
PhiNotPi

@PhiNotPi ผิด (ฉันตรวจสอบอีกครั้ง)
Martin Ender

ฉันพบข้อผิดพลาดและคำตอบที่ถูกต้อง สายเกินไป
PhiNotPi

1
หากสิ่งที่ฉันปะติดปะต่อเข้าด้วยกันจากเอกสาร Mathematica และ WolframAlpha นั้นถูกต้องกุญแจคือ 715 ( 3 ... 717)
เดนนิส

2
Mathematica ดูเหมือนจะเป็นภาษาที่ดี แต่ก็แพงเกินไปหรือแพงเกินไป ...
Dennis

0

207 ตัวอักษรใน C / C ++ ยังไม่ได้ obfuscated:

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
Vectorized

@bitpwner ประณามฉันเพิ่งจะบอกว่า : D ... ถ้ามันผิดนั่นคือขอบเขตสูงสุด
Martin Ender

2
นี่ไม่ใช่การส่งที่ถูกต้อง การมอบหมายทั้งหมดภายในลูปอาจส่งผลให้เกิดโอเวอร์โฟลว์จำนวนเต็มที่ลงนามซึ่งมีพฤติกรรมที่ไม่ได้กำหนด
เดนนิส
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.