Достигают ли криптографические хеш-функции каждого возможного значения, например, они сюръективны? - PullRequest
27 голосов
/ 17 апреля 2010

Возьмите обычно используемую двоичную хеш-функцию - например, SHA-256. Как следует из названия, он выводит 256-битное значение.

Пусть A будет набором всех возможных 256-битных двоичных значений. A очень большой, но конечный.

Пусть B будет набором всех возможных двоичных значений. B бесконечно.

Пусть C будет набором значений, полученных при запуске SHA-256 для каждого члена B . Очевидно, что это не может быть сделано на практике, но я предполагаю, что мы все еще можем сделать математический анализ этого.

Мой вопрос: По необходимости C A . Но разве C = A ?

РЕДАКТИРОВАТЬ: Как было указано в некоторых ответах, это полностью зависит от рассматриваемой функции has. Итак, если вы знаете ответ для какой-либо конкретной хэш-функции, скажите, пожалуйста!

Ответы [ 5 ]

38 голосов
/ 17 апреля 2010

Во-первых, давайте отметим, что SHA-256 не принимает все возможные двоичные строки в качестве входных данных. Как определено FIPS 180-3 , SHA-256 принимает в качестве входных данных любую последовательность битов длиной менее 2 ^ 64 битов (то есть не более 18446744073709551615 битов). Это очень распространено; все хеш-функции так или иначе ограничены формальной длиной ввода. Одна из причин заключается в том, что понятие безопасности определяется в отношении вычислительных затрат; существует предел вычислительной мощности, который может собрать любой злоумышленник. Входные данные, превышающие заданную длину, потребуют больше, чем максимальная вычислительная мощность, чтобы просто оценить функцию. Короче говоря, криптографы очень осторожны с бесконечностью, потому что бесконечность имеет тенденцию препятствовать тому, чтобы безопасность была даже определена, не говоря уже о количественной оценке. Таким образом, ваш входной набор C должен быть ограничен последовательностями до 2 ^ 64-1 бит.

При этом давайте посмотрим, что известно о сюръективности хеш-функции.

Хеш-функции пытаются эмулировать случайный оракул , концептуальный объект, который выбирает выходные данные случайным образом при единственном ограничении, которое он «запоминает» предыдущие входы и выходы, и, если дан уже увиденный вход, возвращает тот же вывод, что и ранее. По определению, случайный оракул может быть доказан сюръективным только путем попытки ввода и исчерпания выходного пространства. Если выход имеет размер n битов, то ожидается, что потребуется около 2 ^ (2n) отдельных входов для исчерпания пространства вывода размера 2 ^ n . Для n = 256 это означает, что должно быть достаточно (в среднем) хеширования около 2 ^ 512 сообщений (например, всех сообщений длиной 512 бит). SHA-256 принимает входные данные намного длиннее, чем 512 бит (действительно, он принимает входные данные до 18446744073709551615 бит), поэтому весьма вероятно , что SHA-256 сюръективен.

Однако , не было доказано, что SHA-256 сюръективен, и это ожидается . Как показано выше, для доказательства сюръективности случайного оракула требуется очень много вычислительной мощности, значительно превышающей простые атаки, такие как прообразы ( 2 ^ n ) и столкновения ( 2 ^ (n / 2) ) ). Следовательно, хорошая хеш-функция «не должна» позволять фактическому доказательству такого свойства, как сюръективность. Это было бы очень подозрительно: безопасность хеш-функции проистекает из неразрушимости их внутренней структуры, и такая неразрывность должна решительно противостоять любой попытке математического анализа.

Как следствие, сюръективность формально не доказана ни для какой приличной хеш-функции, и даже для «сломанных» хеш-функций, таких как MD4. Это только «весьма подозреваемый» (случайный оракул с входными данными, которые намного длиннее выходных, должен быть сюръективным).

6 голосов
/ 17 апреля 2010

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

3 голосов
/ 17 апреля 2010

Это действительно зависит от хэш-функции. Если вы используете эту действительную хеш-функцию:

Int256 Hash (string input) {
    return 0;
}

тогда очевидно, что C! = A. Таким образом, "например, SHA256" - довольно важное замечание

Чтобы ответить на ваш актуальный вопрос: я верю в это, но я просто догадываюсь. Википедия не предоставляет никакой значимой информации по этому вопросу.

1 голос
/ 17 апреля 2010

Не обязательно.Это будет зависеть от хеш-функции.

Вероятно, было бы идеально, если бы хеш-функция была сюръективной , но есть вещи, которые обычно более важны, такие как низкая вероятность коллизий.

0 голосов
/ 17 апреля 2010

Это не всегда так. Однако качество, требуемое для алгоритма хеширования:

  • Мощность Б
  • Перераспределение хэшей в B (каждое значение в B должно иметь одинаковую вероятность быть хэшем)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...