ตัวเลข VICเป็นหนึ่งในผู้ที่มีความซับซ้อนมากที่สุดดินสอและกระดาษยันต์เคยวางแผน ใช้ในยุค 50 โดยสายลับโซเวียต Reino Häyhänenชื่อรหัสว่า "VICTOR" หลักการสำคัญคือความปลอดภัยผ่านการทำให้งงงวย; จำนวนมากของ obfuscation
งานของคุณคือการเขียนโปรแกรมหรือฟังก์ชั่นที่จะรับข้อความและเข้ารหัสโดยใช้รหัส VIC ฉันยังได้โพสต์ความท้าทาย VIC เข้ารหัสถอดรหัสที่นี่ หากคำแนะนำใด ๆ ต่อไปนี้ไม่ชัดเจนอย่าลังเลที่จะถามพวกเขาในความคิดเห็น คำแนะนำถูกดัดแปลงจากเว็บไซต์นี้
การเข้ารหัสรหัส VIC
การจัดเตรียม
คุณจะต้องมีห้าอินพุต:
- ข้อความธรรมดา
- คำหลักหรือวลีสั้น ๆ ที่มีตัวอักษรที่พบบ่อยที่สุดในภาษาของคุณ
- วลีสำคัญเช่นคำพูดหรือบรรทัดจากเพลง (อย่างน้อย 20 ตัวอักษร)
- วันที่ (หรือตัวเลขอื่นที่เป็นตัวเลขหกหลักหรือมากกว่า)
- หมายเลขตัวแทนส่วนตัว
ในทางปฏิบัติผู้ส่งและผู้รับสี่คนสุดท้ายควรได้รับการตกลงกันล่วงหน้ารวมถึงไม่ว่าจะใช้หมายเลขตัวแทนของผู้ส่งหรือผู้รับในการเข้ารหัส
ข้อความตัวอย่างของฉันจะเป็น: We are discovered. Take what you can. Burn everything else. Move to Safehouse Foxtrot 3.
เราจะได้รับการเข้ารหัสในภาษาอังกฤษ (แม้ว่าคุณอาจจะใช้สิ่งที่ภาษาและอักษรที่คุณต้องการ) A, E, I, N, O, R, S, T
และตัวอักษรที่พบมากที่สุดในตัวอักษรภาษาอังกฤษ SENATORI
ผมจะใช้คำหลัก
วลีสำคัญของฉันคือคำพูดของ Richard Feynman: "หลักการแรกคือคุณต้องไม่หลอกตัวเอง - และคุณเป็นคนที่ง่ายที่สุดที่จะหลอก"
เป็นวันที่ฉันจะใช้วันที่ 31 กรกฎาคม 2016 (ในรูปแบบ3172016
) ซึ่งเป็นวันที่เมื่อฉันเขียนคำอธิบายนี้
9
จำนวนบุคคลที่ฉันได้รับการแต่งตั้งให้ตัวเองเป็น
สรุปขั้นตอน
- รับคีย์กลางสำหรับใช้ในขั้นตอนต่อไปนี้
- สร้างและใช้กระดานหมากรุกแบบ straddling
- สร้างและใช้ตารางการขนย้ายแรก
- สร้างและใช้ตารางการขนย้ายที่สอง (กระจัดกระจาย)
- จบข้อความด้วยการแทรกกลุ่มตัวบ่งชี้ข้อความ
Submechanisms
อีกสองสิ่งที่จะอธิบายก่อนที่เราจะเข้าสู่เนื้อของเรื่อง: กระบวนการของการเติมห่วงโซ่และลำดับ
การเพิ่มเครือข่ายหรือที่รู้จักกันในชื่อตัวกำเนิด Fibonacci ที่ล้าหลังทำงานโดยใช้ลำดับตัวเลขเริ่มต้นเพิ่มตัวเลขสองหลักแรกโดยไม่ต้องถือ (เพิ่มเข้าด้วยกันแล้วmod 10
) และต่อท้ายผลลัพธ์ ตัวอย่างเช่น:
79081
7 + 9 = 6
790816
9 + 0 = 9
7908169
0 + 8 = 8
79081698
8 + 1 = 9
790816989
1 + 6 = 7
7908169897
... and so on
การจัดลำดับเป็นหลักคือการเรียงลำดับตัวอักษรหรือตัวเลขและติดฉลากตามลำดับตัวอักษร / ตัวเลข รายการที่ซ้ำกันมีป้ายกำกับจากซ้ายไปขวา ตัวอย่างเช่น:
E X A M P L E
0 # A
1 0 2 # Es
1 0 3 2 # L
1 0 4 3 2 # M
1 0 4 5 3 2 # P
1 6 0 4 5 3 2 # X
3 3 0 5 8 4 2 0 4 7 5 4 8 1
0 1 # 0s
0 1 2 # 1
0 3 1 2 # 2
4 5 0 3 1 2 # 3s
4 5 0 6 3 1 7 8 2 # 4s
4 5 0 9 6 3 1 7 10 8 2 # 5s
4 5 0 9 6 3 1 7 11 10 8 2 # 7
4 5 0 9 12 6 3 1 7 11 10 8 13 2 # 8s
ฉันใช้การจัดทำดัชนีเป็นศูนย์ที่นี่ แต่ทำดัชนีตามที่คุณต้องการ
1. คีย์ระดับกลาง
แยก 20 ตัวอักษรตัวแรกของวลีที่สำคัญออกเป็นสองกลุ่ม 10 และ sequentialize แต่ละคนซึ่งเราจะเรียกและS1
S2
THEFIRSTPR
S1: 8201357946
INCIPLEIST
S2: 2603751489
เลือกตัวระบุข้อความ 5 หลักแบบสุ่มM
(ซึ่งอาจเป็นหนึ่งในอินพุตหากคุณต้องการ):
M = 47921
ลบโดยไม่ต้องยืม (ลบmod 10
) ตัวเลขห้าหลักแรกของวันที่หลัก3172016
จากM
:
M 47921
date - 31720
= 16201
เชนเพิ่มผลลัพธ์จนกว่าคุณจะมีสิบหลัก:
1620178218
เพิ่มตัวเลขเหล่านี้ไปยังS1
โดยไม่ต้องดำเนินการหรือที่mod 10
จะได้รับG
:
1620178218
S1 + 8201357946
G = 9821425154
ดังกล่าวข้างต้นS2
เขียนลำดับ 0123456789 ค้นหาหลักของแต่ละG
ลำดับ 0123456789 S2
และแทนที่ด้วยหลักตรงด้านล่างของมันใน ผลที่ได้คือT
ผลที่ได้คือ
0123456789
S2 2603751489
G 9821425154
T 9806705657
ใช้การเพิ่มโซ่เพื่อขยาย T
ถึง 60 หลัก
9806705657
becomes
980670565778637511245490262369939288595822106344304316978734
เหล่านี้ 50 หลักสุดท้ายในห้าแถวสิบหลักแต่ละรูปแบบ U
บล็อก
T 9806705657
U 7863751124
5490262369
9392885958
2210634430
4316978734
ตัวเลขสองหลักสุดท้ายที่ไม่เท่ากับของ U
บล็อกที่มีการเพิ่มจำนวนเป็นรายบุคคลเพื่อบุคคลของตัวแทนในการให้ความกว้างของทั้งสอง transpositions ที่และp
q
9 + 3 = 12 (p, ความกว้างของการย้ายครั้งแรก) 9 + 4 = 13 (q, ความกว้างของการถ่ายโอนที่สอง)
จัดลำดับT
และใช้ลำดับนี้เพื่อคัดลอกคอลัมน์ของU
บล็อกจากบนลงล่างสู่แถวของตัวเลขV
ใหม่
T 9806705657
seqT 9804612537
U 7863751124
5490262369
9392885958
2210634430
4316978734
V 69911 56837 12548 26533 30206 13947 72869 49804 84323 75924
Sequentialize แรกp
ตัวเลขที่จะได้รับที่สำคัญสำหรับการขนย้ายครั้งแรกK1
และต่อไปนี้ตัวเลขสำหรับคีย์ที่สองq
K2
First 12 6 9 9 1 1 5 6 8 3 7 1 2
K1 6 10 11 0 1 5 7 9 4 8 2 3
Next 13 5 4 8 2 6 5 3 3 3 0 2 0 6
K2 8 7 12 2 10 9 4 5 6 0 3 1 11
ในที่สุดให้เรียงลำดับแถวสุดท้ายของU
บล็อกเพื่อให้ได้C
ส่วนหัวคอลัมน์สำหรับตารางหมากรุก:
U5 4316978734
C 3105968724
2. กระดานหมากรุก Straddling
ก่อนอื่นฉันจะให้กระดานตรวจสอบตัวอย่างของฉันจากนั้นอธิบายหลักการในการสร้างมันในแบบนั้น:
3 1 0 5 9 6 8 7 2 4
S E N A T O R I
2 B D G J L P U W Y .
4 C F H K M Q V X Z #
SENATORI
บรรทัดแรกของตัวอักษรเป็นคำสำคัญสั้น ๆ ของเรา คำหลักของคุณสามารถเป็นสตริงใด ๆ โดยไม่ซ้ำกัน แต่เนื่องจากมันเป็นตัวกำหนดแถวบนของกระดานหมากรุกของคุณให้เลือกอย่างชาญฉลาด เหนือคำหลักคือC
และแถวอื่น ๆ คือตัวอักษรที่เหลือของคุณตามลำดับที่คุณเลือก ในกรณีของฉันฉันเต็มกระดานหมากรุกกับส่วนที่เหลือของตัวอักษรละตินเครื่องหมายวรรคตอน.
และเครื่องหมายสำหรับ demarcating #
ตัวเลข โดยพื้นฐานแล้วกระดานหมากรุกเป็นรหัสตัวเลขแฟนซี ยกตัวอย่างเช่น "E" จะถูกแทนที่ด้วย1
และ "W" 27
จะถูกแทนที่ด้วย
เมื่อเราเข้ารหัสข้อความธรรมดาของเราด้วยกระดานหมากรุกนี้ แต่ก่อนอื่นเราต้องทำให้ข้อความเริ่มต้นของเราชัดเจนน้อยลงโดยการแยกมันในตำแหน่งที่สุ่มและทำให้มันเป็นตัวพิมพ์ใหญ่ทั้งหมด เพื่อแสดงจุดเริ่มต้นดั้งเดิมอื่น ๆ เราใช้สองจุด..
We are discovered. Take what you can. Burn everything else. Move to Safehouse Foxtrot 3.
กลายเป็น
HING ELSE. MOVE TO SAFEHOUSE FOXTROT#3#.. WE ARE
DISCOVERED. TAKE WHAT YOU CAN. BURN EVERYT
เราเข้ารหัสด้วยตารางหมากรุกให้เรา:
407020 1293124 496481 96 354114062831 416479869443442424 271 581
2173436481812124 95451 274059 22628 435024 232880 14818229
หากความยาวของข้อความไม่สามารถหารด้วย 5 ได้เราจะเพิ่มตัวอักษร null เพื่อตัดข้อความ ข้อความของเรามีความยาว 109 หลักดังนั้นฉันจะเพิ่มหนึ่ง null: "4"
40702 01293 12449 64819 63541 14062 83141 64798 69443 44242 42715
81217 34364 81812 12495 45127 40592 26284 35024 23288 01481 82294
หมายเหตุ: เนื่องจากข้อความตัวอย่างของฉันไม่มีตัวเลขฉันจะบอกที่นี่ว่าคุณอาจกำหนดพูดตาม#3#
ที่ถูกเข้ารหัสเป็น44344
ที่นี่
3. การขนย้ายครั้งแรก
สร้างตารางการย้ายข้อมูลโดยการเขียนK1
(จากส่วน Intermediate Keys) ตามด้วยข้อความที่เข้ารหัสจากขั้นตอนก่อนหน้านี้ในแถวที่มีความยาวเท่ากันใต้คีย์:
K1 6 10 11 0 1 5 7 9 4 8 2 3
4 0 7 0 2 0 1 2 9 3 1 2
4 4 9 6 4 8 1 9 6 3 5 4
1 1 4 0 6 2 8 3 1 4 1 6
4 7 9 8 6 9 4 4 3 4 4 2
4 2 4 2 7 1 5 8 1 2 1 7
3 4 3 6 4 8 1 8 1 2 1 2
4 9 5 4 5 1 2 7 4 0 5 9
2 2 6 2 8 4 3 5 0 2 4 2
3 2 8 8 0 1 4 8 1 8 2 2
9 4
รับคอลัมน์ตัวเลขตามลำดับหมายเลขที่เราได้รับ:
060826428 246674580 151411542 246272922 961311401 082918141
4414434239 118451234 334422028 293488758 0417249224 794943568
4. การขนย้ายครั้งที่สอง
การขนย้ายครั้งแรกค่อนข้างง่าย อย่างไรก็ตามอันนี้เป็นการขนย้ายที่หยุดชะงัก รูปแบบการหยุดชะงักจะพิจารณาจากความกว้างของตารางและคีย์ ในตัวอย่างของเราเรามี 110 หลักและ 13 คอลัมน์ซึ่งหมายความว่าเราจะมี 8 แถวเต็มและ 6 ที่เหลือ เราเริ่มกรอกข้อมูลในแถวแรก แต่หยุดที่คอลัมน์ 0 และดำเนินการดังนี้:
K2 8 7 12 2 10 9 4 5 6 0 3 1 11
0 6 0 8 2 6 4 2 8 stop at 0
2 4 6 6 7 4 5 8 0 1 continue in a triangle pattern
5 1 4 1 1 5 4 2 2 4 6
2 7 2 9 2 2 9 6 1 3 1 1
4 0 1 0 8 2 9 1 8 1 4 1 4 until the end
4 1 4 4 3 4 2 3 9 1 1 restart and stop at 1
8 4 5 1 2 3 4 3 3 4 4 2
2 0 2 8 2 9 3 4 8 8 7 5 8
0 4 1 restart and stop at 2
จากนั้นเราเติมช่องว่างสองสามสุดท้ายด้วยตัวเลขที่เหลือ
K2 8 7 12 2 10 9 4 5 6 0 3 1 11
0 6 0 8 2 6 4 2 8 7 2 4 9
2 4 6 6 7 4 5 8 0 1 2 2 4
5 1 4 1 1 5 4 2 2 4 6 7 9
2 7 2 9 2 2 9 6 1 3 1 1 4
4 0 1 0 8 2 9 1 8 1 4 1 4
4 1 4 4 3 4 2 3 9 1 1 9 4
8 4 5 1 2 3 4 3 3 4 4 2 3
2 0 2 8 2 9 3 4 8 8 7 5 8
0 4 1 5 6 8
ตอนนี้เราอ่านคอลัมน์ในแบบเดียวกับที่เราทำในการขนย้ายครั้งแรก
71431148 42711925 861904185 22614147 45499243 28261334 80218938
641701404 025244820 645224398 271283226 94944438 064214521
และแบ่งทุกอย่างออกเป็นกลุ่ม 5 หลัก:
71431 14842 71192 58619 04185 22614 14745 49924 32826 13348 02189
38641 70140 40252 44820 64522 43982 71283 22694 94443 80642 14521
5. จบข้อความ
ขั้นตอนสุดท้ายคือการแทรกตัวระบุข้อความแบบสุ่มของเรา47921
ลงในข้อความ ตัวเลขสุดท้ายของวันที่สำคัญ6
แสดงระยะทางที่กลุ่มควรมาจากจุดสิ้นสุด
71431 14842 71192 58619 04185 22614 14745 49924 32826 13348 02189 38641
70140 40252 44820 64522 43982 47921 71283 22694 94443 80642 14521
หมายเหตุสำหรับความท้าทายนี้
- คุณจะได้รับอย่างน้อยห้าอินพุต: ข้อความคำหลักตัวอักษรวลีสำคัญวันที่และหมายเลขส่วนบุคคล คุณอาจรวมสองอินพุตเพิ่มเติม: ตัวระบุข้อความแบบสุ่มและโมฆะที่จำเป็นในการวางข้อความหรือฟังก์ชันของคุณอาจสร้างตัวเลขสุ่มบางตัวด้วยตัวเอง
- คุณอาจสมมติว่าอินพุตทั้งหมดนั้นถูกต้องโดยมีจำนวนหลักและตัวอักษรที่ถูกต้อง (ตัวระบุข้อความ 5 หลักอย่างน้อย 20 หลักสำหรับวลีสำคัญและอื่น ๆ ) คุณอาจคิดว่าสายอักขระของคุณ (ข้อความและคำหลัก) ได้ลบเครื่องหมายวรรคตอนและช่องว่างทั้งหมดแล้วยกเว้นสตริงที่คุณอนุญาตในรุ่นของคุณและหมายเลขนั้นถูกแบ่งเขตด้วยสัญลักษณ์ตัวเลขแล้ว
- คำหลักแรกไม่ควรมีตัวอักษรซ้ำกันและในรหัสของคุณคุณอาจคิดว่ามันไม่มีตัวอักษรซ้ำกัน
- ภาษาที่คุณใช้ในการเข้ารหัสไม่สำคัญตราบใดที่ภาษานั้นมีมาก่อนตัวอักษรจะมีอยู่ก่อนหน้าและคุณระบุภาษาที่คุณใช้ในคำตอบของคุณ
- ไม่ว่าคุณจะใช้ตัวอักษรแบบใดสำหรับกระดานหมากรุกแบบคร่อมตัวคุณคุณสามารถเพิ่มหรือลบสัญลักษณ์เพื่อเอากระดานหมากรุกออกได้ ระบุสิ่งที่คุณใช้สัญลักษณ์เหล่านั้นสำหรับ (ตัวอย่างเช่นเครื่องหมายวรรคตอนสัญลักษณ์ "ข้อความเริ่มต้น" แยกต่างหากสัญลักษณ์สำหรับคำทั่วไป) คุณอาจนำหน้าหมายเลขทั้งหมดและสะกดตัวเลขหรือใส่ตัวเลขแต่ละหลักในกระดานหมากรุกโดยใช้ช่องที่มีสัญลักษณ์กำกับนั้นมีไว้เพื่อสิ่งอื่น โปรดระบุกระดานหมากรุกที่คุณใช้ในคำตอบของคุณ
- เอาต์พุตควรเป็นสตริงของกลุ่มห้าหลักที่คั่นด้วยช่องว่างรายการของจำนวนเต็มห้าหลักหรือสิ่งที่คล้ายกัน
- ฉันใช้การจัดทำดัชนีเป็นศูนย์และ
0123456789
ในตัวอย่างของฉัน คุณอาจใช้การจัดทำดัชนี 1 แบบ1234567890
หรือระบบอื่นในคำตอบตราบใดที่คุณระบุสิ่งที่คุณใช้
นี่คือตัวอย่างการใช้งานบน IdeoneIdeone
นี่คือโพสต์ที่ยาวนานและฉันเขียนส่วนใหญ่ด้วยมือดังนั้นหากมีชิ้นส่วนที่สับสนในโพสต์นี้หรือข้อผิดพลาดในการนับและการย้ายโปรดแจ้งให้เราทราบ ขอให้โชคดีและการเล่นกอล์ฟที่ดี!
without borrowing
และwithout carrying
? คุณหมายถึงการเพิ่มและลบตัวดัดแปลง10
เช่น(6+7) mod 10 = 3
และ(6-8) mod 10 = 8
?
adding the first two digits without adding
คุณหมายถึงการถือครอง?