1

我使用init-update-final机制计算哈希,即初始化哈希上下文,然后使用各种大小的输入数据进行哈希更新,最后进行摘要计算。这可以使用OpenSSL 的 EVP_DigestInit、EVP_DigestUpdate 和 EVP_DigestFinal_Ex 函数Crypto++ 的 Update 和 Final 方法来完成

从我可以从OpenSSLCrypto++的源代码中挖掘出来的内容,似乎输入数据实际上被复制和存储了。谁能证实这一点?这是散列过程的限制还是标准程序?这会随着使用的摘要算法而变化吗?

我的印象是散列算法会根据输入数据块计算一些内部状态,最终摘要将根据在所有各种更新调用中收集的内部状态来计算。情况似乎并非如此。显然,我对散列算法的机制还不够了解。

4

1 回答 1

1

从我可以从 OpenSSL 和 Crypto++ 的源代码中挖掘出来的内容,看起来输入数据实际上是被复制和存储的。谁能证实这一点?

是和不是。通常不存储输入。部分输入被缓冲,直到一个完整的块可供处理。

缓冲是散列状态的一部分。一旦消耗,如果遇到额外的部分块,则可以使用部分块的存储。当哈希对象被销毁时,部分块中的数据被擦除或归零。

可以存储多少数据取决于哈希的内部结构和块大小。对于像 MD5、SHA1 和 SHA512 这样的迭代散列,这种说法通常是正确的。但我不知道像 SHA3 这样的递归哈希函数。

该策略适用于 OpenSSL 和 Crypto++。

AttachedTransformation在 Crypto++ 的情况下,如果不存在,哈希的输出将在内部缓冲。


另请参阅Crypto++ wiki 上的Init-Update-Final 。它是最近添加的,于 2016 年 1 月添加。

于 2015-04-01T02:24:00.060 回答