2011-04-11 18 views
4

假设您可以访问您信任的输出正确的“oracle”实现。你会写什么测试来验证MD5实现的正确性?

最明显的做法似乎是通过实施运行一组已知的明文/散列组合,并查看它们是否按预期出现。通过生成随机明文(使用静态种子保持其确定性)并使用oracle来查找它们的散列,可以构建任意数量的这些情况。

我看到的主要问题是,它不能保证打到可能的角落案件。生成更多案例将减少错失案例的可能性,但有多少案例就足够了?

还有一个问题是指定这些随机明文的长度,因为MD5将任意长度的字符串作为输入。出于我的目的,我不关心长输入(比如说长度超过16个字节),所以如果事情变得更简单或者你可以简单地使用,那么你可以在你的答案中使用这是一个“特殊用途”MD5实现的事实如果一切都一样,则回答一般情况。

回答

3

如果你有算法错误,很可能每个散列都是错误的。哈希本质上是无情的。

由于大多数可能的错误都会很快暴露出来,所以您真的不需要那么多的测试。以覆盖主东西是边缘情况:

  • 长度= 0(输入为空)
  • 长度= 1
  • 长度= 16
  • 输入包含具有值的至少一个字节0
  • 重复在所述输入字节图案(这会是有意义的边缘情况下MD5?)

如果这些全部通过,也许与一个或两个以上的有代表性的测试沿输入,你可以对你的算法非常有信心。没有那么多边缘情况(除非更熟悉算法细节的人可以考虑更多)。

相关问题