그만큼 VIC 암호는 지금까지 고안된 가장 복잡 연필과 종이 암호 중 하나입니다. 코드 명 "VICTOR"인 소련 스파이 Reino Häyhänen이 1950 년대에 사용했던 주요 원칙은 난독 화를 통한 보안입니다. 많은 난독의.
당신의 임무는 메시지를 받아 VIC 암호를 사용하여 인코딩 할 프로그램이나 함수를 작성하는 것입니다. 나는 또한 여기에 VIC 암호 디코더 챌린지를 게시했습니다 . 다음 지시 사항이 명확하지 않은 경우 주저하지 말고 의견을 제시하십시오. 지침은 이 사이트에서 적용됩니다 .
VIC 암호 인코딩
예비
다섯 개의 입력이 필요합니다 :
- 평문 메시지
- 귀하의 언어에서 가장 일반적인 글자를 포함하는 짧은 키워드 또는 문구
- 따옴표 나 노래의 줄과 같은 핵심 문구 (최소 20 자)
- 날짜 (또는 6 자리 이상의 다른 숫자)
- 개인 상담원 번호
실제로,이 마지막 네 개는 발신자 또는 수신자의 에이전트 번호가 인코딩에 사용되는지 여부를 포함하여 발신자와 수신자가 미리 합의해야합니다.
내 메시지 예는 다음과 같습니다. 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의 인용입니다. "첫 번째 원칙은 당신이 스스로를 속이지 않아야한다는 것입니다. 그리고 당신은 가장 쉬운 사람입니다."
날짜로 2016 년 7 월 31 일을 형식으로 사용합니다 3172016
)을 사용합니다.이 설명은이 설명을 쓴 날입니다.
내가 선택한 개인 번호는 9
입니다.
단계 요약
- 다음 단계에서 사용할 중간 키를 파생하십시오.
- 스 트래들 링 바둑판을 구성하고 적용하십시오.
- 첫 번째 조옮김 테이블을 구성하고 적용하십시오.
- 두 번째 (중단 된) 전치 테이블을 구성하고 적용하십시오.
- 메시지 표시기 그룹을 삽입하여 메시지를 마무리하십시오.
서브 메커니즘
우리가 문제의 고기에 들어가기 전에 설명해야 할 두 가지 : 연쇄 추가 및 연속 과정.
지연 피보나치 생성기라고도하는 체인 추가는 시작 숫자 시퀀스를 수행하고, 캐리지없이 처음 두 자리 숫자를 더한 다음 (함께 추가 한 다음 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. 중간 키
(10)의 두 그룹으로 키 구문의 처음 20 개 문자를 분할하고 우리가 호출하는, 개별적으로 각각 sequentialize S1
하고 S2
.
THEFIRSTPR
S1: 8201357946
INCIPLEIST
S2: 2603751489
임의의 5 자리 메시지 식별자를 선택하십시오 M
(원하는 경우 입력 중 하나 일 수 있음).
M = 47921
(빼기 차입하지 않고, 빼기 mod 10
) 키 날짜의 처음 다섯 자리 3172016
에서를 M
:
M 47921
date - 31720
= 16201
체인은 10 자리가 될 때까지 결과를 추가합니다 :
1620178218
이러한 숫자를 추가 S1
운반하거나하지 않고 mod 10
, 얻을 G
:
1620178218
S1 + 8201357946
G = 9821425154
위 S2
의 순서 0123456789를 작성하십시오. 순서 0123456789에서 각 숫자를 찾아서 G
바로 아래의 숫자로 바꾸십시오 S2
. 결과는 T
입니다.
0123456789
S2 2603751489
G 9821425154
T 9806705657
체인 추가를 사용 T
하여 60 자리 로 확장하십시오 .
9806705657
becomes
980670565778637511245490262369939288595822106344304316978734
이 마지막 50 자리 숫자 (각 10 자리 숫자의 5 행)가 U
블록을 형성합니다 .
T 9806705657
U 7863751124
5490262369
9392885958
2210634430
4316978734
U
블록 의 마지막 두 자리수가 아닌 숫자 는 개별적으로 에이전트의 개인 번호에 추가되어 두 전치의 너비를 제공합니다.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
첫 번째 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. 스 트래들 링 체커 보드
먼저, 체커 보드 예제를 제공 한 다음이를 생성하는 원리를 설명하겠습니다.
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
다른 행은 원하는 순서대로 알파벳의 나머지 부분입니다. 필자의 경우, 나머지 라틴 알파벳, 문장 부호 .
및 숫자 구분 기호로 바둑판을 채웠다 #
. 기본적으로 바둑판은 멋진 대체 암호입니다. 예를 들어 "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 자리 숫자이므로 "4"라는 하나의 null을 추가합니다.
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
(중간 키 섹션에서) 기록한 다음 이전 단계의 인코딩 된 메시지를 키 아래에 같은 길이의 행으로 작성하여 전치 테이블을 작성 하십시오.
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 개의 입력이 제공됩니다. 임의의 메시지 식별자와 메시지를 채우는 데 필요한 널 (null) 인 두 개의 추가 입력을 포함 할 수 있습니다. 그렇지 않으면 함수가 자체적으로 임의의 숫자를 생성 할 수 있습니다.
- 올바른 숫자와 문자 수 (5 자리 메시지 식별자, 키 구문의 경우 최소 20 자리 등)와 함께 모든 입력이 유효하다고 가정 할 수 있습니다. 문자열 (메시지 및 키워드)에 버전에서 허용 된 문자열을 제외한 모든 구두점과 공백이 이미 제거되었으며 숫자에 이미 숫자가 표시되어 있다고 가정 할 수 있습니다.
- 첫 번째 키워드에는 중복 문자가 없어야하며 코드에서는 중복 문자가 없다고 가정 할 수 있습니다.
- 인코딩하는 데 사용하는 언어는 언어가 이미 존재하고 알파벳이 이미 존재하고 응답에 사용할 언어를 지정하는 한 중요하지 않습니다.
- 스 트래들 링 바둑판에 어떤 알파벳을 사용하든, 바둑판을 채우기 위해 기호를 추가하거나 제거 할 수 있습니다. 사용하는 기호를 지정하십시오 (예 : 문장 부호, 별도의 "메시지 시작"기호, 일반적인 단어 기호). 숫자 기호가 다른 것을위한 슬롯을 사용하여 숫자 기호를 완전히 버리고 숫자를 철자하거나 바둑판에 각 숫자를 포함시킬 수 있습니다. 답변에 사용한 바둑판을 지정하십시오.
- 출력은 공백으로 구분 된 5 자리 그룹 문자열, 5 자리 정수 목록 또는 이와 유사한 형식이어야합니다.
- 제로 인덱싱과
0123456789
예제를 사용했습니다. 사용한 것을 지정하면 1- 인덱싱 및1234567890
또는 다른 시스템을 사용할 수 있습니다.
다음은 Ideone의 구현 예입니다. 입니다.
이 글은 긴 글이며 수작업으로 작성 했으므로이 글에 혼란스러운 부분이 있거나 계산 및 조옮김에 오류가있는 경우 알려주십시오. 행운과 좋은 골프!
without borrowing
와 without carrying
? 당신에게 평균 추가 및 빼기 모드 수행 10
, 즉 (6+7) mod 10 = 3
와 (6-8) mod 10 = 8
?
adding the first two digits without adding
운반을 의미합니까?