Да, размер хеша SHA256 всегда одинаков. Получение размера путем запроса поставщика шифрования полезно, если вы работаете на более высоком уровне.
Представьте, что у вас есть общий класс хеш-функции:
class Hash {
bool Init(LPCWSTR pszAlgId) { BCryptGetProperty(m_AlgoProvider, BCRYPT_OBJECT_LENGTH, ...); m_data = malloc(); ... BCryptCreateHash(..., pszAlgId, m_data, ...) ... }
void AddData(LPCVOID p, SIZE_T cb) { ... }
DWORD GetHashSize() { BCryptGetProperty(m_HashObj, BCRYPT_HASH_LENGTH, ...); }
bool Finalize(LPVOID pHash) { ... }
};
Класс не знает алгоритм хешированияни размер хеша во время компиляции.
BCRYPT_OBJECT_LENGTH
- это размер внутренних данных, используемых функцией хеширования. Он одинаков для всех хешей определенного типа, реализованных конкретным поставщиком криптографии. Если вы поддерживаете только Windows 7 и более поздние версии, вы можете попросить Windows выделить эту память для вас, и вам не нужно запрашивать размер объекта.
Я считаю, что все свойства BCRYPT являются детерминированными после того, как криптообъект был должным образомсоздан / инициализирован, и вы можете кэшировать очевидные постоянные поля, такие как размеры и режимы. Такие вещи, как BCRYPT_INITIALIZATION_VECTOR
, очевидно, являются свойствами для каждого объекта и должны кэшироваться только для этого конкретного объекта.