Рассмотрим стандартную 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)

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

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

Sayman22 Автор
10.11.2025 00:38В конце, я также указал, что возможно использование всех подмножеств и подпространства. И тогда, например , передавая например, каждые 1000 бит используемый набор ( например в 8 бинтом слове), мы внесли бы некую рандомизацию использованных таблиц.
Это бы сделало возможность расшифровки, сложнее

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

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

Sirion
10.11.2025 00:38Рассмотрим стандартную 8-битную кодировку (например, ASCII+). Но с одним условием, мы хотим передавать сообщения так, чтобы только адресат мог их расшифровать — без применения традиционных криптографических примитивов, таких как AES или RSA. Есть ли альтернатива?
Дальше, честно говоря, можно не читать) Первое правило бойцовского клуба — никогда не пишите свою криптографию, если точно не знаете, что делаете. Шифров можно много напридумывать, с хорошим тамадой и конкурсами интересными. Но любой шифр, придуманный тем, кто не специализируется на криптографии, ломается тем, кто специализируется на криптографии, со звуком "чпок... добрый вечер".

Sayman22 Автор
10.11.2025 00:38Второе правило новичка в бойцовском клубе - лучше иметь в наставниках мастера , которые будет бить тебя пальцем, чем клевать цыплят и думать , что ты хозяин над ними))
Ну а по факту, любая писанина имеет какой то смысл. Вы дали замечание и если мне интересно какое то направление, чисто для себя , я найду вектор дальнейшего развития по таким замечаниям, чтоб посмотреть что-то интересное , а возможно и попробовать это.

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

Sayman22 Автор
10.11.2025 00:38Это правда, нравится.
Вы правы, все это работает от проблемы.
Но как , написал вам ранее, параметризация только следствие, и все эти фракталы вытекают из конкртеной проблемы, которую я просто не обозначил ещё , а текст о параметризации это всего лишь описание, чтоб снизить общий объем информации при доказательстве конкретной гипотезы .
Конкретный пример с кодированием лишь баловство)
Надеюсь в ближайшее время будет возможность, и я вскоре опубликую то из-за чего всё затевалось и тогда ваши вопросы снимутся. Ну либо вы скажете , что все пропало и разобьете мою стройную теорию)
Вскрытие покажет.
В любом случае , спасибо за внимание

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

Sayman22 Автор
10.11.2025 00:38Дописал def encode

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

wataru
10.11.2025 00:38Внешний наблюдатель видит только неструктурированные нечётные числа.
Получатель, зная таблицу
A/Bи алгоритм декодирования, легко восстанавливает исходный текст.
при этом вообще не важно, что у вас за параметризация. можно тупо нагенерировать таблиц из перестановок 256 чисел.
Статья ни о чем. Никакого смысла эта параметризация не дает.
Ну и про полную несостоятельность самого простого шифра замены с криптографической точки зрения вам уже рассказали.

nihil-pro
10.11.2025 00:38Да штош такое то! Вы хоть объясните, что конкретно имеете ввиду. Я ничего не знаю о криптографии, комментарии читаю как раз для того, чтобы увидеть ответ специалиста, где будет написано что-то вроде: это не работает, потому что…
А вы просто пишете — афтартыниправ! Ну какая ценность у такого комментария? Разжуйте для таких как я, интересно же!

wataru
10.11.2025 00:38То, что вы придумали, по нормальному называется шифр простой замены. Не важно, какие функции, параметризации вы используете - в конце концов у вас есть просто таблица, какому коду соответствует каждая буква. Вся ваша математика тут вообще не играет никакой роли. Просто таблица из 256 кодов и все.
Это очень плохой шифр, он элементрано ломается. Например, если вы зашифруете мое сообщение, то символ пробела будет в нем самым частым. Так что можно просто посмотреть на коды, найти какой из них самый частый и сделать его пробелом. Потом видно слова из одной буквы, их разных в русском языке всего несколько. Добавим к этому слова из двух букв и там варианты буквально на пальцах двух рук пересчитать можно. Вот мы уже кучу букв отгадали. Да, надо знать на каком языке исходное сообщение написано, но там тоже вариантов не много. Вы сами это признали в тексте.
Так же тут нет никакой стеганографии. Любой наблюдатель видит бессмысленный набор чисел, и понимает, что это какой-то шифр. Стеганография - это спрятать сообщение внутри чего-то другого, чтобы, если не знаешь, что оно там есть, то и не заметишь его вообще.

nihil-pro
10.11.2025 00:38Спасибо!
Если я правильно понял, то такой шифр простым перебором легко, или очень легко взломать, потому что некие паттерны видны невооруженным взглядом, вс сравнении с реальной криптографией, о которой я только знаю, что перебором там среднему компьютеру несколько лет придется пыхтеть.

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

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

Sayman22 Автор
10.11.2025 00:38А если воспользоваться простой заменой и иметь к примеру 100 таблиц.
И к примеру каждые 128 бит чередовать таблицы.
Если ломщик не будет знать, как чередуются таблицы, то какова степень простоты взлома передаваемой информации.
Возможно оценить?

wataru
10.11.2025 00:38Шифр, который основывается на том, что взломщуку не известна схема шифрования - плохой шифр. Потому что есть шифры лучше, где взломщик знает вообще все про шифр, видит все данные кроме одного секрета и все-равно ничего взломать никак не может. А алгоритм шифрования вы вечно в секрете держать не сможете.
Да, пока взломщик не знает, как меняются таблицы, взломать такой шифр только по подслушке будет сложно. Если известны какие-то расшифрованные тексты или можно заставлять вас шифровать что угодно, то все ломается довольно легко. Или если взломщик знает про алгоритм шифрования, то набрав статистику по куче сообщениям он взломает каждую таблицу.

Sayman22 Автор
10.11.2025 00:38Большое спасибо за конструктив!
Да, теперь вижу, что в данном случае вообще не играет роли формула, подойдёт любой набор для замены
Я сразу обозначил , что лишь хотел попробовать.
По вашим комментариям при наличии свободного времени , поиграюсь с чем то другим.
kez
Любопытно, прикольно.
Про стеганографию немного не понял. Закодированное сообщение остаётся похожим на оригинальное или нет?
Для стеганографии обычно нужны 2 "инпута": контейнер и секретное сообщение. Сообщение "встраивается" в контейнер таким образом, что факт наличия этого сообщения незаметен для внешнего наблюдателя. Однако я не спец по шифрованию, так что могу ошибаться.
Sayman22 Автор
Если быть точным, то предложенный метод лишь обладает стеганографическими чертами, внешний наблюдатель видит лишь последовательность нечётных чисел, не подозревая, что среди них закодирован текст. Если при этом неизвестен алгоритм (таблицы
A,Bи правило декодирования), то обнаружить скрытое сообщение не получится