Игральные карты уже давно используются не только для развлечений и азартных игр, но и в качестве инструмента для скрытой коммуникации. Возможность передавать секретные сообщения с помощью обычной колоды карт звучит как нечто из области шпионских романов, однако в последние годы научные изыскания и математические открытия сделали такую практику вполне реальной и доступной. Одним из интереснейших направлений является идея кодирования текста через порядок перемешивания колоды. Объем возможных перестановок стандартной колоды в 52 карты настолько грандиозен, что позволяет закодировать большую часть информации, которую можно представить в двоичной форме. Количество уникальных вариантов перемешивания рассчитывается как факториал числа 52, то есть произведение всех целых чисел от 1 до 52.
Это значение приблизительно равно 8 умножить на 10 в степени 67 — настолько огромное число, что позволяет хранить до 225 бит информации в одной последовательности карт. Такие цифры говорят о больших перспективах для кодирования и передачи сообщений, в отличие от традиционных методов шифрования, которые часто требуют специализированного оборудования или программного обеспечения. Вопреки первичным предположениям, использование только цвета карт не подходит для полноценного кодирования, так как черных и красных карт в колоде по 26, что ограничивает объем закодированной информации примерно до 26 бит — всего около 11% от возможного. Более эффективным стал подход, основанный на концепции кода Леммера. Он позволяет однозначно представить любую перестановку множества элементов в виде числовой последовательности.
Для каждого элемента вычисляется количество оставшихся справа объектов, которые меньше его по значению. Этот подход трансформирует порядок карт в набор чисел, которые затем можно обозначить в факториальной системе счисления. Факториальная система — это способ представления чисел, использующий факториалы в качестве базовых единиц. Например, число 17 можно представить как сумму кратных факториалов: две шестерки (6!), два двойки (2!), и один 1 (1!). В подобных обозначениях цифры записываются через двоеточие с указанием факториала, что превосходно подходит для преобразования кода Леммера в большие десятичные числа и обратно.
Такой перевод является ключевым этапом, позволяющим представить порядок колоды в виде огромного числа, максимально используя доступные 225 бит информации. Это обеспечивает 100% эффективности от теоретического максимума хранения данных. Для практического использования такой системы было решено ограничиться 45 символами текста, поскольку каждый символ можно закодировать в 5 битах. Основанная на этом наборе символов включает не только буквы латинского алфавита, но и пробел, точки, запятые, кавычки, тире и другие знаки препинания. Это соответствует 32 символам, что идеально укладывается в 5-битную систему, позволяя эффективно конвертировать текст в двоичную форму и обратно.
Благодаря реализации на Python процесс преобразования текста в число и далее в последовательность карт достаточно прост, используя сдвиги и побитовые операции для упаковки символов в битовый поток. Обратный процесс декодирования также базируется на обратном преобразовании из факториального числа в порядок, а затем в текст по алфавиту. Стоит отметить интересный побочный эффект метода кодирования с помощью кода Леммера: если изменить местоположение даже одной карты, то все символы, расположенные после этой карты, также изменятся при декодировании. Это усложняет попытки частично изменить сообщение без искажения остальной части. Такая особенность может работать как внутренняя проверка целостности, дополняя скрытый характер коммуникации.
Для более удобного и быстрого применения алгоритма были разработаны веб-приложения на C++ с использованием технологий WebAssembly и Emscripten. Они позволяют выполнять все операции прямо в браузере, обеспечивая высокую скорость и удобство. Дополнительно в некоторых версиях реализован простой XOR-шифр, позволяющий дополнительно зашифровать сообщение перед его преобразованием в порядок карт. Несмотря на использование дополнительного шифрования, основная сила метода — в стелс-природе кодирования. Никто не ожидает, что расположение карт в колоде содержит важную информацию, что делает такой способ передачи практически незаметным.
Такая технология может заинтересовать не только исследователей криптографии, но и любителей необычных головоломок, магов и всех, кто ценит креативные методы коммуникации. В целом скрытие сообщений в порядке игральной колоды — яркий пример того, как сложные математические понятия могут применяться для решения реальных задач, а также открывать новые возможности в передаче данных с максимальной эффективностью и минимальной заметностью. Создание и использование подобных кодов способствует развитию необычных подходов к обмену информацией и расширяет горизонты понимания классических объектов, таких как обычная колода карт.