Рассмотрим стандартную 8-битную кодировку (например, ASCII+). Но с одним условием, мы хотим передавать сообщения так, чтобы только адресат мог их расшифровать — без применения традиционных криптографических примитивов, таких как AES или RSA. Есть ли альтернатива? Оказывается, да — можно построить биективное отображение между символами и определённым подмножеством нечётных натуральных чисел, генерируемых по заданному правилу.

Велосипед, но свой...

Обратимся к ранее опубликованной статье «Параметризация нечётных чисел на основе подмножеств вычетов по модулю шесть».

Идея: параметризация через «подмножества» и «подпространства»

Пусть каждому символу сопоставляется тройка параметров (r, k, x), где:

  • r ∈ {1, 3} — номер «подмножества» (на основе подмножеств вычетов по модулю 6),

  • k ∈ {1, 2, 3, 4} — номер «подпространства»,

  • x ∈ [0, 31] — индекс внутри уровня (достаточно для покрытия 256 значений).

Параметры r,k,x - подробно описаны ранее, поэтому здесь используется только их применение.

Для каждой такой тройки параметров мы вычисляем нечётное число по формуле:

где A и B — заранее заданные табличные коэффициенты. Все полученные N — нечётные целые числа.

Таким образом, мы строим отображение символ → число, и в обратную сторону — число → символ, используя свойства последовательности Коллатца.

Реализация

Вот упрощённая реализация такого кодека на Python:

A = {
    (1, 1): 22, (1, 2): 4,  (1, 3): 40, (1, 4): 112,
    (3, 1): 10, (3, 2): 28, (3, 3): 136, (3, 4): 208
}
B = {
    (1, 1): 36, (1, 2): 72, (1, 3): 144, (1, 4): 288,
    (3, 1): 36, (3, 2): 72, (3, 3): 144, (3, 4): 288
}

def collatz_number(r, k, x):
    if (r, k) not in A or (r, k) not in B:
        return -1
    a = A[(r, k)]
    b = B[(r, k)]
    return (a + b * x - 1) // 3

Затем строим таблицы кодирования/декодирования (с проверкой на наличие ошибок):

char_to_code = {}
code_to_char = {}
used_numbers = set()
index = 0
collision_count = 0

for r in [1, 3]:
    for k in range(1, 5):
        for x in range(32):
            if index >= 256:
                break
            number = collatz_number(r, k, x)
            if number in used_numbers:
                collision_count += 1
                continue
            ch = chr(index)
            char_to_code[ch] = (r, k, x, number)
            code_to_char[number] = ch
            used_numbers.add(number)
            index += 1

print(f"Пропущено коллизий: {collision_count}")

Обратное преобразование реализуется через итеративное применение обратных шагов Коллатца:

def encode(ch):
    if ch in char_to_code:
        _,_,_, num = char_to_code[ch]
        return num
    return -1

def decode(num):
    steps = 0
    while steps < 30:
        if num in code_to_char:
            return code_to_char[num]
        elif num < 5:
            return '?'

        if num % 2 == 0:
            num //= 2
        else:
            num = (num - 1) // 3
        steps += 1
    return '?'

Тестирование

Проверим корректность кодека на случайном сообщении из 1000 символов:

import random
random.seed(42)
test_message = ''.join(chr(random.randint(0, 255)) for _ in range(1000))

encoded = [encode(ch) for ch in test_message]
decoded = ''.join(decode(n) for n in encoded)

assert test_message == decoded
print("Сообщение совпадает с оригиналом:", test_message == decoded)

Результат: полное восстановление данных. Коллизий (повторяющихся чисел) при построении таблицы — нет.

Эффективность и битовая глубина

Хотя числа N могут быть достаточно большими (десятки тысяч и выше), важно понимать: в данном подходе мы не передаём сами числа как есть, а используем их как секретный словарь. В реальном применении передаётся не число, а его компактный индекс (r, k, x), требующий всего 1 + 2 + 5 = 8 бит — ровно как в ASCII+.

