Рейтинг:0

Перечисление значений из линейного конгруэнтного генератора java Random()

флаг mx

Во время моего исследования Java-приложения я обнаружил, что следующийInt(64) функция java.Случайный() class используется для генерации ключа шифрования.

Размер ключа 16 байт. Я знаю, что этот генератор не рекомендуется, потому что он уязвим. Особенно в этом случае значение каждого байта ключа выбирается из небольшого диапазона от 0x0 до 0x40.

Я уже ознакомился с тем, что можно предсказывать следующие значения – генератора с использованием предыдущих значений. Но в моем случае у meyan нет данных о предыдущих значениях (Ключ зашифрован и у меня нет доступа к его значениям), поэтому здесь речь идет об итерации по значениям ключа. Я не понимаю, как я могу использовать данные о том, что каждое следующее значение зависит от предыдущего (параметр oldseed)?

защищенный интервал следующего (целое количество бит) {
        длинный олдсид, некстсид;
        Семя AtomicLong = this.seed;
        делать {
            старое семя = семя.получить();
            nextseed = (старое начальное число * множитель + слагаемое) & mask;
        } while (!seed.compareAndSet(oldseed, nextseed));
        return (int)(nextseed >>> (48 бит));
}

Как уменьшить количество переборов для такого 16-байтового ключа?

fgrieu avatar
флаг ng
Получены ли 16 байтов с помощью next(6), что означает, что вы используете «от 0x0 до 0x40» для обозначения в [0, 0x40-1]? Тогда подсказка: предположите один поток во время генерации ключа и соответственно упростите то, что делает этот код. Затем найдите, какие биты начального числа влияют на 16-байтовый ключ.Сделайте вывод, сколько может быть таких 16-байтовых ключей и как их перенумеровать. Возможно, выясните, как выбирается начальное число, что может позволить намного быстрее перечислить фактический ключ.
Sergey Unk avatar
флаг mx
@fgrieu нет next(6) - используется nextInt(64). Это означает, что каждый байт 16-значного ключа представляет собой число в диапазоне [0;63] (десятичная система).
fgrieu avatar
флаг ng
Это понятнее, и включены ключевые байты от 0x0 до 0x3F. Пересмотренные советы в свете вышеизложенного: понять, как `nextInt(64)` использует `next(31)`, и почему `nextInt(64)` точно эквивалентен `next(6)`. Затем предположите один поток во время генерации ключа и соответственно упростите код вопроса. Найдите, какие биты начального числа влияют на 16-байтовый ключ. Сделайте вывод, сколько таких 16-байтовых ключей может быть и как перебрать их все с приемлемыми затратами. Возможно, выясните, как выбирается начальное число, что может позволить намного быстрее перечислить фактический ключ.

Ответить или комментировать

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