Введение

Машина «Энигма», культовое устройство шифрования, использовавшееся во время Второй мировой войны, сыграло решающую роль в обеспечении безопасной связи. Его сложность и криптографическая сила сделали его грозным инструментом для немецких вооруженных сил. Взлом шифрования «Энигмы» стал серьезной проблемой для союзных войск, и их окончательный успех в расшифровке сообщений считается поворотным моментом в войне.

Машина «Энигма» состояла из серии роторов, коммутационной панели и отражателя. Роторы, отвечающие за замену букв, были основой механизма шифрования машины. Каждый ротор имел уникальную конфигурацию проводки, которая создавала сложные сопоставления между входными и выходными буквами. Роторы вращались после каждого нажатия клавиши, что еще больше усложняло процесс шифрования и повышало его криптографическую стойкость.

Понимание внутренней работы машины «Энигма» и воспроизведение ее функциональности позволяют нам оценить замечательную инженерную работу этого устройства шифрования. Используя матричные операции, мы можем изучить, как можно эмулировать сложные процессы «Энигмы», и получить представление о математических основах шифрования.

Чтобы понять, как устроена эта машина, рекомендую посмотреть это видео: https://www.youtube.com/watch?v=G2_Q9FoD-oQ&t=0s

Функции ротора с использованием метрик

В машине «Энигма» использовалась серия роторов для шифрования входного текста. Каждый ротор имел уникальную конфигурацию проводки, что создавало сложную замену букв. Кроме того, роторы вращались после каждого нажатия клавиши, что еще больше усложняло процесс шифрования.

Чтобы воспроизвести функции ротора с помощью матричных операций, мы можем представить конфигурацию проводки в виде матрицы перестановок. Давайте рассмотрим пример с единичной матрицей 6x6 (в идеале для всех 26 букв нам нужны метрики 26*26, но для всех примеров ниже я беру более простой случай 6*6):

|1 0 0 0 0 0| * | 1 0 0 0 0 0 | = |1 0 0 0 0 0 |
                | 0 1 0 0 0 0 | 
                | 0 0 1 0 0 0 | 
                | 0 0 0 1 0 0 | 
                | 0 0 0 0 1 0 | 
                | 0 0 0 0 0 1 |

In this case, the matrix represents a rotor with no substitution. 
In other words, if you multiply any letter (represented by encoded metric) 
with such Identity metrics, nothing would happen to that metric.

Однако при перетасовке столбцов, как показано ниже, метрика идентичности теперь становится метрикой подкачки.

| 0 1 0 0 0 0 | 
| 1 0 0 0 0 0 | 
| 0 0 1 0 0 0 | 
| 0 0 0 1 0 0 | 
| 0 0 0 0 1 0 | 
| 0 0 0 0 0 1 |

Swapper metric : Swaps letter 'a' and 'b' with each other 
|1 0 0 0 0 0| *   | 0 1 0 0 0 0 | = |0 1 0 0 0 0|
                  | 1 0 0 0 0 0 | 
                  | 0 0 1 0 0 0 | 
                  | 0 0 0 1 0 0 | 
                  | 0 0 0 0 1 0 | 
                  | 0 0 0 0 0 1 |

Say you have done one hot encoding, and 
letter 'a' is represented by metric [1 0 0 0 0 0] and 
letter 'b' is represented by metric [0 1 0 0 0 0] and so on. 

Now if you pass letter 'a' metric and multiply with above swapper metric, 
you would get letter 'b' metric and vica versa.

Моделирование движений ротора

Проще говоря, поворот буквы «а» на две позиции вправо означает получение на выходе буквы «с». В другом примере, если повернуть букву «d» влево на 3 позиции, на выходе будет получена буква «а».

Допустим, на роторе 1 активна буква «c», и вы хотите повернуть ее на 2 (влево), тогда она должна стать «a». Чтобы это произошло, мы умножаем на метрику ротора (левого переключателя). Вот пример, буква «c», представленная [0 0 1 0 0 0], сдвигается на два шага с использованием умножения метрик.

|0 0 1 0 0 0| *   | 0 0 0 0 1 0| = |1 0 0 0 0 0|
                  | 0 0 0 0 0 1| 
                  | 1 0 0 0 0 0| 
                  | 0 1 0 0 0 0| 
                  | 0 0 1 0 0 0| 
                  | 0 0 0 1 0 0|

Say letter 'c' is represented by metric |0 0 1 0 0 0| and
when we multiply it with above shown 'rotor' metric we get 
|1 0 0 0 0 0| which is representation of letter 'a'


Note that the rotor metrics is created from identity metric 
by simply shifting n columns (for n rotations) towards left.

Настройка начального положения роторов

Чтобы задать начальные положения роторов, мы заранее задаем матрицы роторов. Проще говоря, скажем, если исходное положение машины такое, как показано ниже:

Ротор 1 : 2, что означает, что любая буква, доходящая до ротора 1, будет сдвинута на 2 позиции.

Ротор 2 : 4, что означает, что любая буква, достигающая ротора 2, будет сдвинута на 4 позиции.

Ротор 3 : 5, что означает, что любая буква, доходящая до ротора 3, будет сдвинута на 5 позиций.

Их метрическое представление будет таким, как показано ниже.

Rotor 1 :

| 0 0 1 0 0 0 | 
| 0 0 0 1 0 0 | 
| 0 0 0 0 1 0 | 
| 0 0 0 0 0 1 | 
| 1 0 0 0 0 0 | 
| 0 1 0 0 0 0 |

Rotor 2:

| 0 0 0 0 1 0 | 
| 0 0 0 0 0 1 | 
| 1 0 0 0 0 0 | 
| 0 1 0 0 0 0 | 
| 0 0 1 0 0 0 | 
| 0 0 0 1 0 0 |

Rotor 3:

| 0 0 0 0 0 1 | 
| 1 0 0 0 0 0 | 
| 0 1 0 0 0 0 | 
| 0 0 1 0 0 0 | 
| 0 0 0 1 0 0 | 
| 0 0 0 0 1 1 |

Матричные операции в R

R предоставляет мощные возможности манипулирования матрицами, которые позволяют нам эффективно выполнять эти операции. Мы можем использовать такие функции, как матрица(), диаг() и %*% (умножение матриц), для создания матриц перестановок, матриц вращения и моделирования движений ротора.

Объединив эти матричные операции, мы можем воссоздать процесс шифрования машины «Энигма» в R, обеспечивая более глубокое понимание ее внутренней работы и роли матричных преобразований в криптографии.

Выход

Заключение

Машина «Энигма» является свидетельством достижений криптографии во время Второй мировой войны. Используя матричные операции, мы можем воспроизвести его функциональность и понять сложные процессы, связанные с шифрованием сообщений.

Чтобы изучить код и примеры того, как матричные операции могут воссоздать функции машины Enigma, обратитесь к файлу enigma_machine.R в основной ветке моего репозитория GitHub: https://github.com/Monzero/Enigma.

Присоединяйтесь ко мне в разгадке тайн машины-загадки и раскрытии секретов шифрования!

#EnigmaMachine #MatrixOperations #Криптография #Шифрование