Рейтинг:2

Преимущества хэширования определенного семени в PRNG

флаг il

Этот вопрос связан с этот вопрос (stackoverflow) где я спросил о конкретных деталях реализации генератора случайных чисел Python (Mersenne Twister). Здесь у меня немного другая направленность. Не стесняйтесь закрывать, но я не смог найти аналогичный вопрос, который точно отвечал бы на мой вопрос.

  • В PRNG какая польза от хэширования определенного семени (предоставленного пользователем)?
  • Были бы какие-то дополнительные преимущества, если бы применялась соль?

Например, в случае Pythons они делают и то, и другое, где используемая соль — это само семя.

РЕДАКТИРОВАТЬ: Меня спрашивают о варианте использования, на который я затрудняюсь ответить? Изучая реализацию нескольких PRNG на нескольких популярных языках, кажется, что они всегда хэшируют/солят/модифицируют начальное число, предоставленное их пользователями. См. например https://github.com/python/cpython/blob/a57ec7a4feaf24f470a9d1e5b1b3f2cb1b062af7/Lib/random.py#L157

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

AleksanderCH avatar
флаг nl
Отвечает ли это на ваш вопрос? [Свойства PRNG/хэшей?](https://crypto.stackexchange.com/questions/277/properties-of-prng-hashes)
флаг il
@AleksanderCH К сожалению, это не так, вопрос касается преимущества _всегда_ хеширования семени. (Что я мог бы увидеть, если бы вы указали время или что-то еще). Здесь я спрашиваю, какие преимущества это будет иметь, когда мы устанавливаем начальное значение вручную.
kodlu avatar
флаг sa
каков вариант использования такой практики? вам нужно дать более подробную информацию в вопросе
SAI Peregrinus avatar
флаг si
PRNG должен выводить одну и ту же последовательность для данного начального числа. CSPRNG не должен, если он вообще принимает управляемое пользователем начальное число, он должен смешивать его с другими источниками энтропии перед использованием. Связанный вами Python является обычным PRNG, он просто хэширует ввод, чтобы убедиться, что он имеет правильное количество байтов для следующих операций.
Paul Uszak avatar
флаг cn
@SAIPeregrinus Ре. _"CSPRNG не должен"_. Вы уверены? Есть ли шанс, что вы смешиваете CSPRNG с TRNG? ChaCha, SecureRandom и все RNG на основе блочного шифра считаются CSPRNG. Тем не менее, все они детерминированы.
SAI Peregrinus avatar
флаг si
ChaCha — это потоковый шифр, а не CSPRNG. CSPRNG детерминированы по определению (это P). Они также не полагаются исключительно на пользовательский ввод для энтропии в какой-либо практической реализации (SecureRandom не использует, getrandom() не использует, CryptGenRandom не использует и т. д.). CSPRNG *должны* получать входную энтропию от HWRNG, если он доступен, и от других аппаратных источников, если нет.Вы можете построить CSPRNG из потокового шифра, но потоковый шифр не обязательно является CSPRNG.
Рейтинг:1
флаг fr

Когда мы запускаем любой тип PRNG, у нас могут быть данные, которые неоднородны по своей энтропии. Например, возможно, наш единственный источник криптографически защищенной случайности — это набор случайных строковых UUID. Однако в большинстве реализаций PRNG мы хотим, чтобы наша случайность была однородной и имела фиксированный размер. Чтобы получить это, нам нужен какой-то способ преобразовать входные данные в соответствующий размер, и хеш-функция — простой способ сделать это.

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

Когда мы используем CSPRNG, используемый нами алгоритм является детерминированным, но мы хотим заполнить его входными данными с достаточной энтропией, чтобы гарантировать, что его вывод нельзя будет угадать. То есть наша цель — недетерминированный вывод. В некоторых проектах выбрана принудительная однородная энтропия входных данных, но в большинстве проектов используется какая-то функция вывода, например та, что используется в CTR_DRBG, чтобы разрешить неравномерные входные данные. Иногда эти алгоритмы основаны на хеш-функции, а иногда нет. Например, CTR_DRBG использует функцию вывода на основе блочного шифра, чтобы сделать весь алгоритм реализуемым только с реализацией AES. HMAC_DRBG использует в этой роли HMAC, основанный на хеше.

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

В некоторых случаях мы используем дизайн CSPRNG для детерминированного вывода, который неотличим от случайного, и соль здесь полезна. Например, в RFC 6979, описывающем детерминированные DSA и ECDSA, мы используем HMAC_DRBG для создания случайного значения. $к$. Закрытый ключ — это наша энтропия, а хэш сообщения — это соль, и оба они необходимы для безопасности.

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

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