VIC шифр є одним з найскладніших і олівцевих паперових шифрів коли - або придумані. Використовуваний у 1950-х роках радянським шпигуном Рейно Хяйянен, кодований під назвою "ВІКТОР", його головний принцип - безпека шляхом омертвіння; багато заплутування.
Ваше завдання - написати програму або функцію, яка прийме повідомлення та кодує його за допомогою шифру VIC. Тут я також розмістив виклик декодера VIC . Якщо будь-яка з наведених нижче інструкцій нечітка, не соромтеся запитати про них у коментарях. Інструкції адаптовані з цього сайту .
Кодування шифру VIC
Підготовка
Вам знадобиться п'ять входів:
- повідомлення в простому тексті
- коротке ключове слово або фразу, що містить найпоширеніші букви у вашій мові
- ключова фраза, наприклад, цитата або рядок із пісні (принаймні 20 символів)
- дата (або інше число, що становить шість цифр або більше)
- номер особистого агента
На практиці ці останні чотири повинні бути попередньо узгоджені відправником та одержувачем, включаючи, чи використовується номер коду відправника або одержувача в кодуванні.
Моє приклад повідомлення буде: We are discovered. Take what you can. Burn everything else. Move to Safehouse Foxtrot 3.
Ми будемо кодувати англійською мовою (хоча ви можете використовувати будь-яку мову та алфавіт), а також найпоширеніші букви англійського алфавіту A, E, I, N, O, R, S, T
. Я буду використовувати ключове слово SENATORI
.
Моя ключова фраза - це цитата Річарда Фейнмана: "Перший принцип полягає в тому, що ви не повинні обманювати себе - і ви найпростіша людина, яка обдурить".
В якості дати я використаю 31 липня 2016 року (у форматі 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. Проміжні ключі
Розділити перші 20 букв ключової фрази на дві групи по 10 і sequentialize кожного по окремості, яку ми будемо називати S1
і S2
.
THEFIRSTPR
S1: 8201357946
INCIPLEIST
S2: 2603751489
Виберіть випадковий 5-значний ідентифікатор повідомлення M
(це може бути одним із вхідних даних, якщо вам зручніше):
M = 47921
Відняти, без запозичення (віднімання mod 10
), перші п'ять цифр ключа дати 3172016
від M
:
M 47921
date - 31720
= 16201
Ланцюжок додайте результат, поки у вас немає десяти цифр:
1620178218
Додайте ці цифри до S1
, не несучи або mod 10
, щоб отримати G
:
1620178218
S1 + 8201357946
G = 9821425154
Вище S2
запишіть послідовність 0123456789. Знайдіть кожну цифру G
у послідовності 0123456789 та замініть її цифрою безпосередньо під нею S2
. Результат - T
.
0123456789
S2 2603751489
G 9821425154
T 9806705657
Використовуйте додавання ланцюга, щоб розгорнути його T
до 60 цифр.
9806705657
becomes
980670565778637511245490262369939288595822106344304316978734
Ці останні 50 цифр, в п'ять рядків по десять цифр кожен, утворюють U
блок.
T 9806705657
U 7863751124
5490262369
9392885958
2210634430
4316978734
Останні дві нерівні цифри U
блоку індивідуально додаються до персонального номера агента, щоб дати ширину двох транспозицій, p
і q
.
9 + 3 = 12 (p, перша ширина транспозиції) 9 + 4 = 13 (q, друга ширина транспозиції)
Sequentialize 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, ми додаємо кілька нульових символів, щоб залишити повідомлення. У нашому повідомленні довжина 109 цифр, тому я додам одну нуль: "4".
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-значний ідентифікатор повідомлення, принаймні 20 цифр для ключової фрази тощо). Ви можете припустити, що у ваших рядках (повідомленні та ключових словах) вже були видалені всі пунктуаційні знаки та пробіли, за винятком тих, які ви дозволяєте у своїй версії, і ці числа вже розмежовані знаками цифр.
- Перше ключове слово не повинно містити дублікатів букв, а у вашому коді ви можете припустити, що воно ніколи не має дублікатів літер.
- Мова, яку ви використовуєте для кодування, не має значення, доки мова існує, алфавіт є попереднім, і ви вказуєте, якою мовою ви користуєтесь у своїй відповіді.
- Незалежно від алфавіту, який ви використовуєте для вашої шахматної дошки, ви можете додавати або видаляти символи, щоб виклеїти шахматну дошку. Вкажіть, для чого ви використовуєте ці символи (наприклад, розділові знаки, окремий символ "Почніть повідомлення", символи для загальних слів). Ви можете повністю відмовитись від знака цифри і прописати цифри або включити кожну цифру в шахму, використовуючи слот, де знаком цифри було щось інше. Укажіть, яку шахівницю ви використали у своїй відповіді.
- Вихід повинен бути або рядком п'ятизначних груп, розділених пробілом, списком п'ятизначних цілих чисел, або чимось подібним.
- Я використовував нульову індексацію і
0123456789
в своєму прикладі. Ви можете використовувати1234567890
у своїй відповіді 1-індексування та чи іншу систему, поки ви вкажете, що використовували.
Ось приклад реалізації на Ideone .
Це довгий пост, і я написав більшу частину його вручну, тому, якщо в цій публікації є якісь заплутані частини або помилки в моєму підрахунку та перенесенні, будь ласка, повідомте мене про це. Успіхів і хорошого гольфу!
without borrowing
і without carrying
? Ви маєте на увазі додавання і віднімання моди 10
, тобто (6+7) mod 10 = 3
і (6-8) mod 10 = 8
?
adding the first two digits without adding
Ви маєте на увазі перенесення?