У меня есть следующий прецедент:
- Чтение n байтов из файла
- Вычислить (MD5) хэш для этих n байтов
- Считать следующие m байтов из файла
- Вычислить (MD5) хэш для файла до n + m байтов
Постепенное хэширование файла не является проблемой, просто вызовите TransformBlock
и TransformFinalBlock
.
Проблема в том, что мне нужно несколько хэшей данных, которые разделяют начальные байты, но после того, как я вызвал TransformFinalBlock
для чтения Hash
из первых байтов n
, я не могу продолжать хеш с тем же объектом и нужен новый.
В поисках проблемы я увидел, что Python, а также OpenSSL имеют возможность скопировать хеширующий объект именно для этой цели:
hash.copy()
Вернуть копию ( "клонировать" ) хэш-объекта. Этот можно использовать для эффективного вычисления дайджестов строк, которые имеют общую начальную подстроку.
EVP_MD_CTX_copy_ex() может использоваться для копирования состояния дайджеста сообщения из в выход. Это полезно, если нужно хэшировать большие объемы данных которые отличаются только в последних байтах. выход должен быть инициализирован перед вызовом этой функции.
Как бы то ни было, я не могу найти ничего, что могло бы иметь значение с С# HashAlgorithm, что позволило бы мне эффективно Clone()
== скопируйте такой объект перед вызовом его метода TransformFinalBlock
- и затем продолжайте хешировать остальную часть данных с помощью клона.
Я нашел ссылку С# для MD5, которая может быть тривиально адаптирована для поддержки клонирования (*), но настоятельно предпочла бы использовать то, что вместо того, чтобы вводить такую вещь в кодовую базу.
(*) Действительно, насколько я понимаю, любой алгоритм Хеширования (в отличие от шифрования/дешифрования), который я пытался проверить, тривиально можно скопировать, потому что все состояние, которое имеет такой алгоритм, является формой дайджеста.
Итак, я что-то пропустил или стандартный интерфейс С#/.NET на самом деле не предлагает способ скопировать хеш-объект?
Другая точка данных:
Microsoft собственный API-интерфейс для криптографические службы имеет функцию CryptDuplicateHash
, в документах которого указано:
Функция CryptDuplicateHash может использоваться для создания отдельных хэшей двух разных содержимого, которые начинаются с того же содержимого.
Работает с Windows XP.: - |
Примечание. MD5: Вариант использования не является криптографически чувствительным. Просто надежный контроль файлов.