摘要算法的流式计算
MD2、4、5和SHA的算法描述中,数据都是一次性读入,然后按分组长度计算的。如果数据量很大,这种方法显然就不可行。更理想的方案是将摘要算法视为一个流,不断向其中推入数据,每一次推入都执行摘要更新,并丢弃之前推入的数据。以MD2为例,其关键思路在于设置一个输入缓冲区和一个校验和,每次填入16个字节就触发一次摘要计算,并更新一次校验和,输出最终结果前,再对校验和的16个字节计算一次摘要。首先定义一组推入和终止操作:
MD2的算法输入为16字节,其推入数据的代码如下:
每一次存储数据超过16字节,就会触发一次摘要计算,多余出来的数据还要再次填入缓冲区里面。最终输出时,还要再对校验和计算一次摘要,代码如下:
摘要的实际计算部分代码如下: