Md5 与 Sha 如何将大于64字节的数据分成多块

        Md5 与 Sha1/Sha256 都是以64字节的块作为计算单元的。而源数据流经过修整后必须是64字节的倍数,不足的将填充0。这样一来,算法所得到的数据将完全是一个个64字节的包,而算法也即对每个包进行迭代计算处理——用上一次计算得到的值对当前块进行计算。


    MD5与SHA1/SHA256都有最初的所谓的散列值,在送入第一个数据块之前,必须设置好特定的最初值。而当计算完第一个数据块后,这个散列值就会变化,当计算完所有的数据块后,就得到了这个数据流的散列值。

 

       Md5 对数据流尾部添加0x80标记,Md5默认数据流以little endian 方式存放。将0x80 字节追加到数据流尾部以后,源数据流的整个长度将会发生变化,考虑到还要添加8个字节的位长度,必须填充0 以使修改后的源数据流是64字节的倍数。

 

   这个情况分为以下二种情况:


    数据流的长度 mod 64 = N1, 也就是说最后一块数据块长度是N1字节。

 

    #1  N1 + 1 > 55,这个情况下,添加标志字节0x80后,最后一块数据块长度大于55 字节。这个时候,原始数据位长度就不能添加到这个块上。所以,这个块余下的字节将进行0 填充以形成一个64字节的块。在这个块计算完毕后,还要计算一个前面是 56 个0,后面8个字节是原始数据的位长度的块。  

 

    #2 N1 + 1 < 56,这个情况下,添加标志字节0x80后,8个字节的位长度也可以直接安放到数据块最后8个字节上,所以只需要在0x80后与最后8个字节之前填充0 即可。计算完这个块就是最后的散列值。 8个字节的数据位长度是没修改之前的数据流的字节长度 * 8(得到位的数目),以little endian 方式存放,也就是低4字节在前,高4字节随后。Sha 与MD5相近,也是要对数据流尾部添加0x80标记。不过Sha 默认数据流以 Big endian 方式存放,所以若
输入数据是little endian 类型的,需要进行转换处理。Sha最后的8个字节的位长度同样也是以Big endian 方式
存放。 Sha 对数据流的修改处理除了字节次序不同以外,情况完全相同。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值