Таким образом:

  • Внешний наблюдатель видит только неструктурированные нечётные числа.

  • Получатель, зная таблицу A/B и алгоритм декодирования, легко восстанавливает исходный текст.

  • Без знания параметров A и B восстановление невозможно (по крайней мере, без перебора).

Заключение и возможные применения

Этот метод не является криптографически стойким в классическом смысле (ключи A, B можно подобрать), но он демонстрирует новый способ стеганографического кодирования, где семантика сообщения скрыта в арифметических свойствах чисел.

Возможные направления развития:

  • Использование более сложных параметрических семейств (с большим числом «подмножеств» или переменной глубиной).

  • Интеграция с физическим уровнем передачи (например, модуляция несущей частоты по значению N).

  • Применение в системах, где требуется обфускация данных без шифрования (например, IoT-устройства с ограниченными ресурсами).

Как идея, не ограничиваться указанными подмножествами и пространствами в примере, а использовать полный набор. Но для этого например передовая в конце или начале сообщения 8 бит с номером набора подмножеств и подпространств.

Спасибо за внимание!

Если идея показалась вам любопытной — делитесь в комментариях: можно ли использовать подобные структуры для построения легковесных протоколов обмена.

Комментарии (27)


  1. kez
    10.11.2025 00:38

    Любопытно, прикольно.

    Про стеганографию немного не понял. Закодированное сообщение остаётся похожим на оригинальное или нет?

    Для стеганографии обычно нужны 2 "инпута": контейнер и секретное сообщение. Сообщение "встраивается" в контейнер таким образом, что факт наличия этого сообщения незаметен для внешнего наблюдателя. Однако я не спец по шифрованию, так что могу ошибаться.


    1. Sayman22 Автор
      10.11.2025 00:38

      Если быть точным, то предложенный метод лишь обладает стеганографическими чертами, внешний наблюдатель видит лишь последовательность нечётных чисел, не подозревая, что среди них закодирован текст. Если при этом неизвестен алгоритм (таблицы A, B и правило декодирования), то обнаружить скрытое сообщение не получится


  1. lea
    10.11.2025 00:38

    Выглядит как шифр простой замены. Вскрываются они частотным анализом, т.к. наиболее часто встречаемые символы открытого текста будут соответствовать наиболее часто встречаемым символам шифротекста.


    1. Sayman22 Автор
      10.11.2025 00:38

      Да, вы правы, но материал поэтому и помечен как лёгкий. Показан именно пример использования параметризации в данном вопросе.


    1. Sayman22 Автор
      10.11.2025 00:38

      В конце, я также указал, что возможно использование всех подмножеств и подпространства. И тогда, например , передавая например, каждые 1000 бит используемый набор ( например в 8 бинтом слове), мы внесли бы некую рандомизацию использованных таблиц.

      Это бы сделало возможность расшифровки, сложнее


  1. nihil-pro
    10.11.2025 00:38

    Надеюсь кибера наши не увидят ваш пост, а то заставят кодировать все Джейсоны с фронта перед отправкой на бэк))


    1. Sayman22 Автор
      10.11.2025 00:38

      Ну разве что только из баловства или для разминки))


  1. vesper-bot
    10.11.2025 00:38

    Биективное отображение ломается частотным анализом. Вы придумали аналог "хитрой литореи", только посложнее.


    1. Sayman22 Автор
      10.11.2025 00:38

      Спасибо за ваше мнение. Я изучу вопрос с частотным анализом и как его обойти, возможно дополню этот алгоритм, если будет время. Совсем не специалист в этой области, просто было интересно попробовать прикрутить параметризация именно к кодированию. Изначально задача была сделать восстанавливаемой сообщение, даже с потерями, за счёт параметризации в кодировке, но пока я потерпел крах на том фронте))


  1. Sirion
    10.11.2025 00:38

    Рассмотрим стандартную 8-битную кодировку (например, ASCII+). Но с одним условием, мы хотим передавать сообщения так, чтобы только адресат мог их расшифровать — без применения традиционных криптографических примитивов, таких как AES или RSA. Есть ли альтернатива?

    Дальше, честно говоря, можно не читать) Первое правило бойцовского клуба — никогда не пишите свою криптографию, если точно не знаете, что делаете. Шифров можно много напридумывать, с хорошим тамадой и конкурсами интересными. Но любой шифр, придуманный тем, кто не специализируется на криптографии, ломается тем, кто специализируется на криптографии, со звуком "чпок... добрый вечер".


    1. Sayman22 Автор
      10.11.2025 00:38

      Второе правило новичка в бойцовском клубе - лучше иметь в наставниках мастера , которые будет бить тебя пальцем, чем клевать цыплят и думать , что ты хозяин над ними))

      Ну а по факту, любая писанина имеет какой то смысл. Вы дали замечание и если мне интересно какое то направление, чисто для себя , я найду вектор дальнейшего развития по таким замечаниям, чтоб посмотреть что-то интересное , а возможно и попробовать это.


      1. Sirion
        10.11.2025 00:38

        Ну судя по всему, на самом деле вам просто интересно мысленно поперекладывать числа, заставить их ходить фрактальным строем и насладиться этим парадом) я это желание прекрасно понимаю, сам любил такое. Но у меня так и не получилось ничего, что имело бы ценность снаружи моей головы. Думаю, что вы идёте по тому же пути и придёте к аналогичному результату. Вы ищете свойства чисел, которые легко и удобно находятся, и надеетесь, что эти свойства откроют какие-то тайны. К сожалению, чаще всего это не работает. Работает подход "от проблемы".


        1. Sayman22 Автор
          10.11.2025 00:38

          Это правда, нравится.

          Вы правы, все это работает от проблемы.

          Но как , написал вам ранее, параметризация только следствие, и все эти фракталы вытекают из конкртеной проблемы, которую я просто не обозначил ещё , а текст о параметризации это всего лишь описание, чтоб снизить общий объем информации при доказательстве конкретной гипотезы .

          Конкретный пример с кодированием лишь баловство)

          Надеюсь в ближайшее время будет возможность, и я вскоре опубликую то из-за чего всё затевалось и тогда ваши вопросы снимутся. Ну либо вы скажете , что все пропало и разобьете мою стройную теорию)

          Вскрытие покажет.

          В любом случае , спасибо за внимание


  1. domix32
    10.11.2025 00:38

    Как-то вы поскупились на код - функцию кодирования вы используете, но не стали приводить её код. Сначала там будет что-то простое типа char_to_code[int(char)] ан нет, там кортежи с кортежами - как их готовить-то?


    1. Sayman22 Автор
      10.11.2025 00:38

      Дописал def encode


      1. domix32
        10.11.2025 00:38

        Вы бы хоть проверили его. Объявление и условие хотят по :.

        Отдельный вопрос как выглядят оригинальное и шифрованные сообщения, чтобы их можно было передавать хоть в каком-нибудь виде. На массив байт это всё не похоже, как передавать и парсить массив интов, которые явно за пределами ascii -тоже непонятно.


  1. wataru
    10.11.2025 00:38

    • Внешний наблюдатель видит только неструктурированные нечётные числа.

    • Получатель, зная таблицу A/B и алгоритм декодирования, легко восстанавливает исходный текст.

    при этом вообще не важно, что у вас за параметризация. можно тупо нагенерировать таблиц из перестановок 256 чисел.

    Статья ни о чем. Никакого смысла эта параметризация не дает.

    Ну и про полную несостоятельность самого простого шифра замены с криптографической точки зрения вам уже рассказали.


    1. nihil-pro
      10.11.2025 00:38

      Да штош такое то! Вы хоть объясните, что конкретно имеете ввиду. Я ничего не знаю о криптографии, комментарии читаю как раз для того, чтобы увидеть ответ специалиста, где будет написано что-то вроде: это не работает, потому что…

      А вы просто пишете — афтартыниправ! Ну какая ценность у такого комментария? Разжуйте для таких как я, интересно же!


      1. wataru
        10.11.2025 00:38

        То, что вы придумали, по нормальному называется шифр простой замены. Не важно, какие функции, параметризации вы используете - в конце концов у вас есть просто таблица, какому коду соответствует каждая буква. Вся ваша математика тут вообще не играет никакой роли. Просто таблица из 256 кодов и все.

        Это очень плохой шифр, он элементрано ломается. Например, если вы зашифруете мое сообщение, то символ пробела будет в нем самым частым. Так что можно просто посмотреть на коды, найти какой из них самый частый и сделать его пробелом. Потом видно слова из одной буквы, их разных в русском языке всего несколько. Добавим к этому слова из двух букв и там варианты буквально на пальцах двух рук пересчитать можно. Вот мы уже кучу букв отгадали. Да, надо знать на каком языке исходное сообщение написано, но там тоже вариантов не много. Вы сами это признали в тексте.

        Так же тут нет никакой стеганографии. Любой наблюдатель видит бессмысленный набор чисел, и понимает, что это какой-то шифр. Стеганография - это спрятать сообщение внутри чего-то другого, чтобы, если не знаешь, что оно там есть, то и не заметишь его вообще.


        1. nihil-pro
          10.11.2025 00:38

          Спасибо!

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


          1. wataru
            10.11.2025 00:38

            Да, именно так.


        1. viordash
          10.11.2025 00:38

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


          1. wataru
            10.11.2025 00:38

            Архив распаковывается, а дальше все ломается, хоть и сложнее, почти во всех случаях. Было бы желание у профессионала пытаться ломать. Тут есть несколько разных моделей угроз. Если я могу заставлять вас кодировать разные сообщения и получать результат, это ломается вообще за 1 сообщение. Если я знаю один пример исходных и закодированных данных - тоже. Если у меня есть код дешифратора и я знаю, что у вас шифр замены, то все тоже просто. Потом можно перебрать формат данных. Они скорее всего сжаты, например, Jpeg, mp3 или что там у вас. Можно перебрать несколько вариантов и по заголовку отгадать много чего.

            Если вы, допустим, передаете тупо цвета пикселей, никак не сжатые и без заголовков, то сложнее, но тоже ломается. Можно тупо вот эти данные как картинку и использовать и там все формы будет видно, только цвета кислотные. Дальше по смыслу можно подбирать цвета.

            Если я ничего про шифр не знаю, то сложнее, но медитируя на много примеров зашифорванных данных можно предположить по распределению частоты символов.

            Это если вы хоть что-то осмысленное передаете. Если же вы передаете серый шум, то тут да, сломать тяжко будет.


            1. Sayman22 Автор
              10.11.2025 00:38

              А если воспользоваться простой заменой и иметь к примеру 100 таблиц.

              И к примеру каждые 128 бит чередовать таблицы.

              Если ломщик не будет знать, как чередуются таблицы, то какова степень простоты взлома передаваемой информации.

              Возможно оценить?


              1. wataru
                10.11.2025 00:38

                Шифр, который основывается на том, что взломщуку не известна схема шифрования - плохой шифр. Потому что есть шифры лучше, где взломщик знает вообще все про шифр, видит все данные кроме одного секрета и все-равно ничего взломать никак не может. А алгоритм шифрования вы вечно в секрете держать не сможете.

                Да, пока взломщик не знает, как меняются таблицы, взломать такой шифр только по подслушке будет сложно. Если известны какие-то расшифрованные тексты или можно заставлять вас шифровать что угодно, то все ломается довольно легко. Или если взломщик знает про алгоритм шифрования, то набрав статистику по куче сообщениям он взломает каждую таблицу.


                1. Sayman22 Автор
                  10.11.2025 00:38

                  Понял, спасибо!


        1. Sayman22 Автор
          10.11.2025 00:38

          Большое спасибо за конструктив!

          Да, теперь вижу, что в данном случае вообще не играет роли формула, подойдёт любой набор для замены

          Я сразу обозначил , что лишь хотел попробовать.

          По вашим комментариям при наличии свободного времени , поиграюсь с чем то другим.