如何找到一个简单哈希算法的碰撞

how do i find collision for a simple hash algorithm

本文关键字:哈希 简单 算法 碰撞 一个 何找      更新时间:2023-10-16

我有以下哈希算法:

    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

方法一:暴力破解。这没什么大不了的,因为你的"specialNum"总是在int的范围内,所以在平均尝试几十亿个输入值之后,你会找到正确的一个。几秒钟就能搞定。

方法二:蛮力,但聪明。

考虑处理最后一个ch之前的specialNum值。首先计算(specialNum * 32) + (specialNum/4) + ch. Since -128 <= ch <128或0 <= ch <根据char的签名,您知道结果的最高23位,与ch无关。使用specialNum对ch进行xor后,您还知道最高23位(如果ch是有符号的,最高23位有两种可能的值)。您检查这23位是否与所需的输出匹配,如果不匹配,则一次性排除所有256个ch值。所以暴力破解方法平均在1600万步之后就结束了。>

现在考虑处理最后两个ch之前的specialNum值。同样,您可以在不检查最后两个字符的情况下确定结果的最高14位(如果ch有四个备选符号)。如果最高的14位不匹配,就结束了。

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

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