Я разработал простой генератор случайных чисел, который циклически переключает два числа, используя метод умножения и модуля. Это прекрасно работает для этого.
Если бы я использовал его в качестве генератора шифров, он, однако, был бы уязвим для известной атаки открытым текстом, учитывая, что злоумышленник может произвести обратное проектирование начального числа из серии случайных чисел вычислительно эффективным способом.
Чтобы доказать, что шифр сломан, найдите правильную пару начальных значений, которые генерируют 7 нулей подряд в диапазоне [0; 255], используя как можно меньше энергии, времени ЦП и т. Д.
Вот генератор случайных чисел, написанный на JavaScript:
function seed(state1,state2){
//Constants
var mod1=4294967087
var mul1=65539
var mod2=4294965887
var mul2=65537
function random(limit){
//Cycle each state variable 1 step
state1=(state1*mul1)%mod1
state2=(state2*mul2)%mod2
//Return a random variable
return (state1+state2)%limit
}
//Return the random function
return random
}
//Initiate the random generator using 2 integer values,
//they must be in the ranges [1;4294967086] and [1;4294965886]
random=seed(31337,42)
//Write 7 random values in the range [0;255] to screen
for(a=0;a<7;a++){
document.write(random(256)+"<br>")
}
Я сделал инструмент для тестирования пар номеров кандидатов, его можно найти здесь .
В течение следующих 3 дней спойлеры запрещены , ответ должен содержать только набор чисел, и он, конечно, должен отличаться от тех, которые были опубликованы предыдущими решателями. После этого вам предлагается опубликовать код и объяснить свой подход.
Изменить, карантин окончен:
ответы должны содержать как уникальный набор чисел, так и пояснения и код для документирования метода решения.
Самое элегантное решение побеждает.
Для справки:
написание программы, которая может быстро найти решение, элегантно.
Создание программы, которая эффективно использует возможности графического процессора, чтобы сделать это еще быстрее, элегантно.
Делать работу над частью «музейной посуды» - это элегантно.
Найти метод решения, который можно реально использовать, используя только ручку и бумагу, очень элегантно.
Объяснять ваше решение поучительным и легко понятным способом - элегантно.
Использование нескольких или очень дорогих компьютеров не элегантно.
источник
Ответы:
C ++, 44014022/164607120
Он находится в C ++, использует 1 ГБ памяти и занял около 45 секунд, чтобы найти эту первую пару. Я обновлю время, когда он их всех найдет.
Код ниже. Сначала он находит все пары, которые генерируют 4 нуля, а затем сокращает их путем простого испытания (см.
check
Метод). Он находит пары, которые генерируют 4 нуля, генерируя два больших массива, один из которых содержит первые 4 младших байта генератора state1, а второй - отрицательный из первых 4 младших байтов генератора state2. Эти массивы затем сортируются и ищутся совпадения, которые соответствуют общему генератору, выводящему 4 нуля для запуска.Массивы слишком велики, чтобы их можно было хранить в памяти, поэтому они выполняют работу в пакетах, размер которых не помещается в памяти.
Похоже, полный цикл займет ~ 12 часов.
Изменить : Улучшен код, так что требуется всего ~ 1 час, чтобы получить все возможные семена. Теперь он генерирует таблицы в 256 разных файлах, по одному на каждый первый байт вывода. Затем мы можем обрабатывать каждый файл независимо, поэтому нам не нужно восстанавливать данные.
Изменить : Оказывается, вы можете генерировать 256 подтаблиц по отдельности, а не все сразу, поэтому диск не требуется. Время работы до ~ 15 минут с использованием 256 МБ.
источник