Я работаю над проектом, который использует концепцию битовых обязательств для аутентификации информации.
Мне нужно безопасно выбрать комбинацию объектов из безопасного хэша, а затем распространить этот хэш позже. Тогда клиент знает, что только аутентифицированный сервер выбрал эту комбинацию объектов перед распространением хэша, из которого получена комбинация.
Другими словами, мне нужно детерминировано выбрать комбинацию объектов из криптографического ключа.
Я думаю, что адаптация это было бы неплохо следующим образом.
Пусть x будет хэшем, т. е. l-битным целым числом (l>128), полученным из безопасной хэш-функции или prf.
Я должен выбрать M объектов из набора N.
И пусть S будет набором выбранных объектов.
я утверждаю, что $log_2 C(M,N) > 128$.
инициализировать набор S пустым
для J := N-M + 1 до N сделать
T := (x mod J) + 1 \ эта строка изменена из ссылки выше из RandInt(1, J)
если T не находится в S, то
вставить Т в S
еще
вставить J в S
Основные вопросы:
Если дана комбинация M объектов из набора N, может ли кто-нибудь инвертировать приведенный выше алгоритм для получения хэша.
Если да, то знает ли кто-нибудь безопасный способ детерминированного выбора комбинации объектов из хеша?
Мне нужно детерминировано выбрать комбинацию объектов из криптографического ключа таким образом, чтобы можно было использовать грубую силу только для определения криптографического ключа, используемого для получения комбинации объектов M среди N. Чтобы инвертировать вышеизложенное, нужно было бы решить куча модульных арифметических задач. В противном случае я бы подумал, что функция «один к одному», которая может принимать целое число и получать комбинацию, также будет работать. Эта функция также должна быть эффективной.
Спасибо