Что такое хэш SHA-256 одного бита 1?

Определение SHA-256 выглядит так, что ввод, состоящий из одного бита «1», имеет четко определенное хеш-значение, отличное от значения байта «01» (поскольку заполнение делается на основе длины ввода в битах).

Однако из-за проблем с порядком байтов и того факта, что никакие реализации, которые я могу найти, не поддерживают подачу отдельных битов, я не могу понять, что это за правильное значение.

Итак, каков правильный хэш 1-битной длины ввода, состоящего из бита «1»? (не 8-битный длинный ввод byte[] { 1 }).


person Roman Starkov    schedule 12.12.2010    source источник
comment
Вы можете вычислить его вручную: en.wikipedia.org /wiki/, но это довольно быстро стало бы довольно утомительным.   -  person MatrixFrog    schedule 12.12.2010
comment
извините, что добавил столько вопросительных знаков, глупый нижний предел комментариев.   -  person dan_waterworth    schedule 12.12.2010
comment
@Matrix проблема с этим псевдокодом заключается в том, что происходит некоторое волшебство, когда блок разбивается на слова w[0..15] - не совсем ясно, должно ли w[0] быть 0x00000003 или 0xC0000000 (или, действительно, должно ли оно быть должно быть w[15], содержащее одно из этих значений).   -  person Roman Starkov    schedule 12.12.2010
comment
@ Эрик, нет, это хобби. Почему, это имеет значение?   -  person Roman Starkov    schedule 12.12.2010
comment
поскольку это хобби, вас может заинтересовать RC4, который является потоковым шифром. Странно, чего вы пытаетесь добиться с помощью SHA2.   -  person Eric Fortis    schedule 12.12.2010
comment
и в RC4 тоже будет странно   -  person Eric Fortis    schedule 12.12.2010
comment
@ Эрик, что такого странного в том, что количество битов не кратно 8?   -  person Roman Starkov    schedule 12.12.2010
comment
@rom, тогда попробуйте это: webtoolkit.info/javascript-sha256.html Это выглядит как будто он предназначен для приема строки, но, возможно, вы могли бы изменить его, чтобы он принимал последовательность битов, или, по крайней мере, прочитать его и лучше понять алгоритм. (Для дополнительной оценки вернитесь к той части псевдокода Википедии, которая была неясной, и отредактируйте ее, чтобы сделать ее более понятной!)   -  person MatrixFrog    schedule 12.12.2010
comment
позвольте мне вычислить время для перебора 1 бита   -  person Eric Fortis    schedule 12.12.2010
comment
@ Эрик, кажется, ты думаешь, что нет причин вычислять хэш короткого ввода. Я могу дать вам один: проверка правильности реализации. Хэш 0-битного ввода можно использовать в качестве одного из тестовых примеров. . Две 1-битные строки также были бы удобны. Если вы не хотите отвечать на этот вопрос, то ни в коем случае не отвечайте, но я не понимаю, почему вы, кажется, считаете этот вопрос глупым.   -  person Roman Starkov    schedule 12.12.2010
comment
Итак, вы хотите использовать 256 бит, чтобы убедиться, что 1 бит был отправлен правильно. Как вы убедитесь, что хэш правильный с 2 ​​** 20?   -  person Eric Fortis    schedule 12.12.2010
comment
@ Эрик Фортис: я не вижу ничего странного в этом вопросе. Сами хэш-функции определены в терминах произвольно длинных битовых строк, так почему бы кому-то не заинтересоваться реальными вычислениями с такими произвольными битовыми строками. И для тестирования, очевидно, вы хотите проверить тривиальные случаи, такие как один бит или два бита.   -  person President James K. Polk    schedule 12.12.2010
comment
Тестирование реализации — веская причина. Мои извинения Рону.   -  person Eric Fortis    schedule 12.12.2010


Ответы (3)


ОК, согласно моей собственной реализации:

1-битная строка "1":

B9DEBF7D 52F36E64 68A54817 C1FA0711 66C3A63D 384850E1 575B42F7 02DC5AA1

1-битная строка "0":

BD4F9E98 BEB68C6E AD3243B1 B4C7FED7 5FA4FEAA B1F84795 CBD8A986 76A2A375

Я протестировал эту реализацию на нескольких стандартных входных данных, кратных 8 битам, включая 0-битную строку, и результаты были правильными.

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

person Roman Starkov    schedule 12.12.2010
comment
Я подтверждаю эти значения. Моя собственная реализация SHA-2 взята из sphlib ( saphir2.com/sphlib). Код C обрабатывает входные данные, длина которых не кратна 8. - person Thomas Pornin; 13.12.2010
comment
Также подтверждается реализацией Perl, которая принимает строки в двоичном кодировании. - person Roman Starkov; 17.12.2010

Не уверен, что правильно понял ваш вопрос.

SHA-256 работает с блоками размером 64 байта (= 512 бит). Это означает, что меньшие входные данные должны быть дополнены в первую очередь. Результат заполнения выглядит так:

For Bit 1:    1100000000000...00000000001
For Bits 01:  0110000000000...00000000010

Поскольку эти результаты различны, результаты следующих функций сжатия будут такими же. И, следовательно, значения хеша. В стандартном документе довольно подробно объясняется заполнение: http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf

person free_easy    schedule 12.12.2010
comment
не только SHA-256, я не могу придумать ни одного алгоритма, который не дополняет или не повторяет небольшие входные данные. - person Eric Fortis; 12.12.2010
comment
Размер блока для SHA256 составляет 512 бит, а не 256 бит. См. RFC: 4634 Алгоритмы безопасного хэширования США (SHA и HMAC-SHA), ietf.org/rfc/ rfc4634.txt - person Babu Srinivasan; 02.10.2011

Код C доступен в разделе 8 RFC 4634 для вычисления хэша данных, который не обязательно кратен 8 битам. См. методы с именами SHA*FinalBits(...).

person President James K. Polk    schedule 12.12.2010