Một mật mã bốn hình vuông dữ dội hơn


17

Lý lịch

Một trăm mười ba năm trước, nhà mật mã nghiệp dư Félix Delastelle đã công bố công trình của mình trên mật mã bốn hình vuông , một mật mã thay thế sơ đồ chấp nhận hai hoán vị của bảng chữ cái 25 chữ cái làm khóa và mã hóa các thông điệp bao gồm các chữ cái đó.

Giống như hầu hết các mật mã giấy bút, mật mã bốn hình vuông không có bất kỳ giá trị mật mã nào ngày nay, nhưng tại thời điểm phát minh ra nó, nó có một lợi thế đáng kể so với các đối tác chuyên khảo.

Một trăm mười ba năm sau, Alice Delastelle quyết định cải thiện mật mã bốn hình vuông bằng cách tăng kích thước của bảng chữ cái và số lượng phím. [cần dẫn nguồn]

Thiết lập khóa

Bảng chữ cái chứa các ký tự sau (bắt đầu bằng dấu cách):

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

Đưa ra một cụm từ thông qua, chúng tôi xây dựng một hoán vị của bảng chữ cái này như sau:

  1. Chỉ giữ sự xuất hiện đầu tiên của mỗi nhân vật.

  2. Nối các ký tự không sử dụng từ bảng chữ cái, theo thứ tự tự nhiên của chúng.

Sau khi biến bốn cụm mật khẩu thành bốn khóa, chúng tôi chia mỗi phím thành một hình vuông có chiều dài cạnh 7 và sắp xếp bốn ô vuông kết quả sao cho chúng tạo thành một hình vuông lớn.

Ví dụ: nếu các cụm từ được

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

các phím sẽ được xây dựng và sắp xếp như thế này:

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

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

Mã hóa

Đưa ra một thông điệp rõ ràng như

ALICE LOVES BOB.

chúng tôi nối 0 hoặc 1 khoảng trắng để tạo độ dài cho nó chẵn và chia nó thành các cặp ký tự:

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

Đối với mỗi cặp ký tự, chúng tôi định vị ký tự đầu tiên trong ô vuông đầu tiên (thứ tự đọc) và ký tự thứ hai trong thứ tư.

Sau đó, chúng tôi chọn các ký tự trong các ô vuông còn lại sao cho bốn ký tự được chọn tạo thành một hình chữ nhật có các cạnh song song với các cạnh của hình vuông.

Cuối cùng, chúng tôi thay thế cặp ký tự bằng các ký tự được chọn của hình vuông thứ hai và thứ ba.

Đối với chuỗi ví dụ của chúng tôi, điều này mang lại

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

dẫn đến bản mã sau:

PPA@E YTZEEH=T<-

Bài tập

Viết chương trình hoặc hàm chấp nhận bốn cụm từ thông qua và một bản rõ, sử dụng biến thể trên của mật mã bốn hình vuông để mã hóa nó và trả về bản mã kết quả.

Chi tiết:

  • Năm chuỗi đầu vào sẽ chỉ bao gồm các ký tự của bảng chữ cái được đề cập.

  • Năm chuỗi đầu vào có thể được đọc theo bất kỳ thứ tự nào, như vậy, một chuỗi đơn được phân tách bằng các dòng mới hoặc dưới dạng một mảng gồm năm chuỗi.

  • Bạn có thể cho rằng không có chuỗi nào trống.

  • Đầu ra phải là một chuỗi đơn.

    Nếu bạn chọn in đầu ra thành STDOUT, bạn chỉ có thể in các ký tự của bản mã và (tùy chọn) một dòng mới.

  • Luật tiêu chuẩn được áp dụng.

Các trường hợp thử nghiệm

Trong tất cả các trường hợp thử nghiệm, bốn chuỗi đầu tiên tương ứng với các ô vuông chính theo thứ tự đọc và chuỗi đầu vào cuối cùng cho bản rõ.

Đầu vào

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

Đầu ra

PPA@E YTZEEH=T<-

Đầu vào

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

Đầu ra

LALLR)#TROKE !

Đầu vào

,'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!

Đầu ra

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

Đầu vào

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

Đầu ra

GOOD LUCK, HAVE FUN.

Câu trả lời:


4

CJam, 52 50 49 47 46 44 byte

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

Thứ tự đầu vào là dòng 5, 2, 3, 1, 4. Hãy thử trực tuyến .

(-1 byte nhờ @ MartinBüttner, -2 byte nhờ @Dennis)

Giải trình

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

Đối với các chỉ số, chúng tôi muốn hoán đổi các chữ số có nghĩa nhỏ nhất, cơ sở 7. Ví dụ, ví dụ đầu tiên ALlà các chỉ số 47trong các khóa 1 và 4 tương ứng. Trong cơ sở 7, đây là [0 4][1 0]. Hoán đổi các chữ số có nghĩa ít nhất cho [0 0][1 4], tức là 011, và điều này tương ứng với PPtrong các phím 2 và 3 tương ứng.

Tuy nhiên, thay vì chuyển đổi cơ sở, mã thực hiện như sau:

[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 byte

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

Có lẽ có thể được tối ưu hóa rất nhiều. Tôi sử dụng rất nhiều nén.

Đưa đầu vào theo thứ tự sau:

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

Tôi có thể ăn cắp ý tưởng đặt hàng đầu vào của bạn?
Maltysen

@Maltysen Chắc chắn.
orlp

4

Pyth - 88 86 83 78 76 75 72 byte

8 byte được lưu nhờ @orlp .

Chờ quá lâu, tôi khá không hài lòng với điều này, nhưng chỉ đăng nó trong khi tôi tìm cách tốt hơn để xử lý các ô vuông.

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

Hãy thử trực tuyến tại đây .


Bạn có thể thay thế c+e.z*%le.z2d2bằng C.tce.z2d. Đừng hỏi :)
orlp
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.