В стандарте по SHA-1 написано, что хэшируемые данные должны дополняться до длины кратной 512. Нужно ли это делать, если размер данных итак кратен 512? Если да, то как разрешается след. ситуация —
— есть данные длиной например N*512
— вызовем N раз CryptHashData (нам никто это не запрещает)
Как CSP узнает, что последний блок надо дополнять?
Здравствуйте, aktz, Вы писали:
A>В стандарте по SHA-1 написано, что хэшируемые данные должны дополняться до длины кратной 512. Нужно ли это делать, если размер данных итак кратен 512?
Да, обязательно нужно. Согласно стандарту конечно Эта операция называется MD усиление и предназначена, чтобы хэш-значение ещё учитывало и длину сообщения.
A>Если да, то как разрешается след. ситуация - A>- есть данные длиной например N*512 A>- вызовем N раз CryptHashData (нам никто это не запрещает) A>Как CSP узнает, что последний блок надо дополнять?
Я так полагаю, последний блок дополняет CryptGetHashParam с флагом HP_HASHVAL
Здравствуйте, aktz, Вы писали:
A>В стандарте по SHA-1 написано, что хэшируемые данные должны дополняться до длины кратной 512. Нужно ли это делать, если размер данных итак кратен 512? Если да, то как разрешается след. ситуация - A>- есть данные длиной например N*512 A>- вызовем N раз CryptHashData (нам никто это не запрещает) A>Как CSP узнает, что последний блок надо дополнять?
Ага, в стандарте даже написано КАК это дополнение производиться.
Насчет ситуации — ИМХО будет дополняться каждый хэшируемый блок (а не последний).
Здравствуйте, Andir, Вы писали:
M>>Насчет ситуации — ИМХО будет дополняться каждый хэшируемый блок (а не последний).
A>Неверно.
Один умный человек (не я ) сказал: "Для серьезного исследователя не достаточно сказать "неправильно" — нужно указать как будет правильно".
Так вот, как правильно? По Вашему предыдущему ответу я понял, что дополнение производиться в момент получения собсвенно значения хэша? А не будет ли это зависеть от реализации провайдера?
ЗЫ Хеширование блоков с дополнением каждого, ИМХО не ухудшает свойст хэша, или я не прав? Если ухудшает, то с чем это связано?
Здравствуйте, mkopachev, Вы писали:
A>>Неверно.
M>Один умный человек (не я ) сказал: "Для серьезного исследователя не достаточно сказать "неправильно" — нужно указать как будет правильно".
Достаточно прочитать SHA-1 стандарт.
M>Так вот, как правильно? По Вашему предыдущему ответу я понял, что дополнение производиться в момент получения собсвенно значения хэша? А не будет ли это зависеть от реализации провайдера?
Каким образом? Для SHA-1 есть вполне ожидаемые от него значения, неожиданные действия приведут к неожиданному результату.
M>ЗЫ Хеширование блоков с дополнением каждого, ИМХО не ухудшает свойст хэша, или я не прав? Если ухудшает, то с чем это связано?
А что с блоками происходит? Складываются по модулю 2^[длина хэша в битах]?
Представим что я захешировал файл объёмом 1 Gb (не CryptoAPI) и выложил хеш этого файла на всеобщее обозрение, чтобы любой мог проверить, то что файл не изменён. Теперь с помощью навороченного CryptoAPI попробует проверить этот хеш, почти наверняка гигабайта оперативной памяти у него не найдётся, и поэтому хешировать он будет блоками ... соответственно результат в случае дополнения каждого блока будет другой. Достаточно очевидно, что это не так?
Здравствуйте, Andir, Вы писали:
M>>Так вот, как правильно? По Вашему предыдущему ответу я понял, что дополнение производиться в момент получения собсвенно значения хэша? А не будет ли это зависеть от реализации провайдера?
P.S. Я к сожалению с CryptoAPI не работал, но смотрел реализацию для .Net и проверял.
Всё что сказано насчёт CryptoAPI почерпнуто из MSDN. Как реализуются криптопровайдеры и что это вообще такое я достаточно плохо осведомлён Если есть другие сведения, то просьба приводить их со ссылками на соответсвующие источники.