Быстрая генерация нового хэша SHA-1 для файла с добавленными к нему данными - PullRequest
0 голосов
/ 13 июля 2011

Вот мой сценарий:

  • У меня есть существующий файл, для которого я сгенерировал хеш SHA-1, но это не обязательно при текущем запуске моей программы. Итак, у меня есть хеш, но нет контекста хеша, с которого можно продолжить (т. Е. SHA_CTX в OpenSSL).
  • Я добавлю новые данные в тот же файл, и мне нужно пересчитать для него хэш SHA-1.

Итак, мой вопрос: возможно ли воспользоваться тем фактом, что у меня уже есть хэш для части файла, и просто продолжить вычисление нового хеша с этой точки, чтобы сэкономить время? Если так, как бы я поступил об этом?

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

1 Ответ

1 голос
/ 13 июля 2011

Вход в SHA-1 содержит длину сообщения и некоторые отступы. От Википедия :

Pre-processing:
append the bit '1' to the message
append 0 ≤ k < 512 bits '0', so that the resulting message length (in bits)
   is congruent to 448 ≡ −64 (mod 512)
append length of message (before pre-processing), in bits, as 64-bit big-endian integer

Это означает, что вы не можете просто продолжить дайджест SHA-1, поскольку он уже содержит в себе размер данных и заполнение для блока, для которого он был рассчитан.

Внутреннее состояние SHA-1 составляет 160 бит, без них вы не сможете рассчитать новый дайджест SHA-1 для более длинного блока. Вот почему у функций OpenSSL есть «последний» вызов - его нужно вызывать один раз в конце. До тех пор вы должны каким-то образом сохранять внутреннее состояние (с контекстом SHA-1 или другими способами).

...