密码安全加法哈希函数

时间:2010-10-25 21:13:38

标签: language-agnostic math hash cryptography

我正在开发基于Fountain Code的文件传输系统。在此系统中,下载数据块,并与xor函数结合使用。我想在块到达时验证它们。

我需要的是加密安全散列函数,它具有以下属性:

哈希(A)^哈希(B)==哈希(A ^ B)

这样的事情存在吗?

注意:数据块必须与xor函数组合,散列可以与您喜欢的任何函数组合,只要它的计算成本相当便宜。

2 个答案:

答案 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;然后MM^K将具有相同的哈希值,因为Hash(M^K) = Hash(M)^Hash(K) = Hash(M)^0 = Hash(M)。找到内核的元素也很容易。

第三个属性有点困难,但也可以打破。 (例如,假设您正在散列法律合同。找到一些可以修改某些流浪逗号的地方。考虑这些变化对散列函数的影响,然后求解线性方程组。)< / p>

答案 1 :(得分:6)

您想要的是Homomorphic Hash。我不了解最新的发展,但我看到的那个非常 - 几乎不可行 - 计算速度慢。原始论文为here,对其使用进行了一些改进的后续工作是here

对于组合块,哈希通常要求您在素数域中使用加法。如果你正在使用喷泉代码,你不必使用xor,但是 - 任何可逆功能都可以,并且包括添加。上面描述的散列用于素数域中的加法和乘法,并且可证明是安全的。