• 待加密的字符串被切割成n个长度为512位的消息块,最后一块若不足448位,用1+多个0进行补位,最后64位填充字符串长度

  • 每个消息块会根据上一组产生的registers(链变量)的值进行 复杂的数学变化 生成新的registers值.所以在算法可行的情况下,保证初始链变量唯一,即能保证所有的链变量都唯一.图二的 register值0 就是MD5加密算法的初始链变量.

  • 而链变量经过高低位互换后就是我们计算出来的md5值

    攻击原理

    往往加密时,会采取如此的方式进行
    md5($secret+$message)

    而只要我们掌握 $secret的长度 md5($secret+某一字符串)的值 某一字符串的内容
    我们就能推出 md5($secret+另一字符串)的值 ,此字符串和已知的字符串相关

    举例
    现已知 md5($secret+'admin') 值和 $secret的长度为15个字符
    根据上文提到的原理我们可以大致得到 $secret+'admin' 生成的消息块如下
    test
    由MD5加密原理可知链变量就是hash值的高低位转化,也就是我们得到了上图消息块所生成的链变量
    我们在上面的消息块后再添加些字符串
    test
    AAAAAAAAAAAAAAA\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0a\00\00\00\00\00\00\00test 的hash值我们也就能计算到了
    计算方法就是用上文得到的链变量代替初始链变量,根据md5算法计算test的值,得到的就是我们构造的字符串的hash值

    脚本

    我们只需要找到一个实现MD5的py脚本,将其初始链变量改为我们的想要的值就行了
    但每次这样操作未免有些麻烦,我们可以使用HashPump来直接生成我们想要的东西
    具体操作参见
    哈希长度扩展攻击的简介以及HashPump安装使用方法

    参考博客

    哈希长度拓展攻击(Hash Length Extension Attacks)
    哈希长度扩展攻击的简介以及HashPump安装使用方法
    hash长度扩展攻击
    Hash长度扩展攻击

  •