Клонуйте RNG MT19937 з його виводу

Внутрішній стан MT19937 складається з 624 32-розрядних цілих чисел.

Для кожної партії з 624 результатів MT переставляє цей внутрішній стан. Регулярно змінюючи стан, MT19937 досягає періоду 2**19937, це гарно.

Кожного разу, коли MT19937 натискається, елемент його внутрішнього стану піддається функції відпуску, яка розсіює біти в результаті.

Функція відпуску є оборотною; ви можете написати функцію “untemper”, яка приймає вихідні дані MT19937 і перетворює їх назад у відповідний елемент масиву станів MT19937.

Щоб інвертувати перетворення відпуску, застосуйте дію, зворотню кожній операції в перетворенні відпуску в зворотному порядку. Існує два типи операцій у перетворенні відпуску, кожна з яких застосовується двічі; один — це XOR проти значення, зміщеного вправо, а інший — це XOR проти значення, зміщеного вліво, та AND-оване з магічним числом. Тож вам знадобиться код, щоб інвертувати операції «праворуч» і «ліворуч».

Після того, як у вас запрацює «untemper», створіть новий генератор MT19937, торкніться його для 624 виходів, “untemper” кожен з них, щоб відтворити стан генератора, і об’єднайте цей стан у новий екземпляр генератора MT19937.

Новий «зрощений» генератор повинен передбачати значення оригіналу.

Зупиниться і трішки подумайте

Як би ви модифікували MT19937, щоб зробити цю атаку важкою? Що станеться, якщо ви піддасте криптографічному хешу кожен відпущений вихід?