Enigma
Enigma – это не только такой музыкальный проект, но и целая страница в мировой истории XX века в целом и шифровального дела в частности.
Эни́гма (Enigma) — портативная шифровальная машина, использовавшаяся для шифрования секретных сообщений. Более точно, Энигма — целое семейство электромеханических роторных машин, применявшихся с 20-х годов XX века.
Энигма использовалась в коммерческих целях, а также в военных и государственных службах во многих странах мира, но наибольшее распространение получила в нацистской Германии во время Второй мировой войны. Именно Энигма Вермахта (Wehrmacht Enigma) — немецкая военная модель — чаще всего является предметом дискуссий. Эта машина получила дурную славу, потому что криптоаналитики Антигитлеровской коалиции смогли расшифровать большое количество сообщений, зашифрованных при помощи неё. Специально для этих целей была создана машина с кодовым названием Bomba, оказавшая значительную помощь Антигитлеровской коалиции в войне.
Не последнюю роль в расшифровке сообщений Энигмы сыграл небезызвестный вам Алан Тьюринг.
К чему это все? А вот к чему: Джефф Просис (Jeff Prosise) со своим сыном ко дню национальной истории в школе чада сделали эмулятор Энигмы.
Думаю, вы уже догадались на чем сделан эмулятор? Правильно, на Silverlight!
Похоже?
О детальном устройстве Энигмы рассказано в Википедии. Я же ограничусь описанием того, как с ее помощью что-то за(рас)шифровать.
- Первым делом нужно устновить в правильное положение роторы (три ротора наверху), выставив на них желаемую последовательность символов.
- Далее в коммутационной панели нужно соединить желаемым образом пары символов.
- После этого можно вводить на клавиатуре сообщение.
Расшифровка осуществляется абсолютно аналогично:
- Правильное начальное положение роторов
- Правильное соединение символов в коммутационной панели
- С клавиатуры вводится секретное сообщение.
Попробуйте установить на роторах слово “WOW”, соединить пары Q-Y, E-C, T-B, U-M и ввести слово “HJBXBAFJUGHYUQUD” – все как на картинке выше :)
Джефф любезно выставил в интернете не только сам проект, но и его исходники.
p.s. У меня в этом проекте вывалиется XamlParseException при попытке соединить пары букв. Ошибка ведет к функции CreateConnector
1: private Rectangle CreateConnector(double x, double y, double length, double angle)
2: {
3: Rectangle rect = (Rectangle)XamlReader.Load(String.Format(template, length, x, y, angle));
4: rect.MouseLeftButtonDown += new MouseButtonEventHandler(Connector_MouseLeftButtonDown);
5: return rect;
6: }
Проблема в том, что в данному случае переменная angle при вставке в xaml-код template для прямоугольника коннектора преобразуется к строке, используя региональные настройки. В моем случае используется запятая “,” вместо ожидаемой XamlReader точки “.”. Такая вот напасть…
Исправляем с учетом локали:
1: private Rectangle CreateConnector(double x, double y, double length, double angle)
2: {
3: Rectangle rect = (Rectangle)XamlReader.Load(String.Format(template, length, x, y, angle.ToString(System.Globalization.CultureInfo.InvariantCulture)));
4: rect.MouseLeftButtonDown += new MouseButtonEventHandler(Connector_MouseLeftButtonDown);
5: return rect;
6: }
В принципе, то же самое нужно делать и с переменными length, x, y, но они в данном случае принимают только целые значения.