我正在开发基于Fountain Code的文件传输系统。在此系统中,下载数据块,并与xor函数结合使用。我想在块到达时验证它们。
我需要的是加密安全散列函数,它具有以下属性:
哈希(A)^哈希(B)==哈希(A ^ B)
这样的事情存在吗?
注意:数据块必须与xor函数组合,散列可以与您喜欢的任何函数组合,只要它的计算成本相当便宜。
答案 0 :(得分:9)
如果您要求的身份完全是
Hash(A) ^ Hash(B) == Hash(A ^ B)
然后不,没有这种加密安全散列函数是可能的。这是因为从可能的块空间到可能的哈希空间,您的函数将是linear map(超过field with two elements)。
好吧,假设您的地图采用长度为6的块并返回长度为3的哈希值,并且这些是一些哈希值:
Hash(000001) = 010
Hash(000010) = 111
Hash(000100) = 001
Hash(001000) = 101
Hash(010000) = 110
Hash(100000) = 001
然后,您可以通过上述线性组合计算任何给定块的哈希值。例如,
Hash(101000) = Hash(100000) ^ Hash(001000) = 001 ^ 101 = 100.
这意味着您的哈希函数可以用6乘3矩阵表示。
维基百科将ideal cryptographic hash function定义为具有四个主要或重要属性:
当然,第一个属性可能是真的,但其余属性不是。反转哈希函数就像求解system of linear equations一样简单,这很容易。我假设你已经为实数上的线性映射做了这个,但是完全相同的方法在这里工作。
如果找到散列函数的kernel的元素,即消息K
,使Hash(K)
全为零,则最后一个属性也会失败。接受任何消息M
;然后M
和M^K
将具有相同的哈希值,因为Hash(M^K) = Hash(M)^Hash(K) = Hash(M)^0 = Hash(M)
。找到内核的元素也很容易。
第三个属性有点困难,但也可以打破。 (例如,假设您正在散列法律合同。找到一些可以修改某些流浪逗号的地方。考虑这些变化对散列函数的影响,然后求解线性方程组。)< / p>
答案 1 :(得分:6)
您想要的是Homomorphic Hash。我不了解最新的发展,但我看到的那个非常 - 几乎不可行 - 计算速度慢。原始论文为here,对其使用进行了一些改进的后续工作是here。
对于组合块,哈希通常要求您在素数域中使用加法。如果你正在使用喷泉代码,你不必使用xor,但是 - 任何可逆功能都可以,并且包括添加。上面描述的散列用于素数域中的加法和乘法,并且可证明是安全的。