เลขศูนย์สี่ตารางที่รุนแรงขึ้น


17

พื้นหลัง

หนึ่งร้อยสิบสามปีก่อนนักเขียนรหัสวิทยาการFélix Delastelle ตีพิมพ์ผลงานของเขาบนเลขศูนย์สี่สี่เหลี่ยมซึ่งเป็นเลขแทนเลขฐานสิบหกที่ยอมรับการเรียงสับเปลี่ยนของตัวอักษร 25 ตัวเป็นกุญแจและเข้ารหัสข้อความที่ประกอบด้วยตัวอักษรเหล่านั้น

เช่นเดียวกับ ciphers แบบปากกาและกระดาษส่วนใหญ่รหัสสี่ตารางไม่มีค่าการเข้ารหัสใด ๆ ในวันนี้ แต่ในเวลาที่มีการประดิษฐ์

หนึ่งร้อยสิบสามปีต่อมาอลิซเดลาสเตลเลตัดสินใจที่จะปรับปรุงเลขศูนย์สี่สี่เหลี่ยมโดยการเพิ่มขนาดตัวอักษรและจำนวนของปุ่ม [ต้องการอ้างอิง]

การตั้งค่าคีย์

ตัวอักษรมีอักขระดังต่อไปนี้ (เริ่มต้นด้วยเว้นวรรค):

 !"#$%&'()*+,-./:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ

ได้รับวลีรหัสผ่านเราสร้างการเรียงสับเปลี่ยนของตัวอักษรนี้ดังนี้:

  1. เก็บเฉพาะการเกิดขึ้นครั้งแรกของตัวละครแต่ละตัว

  2. ผนวกอักขระที่ไม่ได้ใช้จากตัวอักษรตามลำดับโดยธรรมชาติ

หลังจากเปลี่ยนวลีรหัสผ่านสี่ชุดเป็นสี่ปุ่มเราแบ่งแต่ละคีย์เป็นรูปสี่เหลี่ยมจัตุรัสยาว 7 และจัดเรียงสี่เหลี่ยมที่เกิดขึ้นทั้งสี่เพื่อให้เกิดเป็นรูปสี่เหลี่ยมจัตุรัสขนาดใหญ่

ตัวอย่างเช่นหากวลีรหัสผ่านเป็น

PROGRAMMING PUZZLES & CODE GOLF
POPULARITY CONTESTS & CODE BOWLING
CORRECT HORSE BATTERY STAPLE
DON'T TELL EVE!!!

กุญแจจะถูกสร้างและจัดเรียงเช่นนี้:

PROGAMI  POULARI
N UZLES  TY CNES
&CDF!"#  &DBWG!"
$%'()*+  #$%'()*
,-./:;<  +,-./:;
=>?@BHJ  <=>?@FH
KQTVWXY  JKMQVXZ

CORET H  DON'T E
SBAYPL!  LV!"#$%
"#$%&'(  &()*+,-
)*+,-./  ./:;<=>
:;<=>?@  ?@ABCFG
DFGIJKM  HIJKMPQ
NQUVWXZ  RSUWXYZ

การเข้ารหัสลับ

รับข้อความธรรมดาเช่น

ALICE LOVES BOB.

เราผนวก 0 หรือ 1 ช่องว่างเพื่อทำให้ความยาวเท่ากันและแยกเป็นคู่อักขระ:

["AL" "IC" "E " "LO" "VE" "S " "BO" "B."]

สำหรับคู่อักขระแต่ละตัวเราจะค้นหาอักขระตัวแรกในตารางแรก (ลำดับการอ่าน) และตัวที่สองในสี่

จากนั้นเราเลือกตัวละครในช่องสี่เหลี่ยมที่เหลือเพื่อให้ตัวละครทั้งสี่ที่เลือกนั้นเป็นสี่เหลี่ยมมุมฉากซึ่งด้านข้างขนานกับด้านข้างของช่องสี่เหลี่ยม

ในที่สุดเราจะแทนที่คู่อักขระด้วยอักขระที่เลือกของช่องสี่เหลี่ยมที่สองและสาม

สำหรับสตริงตัวอย่างของเราผลตอบแทนนี้

["PP" "A@" "E " "YT" "ZE" "EH" "=T" "<-"]

ส่งผลให้ไซเฟอร์เท็กซ์ต่อไปนี้:

PPA@E YTZEEH=T<-

งาน

เขียนโปรแกรมหรือฟังก์ชั่นที่ยอมรับวลีรหัสผ่านสี่คำและข้อความธรรมดาใช้ตัวแปรข้างต้นของตัวเลขสี่ตารางเพื่อเข้ารหัสและส่งกลับค่าตัวเลขที่ได้

รายละเอียด:

  • สตริงอินพุตห้ารายการจะประกอบด้วยอักขระที่เป็นตัวอักษรที่กล่าวถึงเท่านั้น

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

  • คุณอาจคิดว่าไม่มีสตริงว่างเปล่า

  • ผลลัพธ์จะต้องเป็นสตริงเดียว

    หากคุณเลือกที่จะพิมพ์ผลลัพธ์ไปยัง STDOUT คุณสามารถพิมพ์เฉพาะอักขระของ ciphertext และ (เป็นทางเลือก) ขึ้นบรรทัดใหม่

  • ใช้กฎมาตรฐานของ

กรณีทดสอบ

