Hash Digest Init Update Final机制是否复制输入数据?

Hash Digest Init Update Final机制是否复制输入数据?,hash,openssl,crypto++,digest,evp-cipher,Hash,Openssl,Crypto++,Digest,Evp Cipher,我使用init update final机制计算散列,即初始化散列上下文,然后使用各种大小的输入数据进行散列更新,并进行最终摘要计算。这可以使用或来完成 从OpenSSL和Crypto++的源代码中我可以发现,似乎输入数据实际上得到了复制和存储。有人能证实这一点吗?这是散列过程的限制还是标准过程?这会随着使用的摘要算法而变化吗 我的印象是,散列算法将基于输入数据块计算一些内部状态,最终摘要将基于在所有各种更新调用中收集的内部状态进行计算。情况似乎并非如此。显然,我对哈希算法的机制了解不够 从Op

我使用init update final机制计算散列,即初始化散列上下文,然后使用各种大小的输入数据进行散列更新,并进行最终摘要计算。这可以使用或来完成

从OpenSSL和Crypto++的源代码中我可以发现,似乎输入数据实际上得到了复制和存储。有人能证实这一点吗?这是散列过程的限制还是标准过程?这会随着使用的摘要算法而变化吗

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

从OpenSSL和Crypto++的源代码中我可以发现,似乎输入数据实际上得到了复制和存储。有人能证实这一点吗

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

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

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

该策略同时适用于OpenSSL和Crypto++

对于Crypto++,如果不存在
AttachedTransformation
,则哈希的输出将在内部缓冲


另请参见Crypto++wiki上的。这是最近添加的,于2016年1月添加