Эмулятор советской шифровальной машины «Фиалка» М-125 — рабочая реализация на Free Pascal и эталонная модель на Python, сверяемые друг с другом знак в знак.
Механизм восстановлен из deco/M125v5_16eng.exe (оконный симулятор, Delphi,
2014), сверен с Fialka_200.pdf (Reuvers & Simons, «Fialka M-125», v2.0) и
перепроверен по Fialka.dll — плагину CrypTool 2, собранному независимо от
обоих, — и по документам ННА ГДР на scz.bplaced.net/m125.html. Других
источников в документации нет: всё, что здесь написано, прослеживается до
одного из этих четырёх.
Ни одного из трёх в репозитории нет — это чужие файлы, и распространять их
здесь мы не берёмся. Пути deco/M125v5_16eng.exe, Fialka_200.pdf и
Fialka.dll в тексте и в скриптах означают «положите свою копию сюда»; на
работу эмулятора и на проверки они не влияют — нужны только для повторного
извлечения таблиц (reference/extract_tables.py) и для сверки с оригиналом.
cd pascal && fpc -O2 fialka.pas
./fialka --genkey --set 6K -o key.txt # ключ дня
./fialka --genpos # ключ сообщения
./fialka -e -k key.txt --pos "Б Щ Щ Е Н Д Ы Ч Ч Ы" msg.txt
./fialka -e -k key.txt --mode M msg.txt # цифры и знаки в тексте
./fialka -e -k key.txt --mode N цифры.txt # только цифры
./fialka --selftest| документ | о чём |
|---|---|
| docs/mechanism.md | как устроена машина: диски, шаговый механизм, рефлектор, пробел и Й |
| docs/formats.md | форматы ключа, комплекта дисков, машины, таблицы подготовки |
| docs/usage.md | ключи командной строки, чужие знаки, трасса, проверки |
| путь | что это |
|---|---|
pascal/fialka.pas |
рабочая реализация, один файл |
reference/ |
эталонная модель на Python: оракул, сверялка, извлечение таблиц |
data/ |
машина, печатающие головки, комплекты дисков, таблица подготовки текста |
keys/ |
ключи дня |
demo/ |
пара текстов и vectors.txt — векторы с оригинала, см. demo/note.txt |
deco/ |
настройки симулятора M125.INI и скриншот с ключом; сам симулятор сюда положите свой |
Fialka_200.pdf |
описание машины |
materials/ |
побочные материалы, в документации не используются |
Обе реализации читают одни и те же файлы из data/ и keys/. Это не
удобство, а часть проверки: разойтись в разборе они могут независимо от
механизма, и reference/crosscheck.py ловит именно это.
Механизм закрыт: обе реализации проходят самопроверки и сходятся на сотнях случайных ключей по трём комплектам, трём режимам текста и обоим направлениям.
Работают все три положения рычага Б/С/Ц: буквы, смешанный (цифры и знаки
препинания через регистры ЦФ и БК) и цифры. Каждое подтверждено парой, снятой
с оригинальной программы, — demo/vectors.txt.
Печатающая головка вынесена в отдельный файл data/head-*.ini и меняется, не
трогая шифр: диски и рефлектор работают с номерами контактов и знаков не
знают. Рядом с кириллической лежат три латинские — польская, чехословацкая и
ГДР; в режиме цифр они не работают, и почему — написано в
docs/mechanism.md.
Механизм сверен и с третьим источником — плагином CrypTool 2 (Fialka.dll).
Совпало всё, кроме одного: на комплектах 3K и 6K наша «нормальная» сторона
сердечника у него считается перевёрнутой. На 5K обе модели дают одинаковый
шифртекст знак в знак. Разбор — в docs/mechanism.md.