160位SHA1哈希的前32位是否可以替代CRC32哈希?

rav*_*ven 5 .net hash cryptography

我正在研究.NET 3.5项目,我需要一个32位的哈希值..NET Cryptography类中似乎没有任何返回32位散列的方法(MD5为128位,SHA1为160位等).我实现了CRC32类,但我发现已经存在的SHA1和MD5散列函数要快得多.

使用SHA1散列函数会不会出现任何问题(即碰撞的可能性增加),只是将前32位中断作为哈希值存储?

小智 8

除非你想要CRC32的额外功能(作为线性代码),否则将输出切换为32位应该没问题.

削减某些加密哈希函数的输出是否会损害其在抗冲突方面的安全性是一个开放的研究问题(如果我没记错的话,存在"非自然"构造的例子).但NIST(可能经过NSA批准)使用切割技术从SHA-256获取SHA-224(参见维基百科中的SHA文章).

编辑:CRC32允许检测(并且可能正确)单个位错误,而加密散列函数应该具有您找不到具有相同散列值的两个输入的属性.

你知道"生日悖论"(再看维基百科)?使用32位校验和时,如果有大约2 ^ 16个输入,并且希望散列更多输入,则可能会发生冲突(即,具有相同散列值的两个输入).(重读你的评论,这对你来说可能不是问题.)