【问题标题】:Uniform distribution of truncated md5?截断md5的均匀分布?
【发布时间】:2012-01-01 08:46:47
【问题描述】:

我们可以说截断的md5 哈希仍然是均匀分布的吗?

为避免误解:我知道,当您开始从md5 结果中删除部分时,发生碰撞的机会要大得多;我的用例实际上对 故意 冲突感兴趣。我也知道有 other hash methods 可能更适合较短哈希的用例(实际上包括我自己的),我肯定正在研究这些。

但我也很想知道md5 的均匀分布是否也适用于它的块。 (认为​​这是一种强烈的好奇心。)

因为 mediawiki 使用它(特别是最左边的两个十六进制数字作为结果的字符)来生成图像的文件路径(例如 /4/42/The-image-name-here.png),他们可能也对至少 near 感兴趣-均匀分布,我想答案是“是”,但我实际上并不知道

【问题讨论】:

  • 当我们在这里时,任何人都有很好的链接来证明非截断 md5 和的一致性?
  • @naught101:由于这个问题相当陈旧(通过互联网衡量)并且有一个公认的答案,因此不太可能从可以回答您问题的人那里获得更多曝光 - 也许自己提出问题? :)
  • 很好的跟进:ECDF plot from a truncated MD5
  • @Benjamin Awesome,谢谢你的链接!

标签: hash md5 distribution


【解决方案1】:

是的,不表现出任何偏见是加密哈希的设计要求。从密码学的角度来看,MD5 被破坏了,但结果的分布从未受到质疑。

如果您仍然需要说服,散列一堆文件、截断输出并使用 ent (http://www.fourmilab.ch/random/) 分析结果并不是一项艰巨的任务。

【讨论】:

  • 非常感谢 - 这正是我正在寻找的答案。
【解决方案2】:

我写了一个小 php 程序来回答这个问题。这不是很科学,但它使用自然数作为哈希文本显示了哈希值的前 8 位和后 8 位的分布。在大约 40.000.000 次散列之后,最高计数和最低计数之间的差异下降到 1%,所以我认为分布还可以。我希望代码在解释计算内容时更准确:-) 顺便说一句,通过类似的程序,我发现最后 8 位的分布似乎比第一个更好。

<?php
// Setup count-array:
for ($y=0; $y<16; $y++) {
  for ($x=0; $x<16; $x++) {
    $count[dechex($x).dechex($y)] = 0;
  }
}

$text = 1; // The text we will hash.
$hashCount = 0;
$steps = 10000;

while (1) {
  // Calculate & count a bunch of hashes:
  for ($i=0; $i<$steps; $i++) {   
    $hash = md5($text);
    $count[substr($hash, 0, 2)]++;
    $count[substr($hash, -2)]++;
    $text++;
  }
  $hashCount += $steps;

  // Output result so far:
  system("clear");
  $min = PHP_INT_MAX; $max = 0;
  for ($y=0; $y<16; $y++) {
    for ($x=0; $x<16; $x++) {  
      $n = $count[dechex($x).dechex($y)];
      if ($n < $min) $min = $n;
      if ($n > $max) $max = $n;
      print $n."\t";
    }
    print "\n";
  }
  print "Hashes: $hashCount, Min: $min, Max: $max, Delta: ".((($max-$min)*100)/$max)."%\n";
} 
?>

【讨论】:

  • 这太棒了。谢谢! (我想我可以/应该自己做这个,真的!)
猜你喜欢
  • 2011-04-04
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 2016-08-07
  • 1970-01-01
  • 1970-01-01
  • 2019-02-21
相关资源
最近更新 更多