Cipher empat persegi yang lebih ganas

17

Latar Belakang

Seratus tiga belas tahun yang lalu, kriptografi amatir Félix Delastelle menerbitkan karyanya pada cipher empat-persegi , sebuah cipher substitusi digrafik yang menerima dua permutasi alfabet 25-huruf sebagai kunci dan menyandikan pesan yang terdiri dari huruf-huruf itu.

Seperti kebanyakan cipher pena-dan-kertas, cipher empat-persegi tidak memiliki nilai kriptografi saat ini, tetapi pada saat penemuannya, cipher memiliki keunggulan yang signifikan dibandingkan dengan rekan-rekan monografinya.

Seratus tiga belas tahun kemudian, Alice Delastelle memutuskan untuk memperbaiki sandi empat persegi dengan meningkatkan ukuran alfabet dan jumlah kunci. [rujukan?]

Pengaturan kunci

Alfabet berisi karakter-karakter berikut (dimulai dengan spasi):

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

Diberikan frasa sandi, kami membuat permutasi alfabet ini sebagai berikut:

  1. Pertahankan hanya kemunculan pertama setiap karakter.

  2. Tambahkan karakter yang tidak digunakan dari alfabet, sesuai urutan aslinya.

Setelah mengubah empat frasa sandi menjadi empat kunci, kami membagi setiap kunci menjadi kuadrat dengan panjang sisi 7 dan mengatur empat kuadrat yang dihasilkan sehingga membentuk satu kuadrat besar.

Misalnya, jika frasa aksesnya adalah

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

kunci akan dibangun dan diatur seperti ini:

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

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

Enkripsi

Diberikan pesan teks biasa seperti

ALICE LOVES BOB.

kami menambahkan 0 atau 1 spasi untuk membuat panjangnya menjadi rata dan membaginya menjadi pasangan karakter:

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

Untuk setiap pasangan karakter, kami menemukan karakter pertama di kuadrat pertama (urutan membaca) dan yang kedua di keempat.

Kemudian, kita memilih karakter dalam kotak yang tersisa sehingga empat karakter yang dipilih membentuk persegi panjang yang sisi-sisinya sejajar dengan sisi kotak.

Akhirnya, kami mengganti pasangan karakter dengan karakter yang dipilih dari kotak kedua dan ketiga.

Untuk string contoh kami, ini menghasilkan

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

menghasilkan ciphertext berikut:

PPA@E YTZEEH=T<-

Tugas

Tulis sebuah program atau fungsi yang menerima empat frasa sandi dan plaintext, gunakan varian cipher empat-persegi di atas untuk mengenkripsi dan mengembalikan ciphertext yang dihasilkan.

Detail:

  • Lima string input hanya akan terdiri dari karakter alfabet yang disebutkan.

  • Lima string input dapat dibaca dalam urutan apa pun, dengan demikian, string tunggal dibatasi oleh baris baru atau sebagai array dari lima string.

  • Anda dapat mengasumsikan bahwa tidak ada string yang kosong.

  • Output harus berupa string tunggal.

    Jika Anda memilih untuk mencetak output ke STDOUT, Anda hanya dapat mencetak karakter-karakter dari ciphertext dan (secara opsional) sebuah baris tambahan.

  • Aturan standar berlaku.

Uji kasus

Dalam semua kasus uji, empat string pertama sesuai dengan kotak kunci dalam urutan membaca dan string input terakhir ke teks biasa.

Memasukkan

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

Keluaran

PPA@E YTZEEH=T<-

Memasukkan

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

Keluaran

LALLR)#TROKE !

Memasukkan

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

Keluaran

#>TE,VK+,ZQ(&<[email protected]@DM%NAC&>

Memasukkan

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

Keluaran

GOOD LUCK, HAVE FUN.
Dennis
sumber

Jawaban:

4

CJam, 52 50 49 47 46 44 byte

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

Urutan input adalah garis 5, 2, 3, 1, 4. Cobalah online .

(-1 byte terima kasih kepada @ MartinBüttner, -2 byte terima kasih kepada @Dennis)

Penjelasan

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

Untuk indeks, kami ingin menukar angka yang paling tidak signifikan, basis 7. Misalnya, untuk contoh pertama ALadalah indeks 4dan7 masing-masing dalam kunci 1 dan 4. Di base 7, ini [0 4]dan [1 0]. Menukar angka paling signifikan memberi [0 0]dan [1 4], yaitu 0dan 11, dan ini sesuai dengan Pdan Pdalam kunci 2 dan 3 masing-masing.

Namun, alih-alih konversi basis, kode melakukan hal berikut:

[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)
Sp3000
sumber
6

Pyth, 74 71 byte

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

Mungkin bisa dioptimalkan banyak. Saya menggunakan a banyak zip.

Mengambil input dengan urutan sebagai berikut:

ALICE LOVES BOB.
PROGRAMMING PUZZLES & CODE GOLF
DON'T TELL EVE!!!
POPULARITY CONTESTS & CODE BOWLING
CORRECT HORSE BATTERY STAPLE
orlp
sumber
Bisakah saya mencuri ide pesanan input Anda?
Maltysen
@Maltysen Tentu.
orlp
4

Pyth - 88 86 83 78 76 75 72 byte

8 byte disimpan berkat @orlp .

Waaay terlalu lama, saya sangat tidak senang dengan ini, tetapi hanya mempostingnya sementara saya mencari cara yang lebih baik untuk menangani kotak.

Jm+oxdN{d-+d-CMr33 91`MTd.zsms@VtPJ,+*7hKs.DR7xV,hJeJdeK+*7@[email protected]

Cobalah online di sini .

Maltysen
sumber
Anda bisa menggantinya c+e.z*%le.z2d2dengan C.tce.z2d. Jangan tanya :)
orlp