เป้าหมายของความท้าทายนี้คือการหาฟังก์ชั่นสั้น ๆ ที่เป็นไปไม่ได้ในฟังก์ชันp
ที่คุณเลือก นี่คือรหัส C ที่ใช้มัน (ดู
ลิงค์ TIO นี้ซึ่งพิมพ์เอาท์พุทด้วย) และหน้าวิกิพีเดียที่มีมัน
unsigned char pi[] = {
252,238,221,17,207,110,49,22,251,196,250,218,35,197,4,77,
233,119,240,219,147,46,153,186,23,54,241,187,20,205,95,193,
249,24,101,90,226,92,239,33,129,28,60,66,139,1,142,79,
5,132,2,174,227,106,143,160,6,11,237,152,127,212,211,31,
235,52,44,81,234,200,72,171,242,42,104,162,253,58,206,204,
181,112,14,86,8,12,118,18,191,114,19,71,156,183,93,135,
21,161,150,41,16,123,154,199,243,145,120,111,157,158,178,177,
50,117,25,61,255,53,138,126,109,84,198,128,195,189,13,87,
223,245,36,169,62,168,67,201,215,121,214,246,124,34,185,3,
224,15,236,222,122,148,176,188,220,232,40,80,78,51,10,74,
167,151,96,115,30,0,98,68,26,184,56,130,100,159,38,65,
173,69,70,146,39,94,85,47,140,163,165,125,105,213,149,59,
7,88,179,64,134,172,29,247,48,55,107,228,136,217,231,137,
225,27,131,73,76,63,248,254,141,83,170,144,202,216,133,97,
32,113,103,164,45,43,9,91,203,155,37,208,190,229,108,82,
89,166,116,210,230,244,180,192,209,102,175,194,57,75,99,182,
};
unsigned char p(unsigned char x) {
return pi[x];
}
คืออะไร p
p
เป็นส่วนประกอบของสองมาตรฐานการเข้ารหัสลับของรัสเซียคือฟังก์ชันแฮชStreebogและตัวเลขบล็อกKuznyechik ในบทความนี้ (และระหว่างการประชุม ISO) นักออกแบบของอัลกอริทึมเหล่านี้อ้างว่าพวกเขาสร้างอาร์เรย์pi
โดยเลือกวิธีเรียงสับเปลี่ยน 8 บิตแบบสุ่ม
การใช้งาน "เป็นไปไม่ได้"
มีพีชคณิตบน 8 บิต ดังนั้นสำหรับการเปลี่ยนแปลงแบบสุ่มที่กำหนดโปรแกรมที่ใช้มันจะไม่ถูกคาดหวังว่าจะต้องน้อยกว่า 1683 บิต
อย่างไรก็ตามเราพบการใช้งานขนาดเล็กผิดปกติหลายอย่าง (ซึ่งเราอยู่ที่นี่ ) ตัวอย่างเช่นโปรแกรม C ต่อไปนี้:
p(x){unsigned char*k="@`rFTDVbpPBvdtfR@\xacp?\xe2>4\xa6\xe9{z\xe3q5\xa7\xe8",l=0,b=17;while(--l&&x^1)x=2*x^x/128*285;return l%b?k[l%b]^k[b+l/b]^b:k[l/b]^188;}
ซึ่งมีเพียง 158 ตัวอักษรและเหมาะกับใน 1264 บิต คลิกที่นี่เพื่อดูว่าใช้งานได้
เราพูดคุยเกี่ยวกับ "ความเป็นไปไม่ได้" การดำเนินการในระยะสั้นเพราะถ้าการเปลี่ยนแปลงเป็นผลผลิตของกระบวนการสุ่ม (โดยอ้างว่าเป็นนักออกแบบของมัน) แล้วโปรแกรมสั้น ๆ นี้จะไม่อยู่ (ดูหน้านี้สำหรับรายละเอียดเพิ่มเติม)
การดำเนินการอ้างอิง
รหัส C ก่อนหน้านี้ที่อ่านได้มากขึ้นคือ
unsigned char p(unsigned char x){
unsigned char
s[]={1,221,146,79,147,153,11,68,214,215,78,220,152,10,69},
k[]={0,32,50,6,20,4,22,34,48,16,2,54,36,52,38,18,0};
if(x != 0) {
unsigned char l=1, a=2;
while(a!=x) {
a=(a<<1)^(a>>7)*29;
l++;
}
unsigned char i = l % 17, j = l / 17;
if (i != 0) return 252^k[i]^s[j];
else return 252^k[j];
}
else return 252;
}
ตารางk
เป็นเช่นนั้นk[x] = L(16-x)
โดยที่L
เป็นเส้นตรงในแง่ที่L(x^y)==L(x)^L(y)
และใน C ^
หมายถึง XOR อย่างไรก็ตามเราไม่ได้จัดการเพื่อใช้ประโยชน์จากคุณสมบัตินี้เพื่อทำให้การติดตั้งของเราสั้นลง เราไม่ได้ตระหนักถึงโครงสร้างใด ๆs
ที่สามารถทำให้การนำไปใช้งานง่ายขึ้น --- เอาต์พุตนั้นอยู่ในฟิลด์ย่อยเสมอนั่นคือซึ่งการยกกำลังจะกระทำในฟิลด์ จำกัด แน่นอนคุณมีอิสระอย่างยิ่งที่จะใช้สำนวนที่เรียบง่ายกว่าs
ถ้าคุณจะหามัน!
The while loop corresponds to the evaluation of a discrete logarithm in the finite field with 256 elements. It works via a simple brute-force search: the dummy variable a
is set to be a generator of the finite field, and it is multiplied by this generator until the result is equal to x
. When it is the case, we have that l
is the discrete log of x
. This function is not defined in 0, hence the special case corresponding to the if
statement.
unsigned char
a
a=(a<<1)^(a>>7)*(256^29)
a
int
l=1,a=2
l=255
x
รายละเอียดเพิ่มเติมเกี่ยวกับคุณสมบัติของp
จะถูกนำเสนอในบทความของเราด้วยการเขียนของการเพิ่มประสิทธิภาพส่วนใหญ่ของเราเพื่อให้ได้การใช้งานสั้นก่อนหน้านี้
กฎระเบียบ
เสนอโปรแกรมที่ใช้ฟังก์ชันp
น้อยกว่า 1683 บิต เมื่อโปรแกรมสั้นลงความผิดปกติที่เกิดขึ้นก็จะยิ่งสั้นลงเท่านั้น หากภาษาของคุณมี Kuznyechik, Streebog หรือp
เป็น builtin คุณจะไม่สามารถใช้มันได้
ตัวชี้วัดที่เราใช้เพื่อพิจารณาว่าการใช้งานที่ดีที่สุดคือความยาวของโปรแกรมเป็นไบต์ เราใช้ความยาวบิตในรายงานการศึกษาของเรา แต่เรายึดติดกับไบต์ที่นี่เพื่อความเรียบง่าย
หากภาษาของคุณไม่มีความคิดที่ชัดเจนเกี่ยวกับฟังก์ชั่นการโต้แย้งหรือเอาท์พุทการเข้ารหัสขึ้นอยู่กับคุณที่จะกำหนด แต่เทคนิคเช่นการเข้ารหัสค่าpi[x]
ตามที่x
เป็นสิ่งต้องห้ามอย่างชัดเจน
เราได้ส่งรายงานการวิจัยพร้อมกับข้อค้นพบของเราในหัวข้อนี้แล้ว มันมีอยู่ที่นี่ อย่างไรก็ตามหากมันถูกตีพิมพ์ในสถานที่ทางวิทยาศาสตร์เรายินดีที่จะรับทราบผู้เขียนของการใช้งานที่ดีที่สุด
ขอบคุณ xnor สำหรับความช่วยเหลือของเขาเมื่อร่างคำถามนี้!
1683 bits at most
ข้อ จำกัด ที่เข้มงวด [sic?] หรือเป้าหมายหรือไม่