есть ли какая-нибудь функция $f : \text{seed}, \text{диапазон}, \text{состояние} \mapsto n$,
Да; они известны как Формат, сохраняющий шифрование функции. Это функции, которые представляют собой блочные шифры произвольного размера:
- Требование 1: Выходной диапазон может быть небольшим. Например. от $0$ к $10^6$.
Да, они могут брать совсем небольшие дальности. По моему опыту, FPE, как правило, не любят действительно крошечные диапазоны (например, диапазон менее 100 значений); диапазона в миллион достаточно для тех, о которых я знаю
- Требование 2: Нет коллизий для разных семян
Если мы используем начальное число в качестве ключа FPE, а состояние — в качестве открытого текста FPE, это гарантировано — операция FPE обратима (то есть, переводя операцию FPE в режим расшифровки и передавая ей тот же ключ, она преобразует зашифрованный текст обратно в открытый текст), следовательно, два открытых текста не могут быть преобразованы в один и тот же зашифрованный текст.
Требование 3: Невозможно предсказать, какое будет следующее число, если не вызвать функцию $f$
Тоже верно; FPE предназначен для обеспечения безопасности (если вы не знаете ключ), поэтому единственный способ предсказать, как будет преобразован открытый текст, — это использовать ключ.
Функции FPE также требуют «настройки» (дополнительный вход, который не обязательно должен быть закрытым, который изменяет сопоставление, определенное шифрованием) — я бы предложил использовать диапазон как часть настройки (в дополнение к изменению того, как функция FPE работает внутри) - таким образом, вам не нужно беспокоиться о том, что функция с одним диапазоном пропускает информацию о функции с другим диапазоном.
Теперь, если вам нужен совет относительно того, какую функцию FPE использовать, лучшая из тех, что я нашел, это FF1 определено здесь функция; из того, что я посеял, оно кажется довольно твердым.