|
发表于 2023-4-8 14:49:10
|
显示全部楼层
如果对背后的算法细节有一点了解就容易理解了。
MD5(以及很多的密码学 hash 算法)都遵从这样一个范式:有一组状态,不断根据新到来的输入更新这组状态,直到输入数据均被处理完毕,此时的状态进行一定的组合就得到了最终的结果。
MD5_CTX 就是这组状态存放的位置
MD5Init 进行初始化,也就是按照算法的设计将这组状态设置成合适的初始值
MD5Update 将新信息(数据)加入到考虑中,更新状态。
MD5 等算法是分块进行处理的,每累积到一定长度的数据后(即填满一块后)才会进行一次处理,而最后一块中需要写入已处理信息的总长度并进行填充使总长度变为块大小的倍数,因此需要 MD5Final 来进行最后这部分处理:告知输入数据已经结束,可以计算输入长度、进行填充并完成最后的一块或两块未处理数据的处理了。此处的 MD5Final 还兼顾了取出最终结果的功能,另一些库的设计中可能会将其分开,即 MD5Final 只负责填充和完成最后的一块或两块未处理数据的处理,另有专门的接口如 MD5HexDigest 将已经结束计算的 MD5_CTX 中的状态提取为输出 |
|