【问题标题】:how do i find collision for a simple hash algorithm我如何找到简单哈希算法的冲突
【发布时间】:2015-08-16 03:36:45
【问题描述】:

我有以下哈希算法:

    unsigned long specialNum=0x4E67C6A7;
    unsigned int ch;
    char inputVal[]="                        AAPB2GXG";


    for(int i=0;i<strlen(inputVal);i++)
    {
        ch=inputVal[i];

        ch=ch+(specialNum*32);
        ch=ch+(specialNum/4);

        specialNum=bitXor(specialNum,ch);
    }

    unsigned int outputVal=specialNum;

bitXor 只是进行 Xor 操作:

int bitXor(int a,int b)
{
    return (a & ~b) | (~a & b);
}

现在我想找到一个算法,当给定 outputVal 时,可以生成一个“inputVal”。(生成的 inputVal 可能不一定与原始 inputVal 相同。这就是我想要发现碰撞)。 这意味着我需要找到一个算法来生成一个解决方案,当输入上述算法时,结果与指定的“outputVal”相同。 要生成的解的长度应小于或等于32

【问题讨论】:

  • 您确实知道编写了许多散列函数,因此获取原始值非常困难,因为这通常是一种加密技术(尽管散列函数更复杂)。
  • 您意识到您的哈希函数只返回适合 int 范围的值?
  • 由于birthday paradox查找 a 冲突并不难。然而,找到一个与另一个 fixed 值给出相同哈希值的值将很难,并且与计算所有整数的哈希码相当
  • @gasher729,是的,所有计算的值都适合 unsigned int
  • @Ivaylo 冲突意味着对于两个不同的输入值,哈希函数的结果是相同的。对吧?这就是我要问的问题。

标签: c++ algorithm hash reverse-engineering hash-collision


【解决方案1】:

方法一:蛮力。没什么大不了的,因为你的“specialNum”总是在一个 int 的范围内,所以在平均尝试了几十亿个输入值之后,你会找到正确的。应该在几秒钟内完成。

方法2:蛮力,但很聪明。

在处理最后一个 ch 之前考虑 specialNum 值。您首先计算 (specialNum * 32) + (specialNum / 4) + ch。由于 -128

现在考虑处理最后两个 ch 之前的 specialNum 值。同样,您可以确定结果的最高可能 14 位(如果 ch 用四个替代项进行签名),根本不需要检查最后两个字符。如果最高 14 位不匹配,您就完成了。

方法3:这就是你的做法。依次考虑所有长度为 0、1、2 等的字符串 s(但是,您的算法很可能会更快地找到解决方案)。处理完字符串 s 后计算 specialNum。按照您的算法并允许对 char 进行签名,在处理另外两个字符后,找到 specialNum 的最高 14 位可能具有的最多 4 个不同的值。如果其中任何一个与所需的输出匹配,则在处理下一个字符的 256 个可能值中的每一个后检查 specialNum 的值,并在检查另一个字符后找到 specialNum 的最高 23 位可能具有的最多 2 个不同的值。如果其中一个与所需输出的最高 23 位匹配,则在处理完 256 个可能的下一个字符中的每一个后检查 specialNum 是什么并寻找匹配项。

这应该在一毫秒以下工作。如果 char 是无符号的,它会更快。

【讨论】:

  • 感谢您的回答。但很遗憾,我无法理解方法 2 和 3。请您仅用代码或伪代码解释方法 3。我将不胜感激。
  • 如何在 c 中实现方法 3?
猜你喜欢
  • 2013-11-12
  • 2016-08-02
  • 2010-10-15
  • 1970-01-01
  • 2011-11-10
  • 2014-04-10
  • 2011-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多