2016-05-15 79 views
0

因此,对于某个任务,我被要求在2个随机的64字节序列之间找到对SHA256摘要的前n位(n将是4,8 ......)的冲突,即在哈希中查找冲突

SHA256Managed hashstring = new SHA256Managed(); 
byte[] hash_1 = hashstring.ComputeHash(a); 
... 

我计算了哈希值的字符串值,

string hashString = string.Empty; 
foreach (byte x in hash) 
{ 
    hashString += String.Format("{0:x2}", x); 
} 
return hashString; 

我使用字符串匹配功能,第一提取物,说的第8位:

string first8Char_hash1 = new string(hashDisplay(hash_1).Take(8).ToArray()); 

检查,如果先说,8位匹配与否,即

if (first8Char_hash1.Equals(first8Char_hash2)) 
{ 
    //Do something 
} 

现在,如果我这样做,说的第4位,我觉得中说碰撞的平均12000次迭代,但是,对于第8位,以及我无法连1之后找到了碰撞, 00,00尝试。

有什么问题? 谢谢。

+1

您正在通过将字节转换为可迭代来比较字节,然后将其转换为数组,然后将其转换为字符串;你能想出一个更好的方法来比较字节的平等吗? –

+0

“直到程序崩溃”出现什么错误? 'OutOfMemoryException'?另外,我不会使用LINQ并调用'Take(8)',然后调用'string.Equals()',但只要使用标准的'for'循环,并且只要一个位不匹配。 –

+2

你已经混淆了字节的位。字节是八位。 –

回答

2

当您以十六进制打印数字时,每4位变为一个十六进制字符。如果你想在前4位中找到冲突,你比较一个字符而不是四个。四个字符对应于16位冲突。

对于八位,比较十六进制字符串的前两个字符。

+0

谢谢。我很蠢! –

+1

这当然是一个问题,但这里有一个更大的问题;应该在大约10次尝试中检测到前四位内的冲突,而不是12000次。我认为OP对比特和字节之间的差异感到困惑。 –

+1

二进制转换代码的权利是'Convert.ToString(x,2).PadLeft(8,'0');'而不是你所拥有的'{0:x2}'格式说明符 –