Алгоритм вычисления большого (тысячи бит) числа нужен

Привет!

Смотрите, какая есть нетипичная задача:

Есть число, большущее, 65535 бит, не меньше. Число подчиняется кое-какой статистике (вернее, биты в нем), это не случайные биты.

Нужно сгенерировать код на языке Си, который:

  1. Состоит из множества функций, которые вызывают друг-дружку
  2. Функции занимаются вычислением вышеозначенного большого числа, используя какой-то случайный алгоритм. Например, число 7:
int func_123(void *context, .... ) {
  int tmp = 10;
  tmp -= func_143();
  tmp = func_333(sqrt(float(tmp))); //результат вызова - число 7
 ...
}

Результат работы - массив, заполненный нужными битами.

Сложности у меня возникли с тем, чтобы генерируемые алгоритмы не были похожи друг на дружку. Шаблонность недопустима! :).

В идеале получить бы портянку арифметических/тригонометрических/fft/пр. операций, переходов, циклов, и пр. Желательно, так же, чтобы время на вычисление числа было солидным. Ну, скажем, секунду. Или больше. Без delay(), а именно вычислительной нагрузкой.

Пишите, если есть идеи. Рассматриваем любые фантазии.

У тя стока денег нет.

Пока нет, правда ваша, я нищ.

Но вдруг алгоритм можно будет монетизировать потом, если хороший получится? :slight_smile:

Не благодарите.

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

2 лайка

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

Не предложили. Вы выдали Ответ, а от Вас ждали алгоритма, который этот Ответ восемь миллионов лет считал!

Любая случайность - неслучайна.
В систему случайности могут приходить извне.
…много разных датчиков и снимаем с них значения, желательно с точностью, выходящей за погрешность приборов :slight_smile:
датчики-модули: часы, термометр, барометр, компас на хвосте собаки…

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

Криптография “вкатышей” не любит… Не советуйте человеку несбыточных мечт.

Память МК не инициализируется нулями. В ней изначально всякий мусор.
Это я про элемент “случайности”.

Это если из кучи хапать. А в сегменте инициализированных данных будут нули.

Это да.
Просто выделить память с адреса n по адрес n+ x, и , сложить, к примеру по-байтно, типа CRC )))

не факт что этот мусор случаен

1 лайк

Да, это так. На деле не проверял. Запрос был на идеи ))

На стеке ведь тоже можно

Спойлер
void setup() {
 Serial.begin(115200);
 uint8_t mass[1024];
 uint8_t chkByte;

 for(uint16_t i = 0; i < 1024; i++ )
   chkByte += mass[i];
   Serial.println(chkByte);
}

void loop() {
  // put your main code here, to run repeatedly:

}

При каждом новом включении выдаёт новое число - 78 , 110, 143, 169, 31, 207, 178…
Единым скрином не выложу, т.к. приходится при новом подключении (Nano к USB)каждый раз закрывать-открывать монитор
Если сразу ресет - значение не меняется, что ожидаемо.

Это большое число. Которое являет собой машинный код, который потом будет исполнен. Но пока мы вычисляем, это число.

Хочу вычислить число notepad.exe, например.

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

в принципе да. но желательно, чтобы он был не вырожденный не простой.
Допустим, мне нужно сгенерировать число 0x1234:

Могу выичислить его так:

a = 0x1233 + 1;

/то - слишком просто, \то - вырожденный алгоритм.

Что мы вычисляем:

У нас есть заданное число, которое представляет собой машинный код.
который будет исполнятся и что-то там делать (расшифровывать основное тело, например)

Переформулирую задачу, чувствую, что плохо объяснил:

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

RandomNumber := “0x87648726498702742983492873402987490234853427”

Есть большое число, “искомый результат”, оно известно заранее и не менеяется никогда. Это число НЕ случайное и на самом деле это число является машинным кодом, который потом будет исполнятся.

Result := “0x909090909090909090909090” // Intelx86 NOP; NOP; NOP;…

Нужно:

Найти нетривиальный, рандомный алгоритм, который из числа RandomNumber делает число Result. Число RandomNumber вшито в этот рандомный алгоритм. На выходе, после работы должен получиться Result

Желательно, чтобьы вычисления были ДОЛГИМИ. Не обяхательно запутанными, но долгими.

Т.е. нужен алгоритм, который будет генерировть “рандомный” код, который преобразует RandomNumber в Result:

f(RandomNumber) = Result;
f = ?

Книжку основ криптографии изучите. Тут даже на пальцах обьяснять не имеет смысла. Все что вы сделаете не имея классических знаний по криптографии будет уровня куличика из песка в детском саду.

1 лайк

Вам залипуха что-ли нужна?