⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readme.txt

📁 md5和sha-2的源码
💻 TXT
字号:
[ Big endian / little endian ]
  若内存字节为 01 02 03 04, 以大端( big endian )按4字节读出到变量中则为 0x01020304
以小端( little endian )按4字节读出到变量中则为 0x04030201。

  在数据处理时,是非常不方便的,如果数据指明按小端方式存放( little endian order ),则
为了兼容不big endian 与 little endian 主机,应该使用如下方式读取字节到变量中。

  假定变量 x 为 4 字节变量 ( DWORD ), p 为数据指针:
  x  =  ( *( unsigned char *)p & 0xff ) | 
        (  (*( unsigned char *)( p + 1 ) << 8 ) & 0xff00  )  |
        (  (*( unsigned char *)( p + 2 ) << 16 ) & 0xff0000 ) |
        (  (*( unsigned char *)( p + 3 ) << 24 ) & 0xff000000 );

  方法就是依次取出字节流中的字节,用或的方式将其嵌入到变量从低到高位的地方。
如果是在 little endian HOST 中, 这显示是有些笨拙。但如果考虑到兼容,不管在 little endian
还是 big endian 字序机上,X 都是 0x04030201


  反过来说,如果数据指明以大端方式存放( big endian order ),那么,同样可以用上列方式进行
兼容处理。
 
  假定变量 x 为 4 字节变量 ( DWORD ), p 为数据指针:
  x  =  ( (*( unsigned char *)p << 24 ) & 0xff000000 ) | 
        (  (*( unsigned char *)( p + 1 ) << 16 ) & 0xff0000  )  |
        (  (*( unsigned char *)( p + 2 ) << 8 ) & 0xff00 ) |
        (  (*( unsigned char *)( p + 3 ) & 0xff );

  同样,不管在哪种机器上,X都是 0x01020304



[ Md5 与 Sha1/Sha256 的数据块 ]
    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 对数据流的修改处理除了字节次序不同以外,情况完全相同。











⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -