치열한 4 제곱 암호


17

배경

100 년 전과 13 년 전, 아마추어 암호 학자 인 펠릭스 델라 스텔 (Félix Delastelle) 은 25 자 알파벳의 두 순열을 키로 사용하고 그 문자로 구성된 메시지를 인코딩하는 이진 대체 암호 인 4 제곱 암호 에 관한 그의 작품을 발표했습니다 .

대부분의 펜 앤 페이퍼 암호와 마찬가지로, 4 제곱 암호는 오늘날 암호화 값이 없지만 발명 당시에는 단조 암호에 비해 상당한 이점이있었습니다.

100 년 후, 13 년 후 Alice Delastelle은 알파벳 크기와 키 수를 늘려서 4 제곱 암호를 개선하기로 결정했습니다. [인용 필요]

키 설정

알파벳에는 다음 문자가 포함됩니다 (공백으로 시작).

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

암호 문구가 주어지면 다음과 같이이 알파벳의 순열을 구성합니다.

  1. 각 문자의 첫 번째 항목 만 유지하십시오.

  2. 알파벳에서 사용하지 않는 문자를 자연 순서대로 추가하십시오.

4 개의 패스 프레이즈를 4 개의 키로 전환 한 후, 각 키를 측면 길이 7의 정사각형으로 나누고 4 개의 정사각형을 배열하여 하나의 큰 정사각형을 형성합니다.

예를 들어 암호 문구가

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

직무

4 개의 암호문과 평문을 허용하고 위의 4 제곱 암호 변형을 사용하여이를 암호화하고 결과 암호문을 리턴하는 프로그램 또는 함수를 작성하십시오.

세부:

  • 5 개의 입력 문자열은 언급 된 알파벳의 문자로만 구성됩니다.

  • 5 개의 입력 문자열은 줄 바꿈으로 구분 된 단일 문자열 또는 5 개의 문자열 배열과 같이 임의의 순서로 읽을 수 있습니다.

  • 빈 문자열이 없다고 가정 할 수 있습니다.

  • 출력은 단일 문자열이어야합니다.

    출력을 STDOUT으로 인쇄하도록 선택한 경우 암호 텍스트의 문자와 후행 줄 바꿈 (선택 사항) 만 인쇄 할 수 있습니다.

  • 표준 규칙이 적용됩니다.

테스트 사례

모든 테스트 사례에서 처음 4 개의 문자열은 읽기 순서의 키 제곱에 해당하고 마지막 입력 문자열은 일반 텍스트에 해당합니다.

입력

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.=}

입력 순서는 lines 5, 2, 3, 1, 4입니다. 온라인으로 사용해보십시오 .

(@ MartinBüttner 덕분에 1 바이트, @Dennis 덕분에 -2 바이트)

설명

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경우 인덱스 47키 1과 4가 각각 있습니다. 베이스 (7)에서,이다 [0 4]하고 [1 0]. 최하위 자리를 스와핑 제공 [0 0]하고 [1 4], 즉, 011, 그리고이 대응 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 바이트

@orlp 덕분에 8 바이트가 절약되었습니다 .

너무 오래, 나는 이것에 대해 꽤 불행하지만, 사각형을 다루는 더 좋은 방법을 찾는 동안 그것을 게시하는 것입니다.

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

여기에서 온라인으로 사용해보십시오 .


당신은 대체 할 수 있습니다 c+e.z*%le.z2d2C.tce.z2d. 묻지마 :)
orlp
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.