md5和sha1

来源:互联网 发布:js.com 编辑:程序博客网 时间:2024/05/01 06:38

    md5(message digest 5)和sha1(Secure Hash Algorithm)都是将信息hash成一个固定长度的摘要(分别为16个字节和20个字节),相当于信息指纹,用来唯一标识这段信息。这种转化是不可逆的,因为毕竟信息量不同,注意这点和压缩完全不同。压缩虽然也减少了信息的长度,但是是可逆的(解压)。所以信息摘要和压缩的目的完全不同。md5和sha1想对于原信息类似于一个人的指纹相对于人的整体,可以唯一标识这个人,但又不能代表这个人的一切。(当然md5和sha1都有可能产生碰撞:即两个不同信息形成了相同的信息指纹)。

   md5和sha1的核心就是hash函数。基本思路是将信息分成N个组,每组64字节。依次对每个组的64自己进行数学运算,得到一个16字节的信息摘要(对于sha1是20字节)。在计算每组信息摘要的时候会把上一组的结果也带进来进行 运行。初始化的16字节(用于第1组)为

md5:0x67452301,0xefcdab89,0x98badcfe,0x10325476

sha1:0x67452301,0xefcdab89,0x98badcfe,0x10325476,0xc3d2e1f0

   最后一组如果不足64字节会有相应的补位策略,这个就不详细描述了。

   总之经过运算后会得到16字节的一个信息摘要,但是每个字节可能超过了asicc码的范围(0-127),所以需要再次拆分,可以得到32个字节,这样就是可读信息了。

  类似这样的代码

        char tmp[3]={0};
        for(size_t i=0;i<ZEN_MD5_HASH_SIZE; ++i)
        {
            snprintf(tmp, sizeof(tmp), "%02X", result[i]);
             printf("%s",tmp);
        }