BCryptGetProperty 调用是确定性的吗?

Włodzimierz O. Kubera

有人可以回答一个问题吗?

调用BCryptGetProperty 是确定性的吗?(在一个进程中运行时,它是否应该为调用中的相同参数返回相同的结果?)这个想法不是为了计算散列或加密而多次调用相同的函数。我知道,SHA256 的结果必须具有相同的大小,但有些元素不太明显(BCRYPT_OBJECT_LENGTH 等)

不同的

是的,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东西显然是每个对象的属性,应该只为该特定对象缓存。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章