Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 160位SHA1散列的前32位是否可以替代CRC32散列?_.net_Hash_Cryptography - Fatal编程技术网

.net 160位SHA1散列的前32位是否可以替代CRC32散列?

.net 160位SHA1散列的前32位是否可以替代CRC32散列?,.net,hash,cryptography,.net,Hash,Cryptography,我正在从事一个.NET3.5项目,需要一个32位哈希值。在.NET加密类中似乎没有任何方法返回32位哈希(MD5是128位,SHA1是160位,等等)。我实现了一个CRC32类,但是我发现已经存在的SHA1和MD5散列函数要快得多 如果我使用SHA1散列函数并中断前32位存储为我的散列值,是否会有任何问题(即冲突的可能性增加)?如果您不打算将32位用于加密目的,那么您应该可以。否则,我不会依赖于前32位与整个散列具有相同的分布 为什么不能使用更广泛的散列呢?CRC32可能适合您的需要。这一点已在

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


如果我使用SHA1散列函数并中断前32位存储为我的散列值,是否会有任何问题(即冲突的可能性增加)?

如果您不打算将32位用于加密目的,那么您应该可以。否则,我不会依赖于前32位与整个散列具有相同的分布


为什么不能使用更广泛的散列呢?

CRC32可能适合您的需要。这一点已在中讨论过

就截断散列原语而言,此原语唯一被大量使用的应用程序是用于生成密钥的。它使用HMAC、种子和标签,通过多次散列,然后截断到所需的字节数,生成所需的字节数

不过,对于您的具体问题,您可以将散列的输出读入Int32,如果您有妄想症,可以将它们异或在一起:

static void Main()
{
    int xorCrc = GetHashedCrc(new SHA1Cng(), new byte[] {0xDE, 0xAD, 0xBE, 0xEF});
}

private static int GetHashedCrc(HashAlgorithm algorithm, byte[] bytesToHash)
{
    byte[] hash = algorithm.ComputeHash(bytesToHash);
    int totalInt32s = hash.Length/sizeof(int);
    int result = 0;
    for(int i = 0; i < totalInt32s; i++)
    {
        int currentInt = BitConverter.ToInt32(hash, sizeof(int)*i);
        result = result ^ currentInt;
    }

    return result;
}
static void Main()
{
int xorCrc=GetHashedCrc(新的SHA1Cng(),新的字节[]{0xDE,0xAD,0xBE,0xEF});
}
私有静态int GetHashedCrc(HashAlgorithm算法,字节[]bytesToHash)
{
byte[]hash=算法.ComputeHash(bytesToHash);
int totalInt32s=散列长度/sizeof(int);
int结果=0;
对于(inti=0;i
假设散列函数在其编码域上平均分布其输入,那么假设它也将在其任何子集上平均分布似乎是合乎逻辑的。
但是,使用“本机”32位哈希函数可能仍然是更好的选择。也许有人能为我们提供一个更好的理由,而不仅仅是我的直觉:)

除非你想要CRC32的额外功能(作为一个线性代码),否则你应该可以将输出削减到32位

削减某些加密散列函数的输出是否会损害其抗冲突的安全性是一个公开的研究问题(“如果我没有记错的话,存在不自然的”构造示例)。但NIST(可能是在NSA批准的情况下)使用切割技术从SHA-256获得SHA-224(见)

编辑:CRC32允许检测(或纠正)单位错误,而加密哈希函数应具有无法找到具有相同哈希值的两个输入的属性


你知道“生日悖论”吗?使用32位校验和,当您有大约2^16个输入时,您希望得到冲突(即,两个具有相同哈希值的输入),并且您希望哈希更多的输入。(重新阅读您的评论这对您来说可能不是问题。)

为什么不使用string.GetHashCode()。它设计用于计算32位哈希值,并在给定真实数据的情况下产生少量冲突。当然,它不安全,但您的问题没有将其作为一项要求。

您在做什么,无法存储整个20个字符的SHA-1哈希?此外,CRC32不是散列,它是一种传输错误检测机制,因此如果需要错误检测,散列并不是真正的方法。选择4字节散列是为了节省空间。散列将用于对来自监控设备的数据块进行校验和,可能有1000万个数据块。我们会看到,也许存储整个东西不会成为问题。你说了些有趣的话。“传输错误检测机制”和散列之间到底有什么区别?加密强度(这个特定的应用程序不需要它)?不知羞耻的自我插件:cmdhashgen支持CRC32,并且是从HashAlgorithm派生的,所以它可以像其他应用程序一样使用,请查看CRC32.cs:类似的问题:我想说这正是我一直在寻找的问题,但没有找到。我从来没有这么幸运过。我有更好的运气输入标题,切换到问题区域,并看到什么建议弹出。如果我找到了我需要的东西,我就取消。坏主意。这只会增加复杂性,毫无益处。如果使用SHA1、HMAC等,则结果已经足够“随机”。切割的结果就是找到。例如,NIST建议使用较短的哈希(如SHA-224或SHA-384)或较短的HMAC。我只是在寻找一种使用所有位的方法,但你是对的,它不会造成安全性差异,并且会花费额外的指令。String.GetHashCode的缺点是在32位和64位模式下产生不同的结果。当微软发布新的.NET版本时,它也会时不时地改变。当您持久保存哈希,甚至通过网络发送哈希时,这就成了一个问题。