ในกรณีทดสอบทั้งหมดสี่สตริงแรกนั้นสอดคล้องกับสแควร์คีย์ในลำดับการอ่านและสตริงอินพุตสุดท้ายกับเท็กซ์

อินพุต

PROGRAMMING PUZZLES & CODE GOLF
POPULARITY CONTESTS & CODE BOWLING
CORRECT HORSE BATTERY STAPLE
DON'T TELL EVE!!!
ALICE LOVES BOB.

เอาท์พุต

PPA@E YTZEEH=T<-

อินพุต

 !"#$%&'()*+,-./:;<=>
 !"#$%&'()*+,-./:;<=>?@ABCDE
 !"#$%&'()*+,-./:;<=>?@ABCDEFGHIJKL
 !"#$%&'()*+,-./:;<=>?@ABCDEFGHIJKLMNOPQRS
HELLO, WORLD! 

เอาท์พุต

LALLR)#TROKE !

อินพุต

,'K AB-Q=?@("W$>XM).C#<I:G!OLP*+;SZJTU%NED/&VFHRY
:,-D$C<SU=IYHFVA;! JG/M&L+WT%#.Q@(N*R")EZOBKX?'>P
L()JX,BND?Z<>P*FU%=O@&KIC+A!Y:;$SWHR.EMG'/T"QV #-
<->CI")AP Q:+U;O/F(KH&ER!MW?X'VJLZ#.$,BSGN@TD%*Y=
SPIN THE PPCG WHEEL OF BLAME!

เอาท์พุต

#>TE,VK+,ZQ(&<F@RA.NL@DM%NAC&>

อินพุต

& %(,-#)$@?/=>'*"<:;!.+
=/$- ?;',@#!(&<")%.:>+*
&%-/<?.;$'#:=!( ,>"+*)@
=,<-*?#.'@/;>%!+:(& ")$
HNRA#JX$H %JAV+"GTS,

เอาท์พุต

GOOD LUCK, HAVE FUN.

คำตอบ:


4

CJam, 52 50 49 47 46 44 ไบต์

l2/qN/'[,32>A,s-f|2/f{~@S+2<.#_7f%_W%.m.m.=}

5, 2, 3, 1, 4ลำดับการป้อนข้อมูลเป็นเส้น ลองมันออนไลน์

(-1 ไบต์ขอบคุณ @ MartinBüttner, 2 ไบต์ขอบคุณ @Dennis)

คำอธิบาย

l2/           Read the message and split into chunks of 2
qN/           Read rest of input and split by newlines (pass phrases)
'[,32>        Generate " !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ"
A,s-          Remove digits 0123456789
f|            Setwise OR with each pass phrase to remove duplicates, giving keys
2/            Split keys into two pairs
f{ ... }      For each message chunk...
  ~             Unwrap key pairs
  @S+2<         Add a space to the message chunk then cap to length 2
  .#            Find the two chars in keys 1, 4
  _7f%          Copy indices and perform modulo 7 on both
  _W%           Copy and reverse
  .m.m          Vectorised subtraction twice
  .=            Apply both indices to keys 2, 3

สำหรับดัชนีเราต้องการสลับตัวเลขที่สำคัญน้อยที่สุดคือฐาน 7 ตัวอย่างเช่นสำหรับตัวอย่างแรกALคือดัชนี4และ7ในคีย์ 1 และ 4 ตามลำดับ ในฐานที่ 7 นี้เป็นและ[0 4] [1 0]สลับเลขนัยสำคัญน้อยให้[0 0]และ[1 4]เช่น0และ11และสอดคล้องนี้PและPในคีย์ที่ 2 และ 3 ตามลำดับ

อย่างไรก็ตามแทนที่จะเป็นการแปลงฐานรหัสจะทำสิ่งต่อไปนี้:

[4 7]     A: Initial indices
[4 0]     B: Indices mod 7
[0 4]     C: Reverse of B

[4 -4]    B-C
[0 11]    A-(B-C)

6

Pyth, 74 71 ไบต์

L+%eb7*7/hb7Jcms+oxdN{d--CMr33 91`MTd.z2ssm@VeJ,ydy_dCmxLhdedC,hJ.tcz2d

อาจจะปรับให้เหมาะสมมาก ผมใช้จำนวนมากของซิป

รับอินพุตตามลำดับต่อไปนี้:

ALICE LOVES BOB.
PROGRAMMING PUZZLES & CODE GOLF
DON'T TELL EVE!!!
POPULARITY CONTESTS & CODE BOWLING
CORRECT HORSE BATTERY STAPLE

ฉันสามารถขโมยแนวคิดคำสั่งซื้อของคุณได้หรือไม่?
Maltysen

@ Maltysen แน่นอน
orlp

4

Pyth - 88 86 83 78 76 75 72 ไบต์

8 ไบต์บันทึกขอบคุณที่ @orlp

Waaay ยาวเกินไปฉันค่อนข้างแฮปปี้กับเรื่องนี้ แต่เพิ่งโพสต์มันในขณะที่ฉันมองหาวิธีที่ดีกว่าในการจัดการกับสี่เหลี่ยม

Jm+oxdN{d-+d-CMr33 91`MTd.zsms@VtPJ,+*7hKs.DR7xV,hJeJdeK+*7@K2@K1C.tcz2d

ลองมันออนไลน์ได้ที่นี่


คุณสามารถแทนที่ด้วยc+e.z*%le.z2d2 C.tce.z2dอย่าถาม :)
orlp
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.