В этой статье говорится, что
Несмотря на то, что Mersenne Twister является чрезвычайно хорошим генератором псевдослучайных чисел, он сам по себе не является криптографически защищенным по очень простой причине. Можно определить все будущие состояния генератора по состоянию, которое имеет генератор в любой момент времени, и для обеспечения этого состояния достаточно либо 624 32-битных выходов, либо 19 937 однобитных выходов. Использование криптографически защищенной хеш-функции, такой как SHA-1, на выходе Mersenne Twister было рекомендовано в качестве одного из способов получения потока ключей, полезного в криптографии.
Но нет никаких ссылок на то, почему переваривание вывода сделало бы его более безопасным. И, честно говоря, я не понимаю, почему это должно быть так. Твистер Мерсенна имеет период 2 ^ 19937-1, но я думаю, что мои рассуждения также применимы к любому периодическому PRNG, например, Линейные конгруэнтные генераторы, а также. Из-за свойств безопасной односторонней функции h можно думать о h как о инъективной функции (в противном случае мы могли бы создавать коллизии), таким образом, просто отображая значения из ее области в свой диапазон однозначным образом.
Имея в виду эту мысль, я бы сказал, что хэшированные значения приведут к точно такому же периодическому поведению, что и оригинальная версия Mersenne Twister. Это означает, что если вы наблюдаете все значения за один период и значения начинают повторяться, то вы вполне можете предсказать все будущие значения.
Я предполагаю, что это связано с тем же принципом, который применяется в шифровании на основе паролей ( PKCS # 5 ) - поскольку домен паролей не обеспечивает достаточной энтропии, просто хеширование паролей не дает добавьте любую дополнительную энтропию - вот почему вам нужно подсолить пароли, прежде чем их хешировать Я думаю, что здесь применяется точно такой же принцип.
Один простой пример, который окончательно убедил меня: предположим, у вас очень плохой PRNG, который всегда выдаст «случайное число» 1. Тогда даже если SHA-1 будет идеальной односторонней функцией, применяя SHA-1 к результат всегда будет давать одно и то же значение, что сделает выход не менее предсказуемым, чем раньше.
Тем не менее, я хотел бы верить, что в этой статье есть доля правды, поэтому наверняка я что-то упустил. Можете ли вы помочь мне? По большей части, я исключил начальное значение из моих аргументов - может быть, именно здесь происходит магия?