代码之家  ›  专栏  ›  技术社区  ›  Martin

密码安全加法散列函数

  •  5
  • Martin  · 技术社区  · 14 年前

    我在做一个 Fountain Code 基于文件传输系统。在这个系统中,数据块被下载,并与一个异或函数结合在一起。我想在街区到达时核实一下。

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

    这样的事情存在吗?

    2 回复  |  直到 14 年前
        1
  •  6
  •   Nick Johnson    14 年前

    你想要的叫做 Homomorphic Hash . 我没有跟上最新的发展,但我看到的一个描述是非常-几乎不可能-缓慢的计算。原稿是 here ,并对其使用进行了一些改进 here .

    至于组合块,散列通常需要在素数字段中使用加法。如果你使用喷泉代码,你不必使用异或,尽管-任何可逆函数是好的,这包括加法。上面描述的散列用于素数字段中的加法和乘法,并且是可证明安全的。

        2
  •  9
  •   A. Rex    14 年前

    如果你要的身份是

    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.
    

    这意味着什么?

    ideal cryptographic hash function 有四种主要或重要的性质:

    • 找到具有给定哈希值的消息是不可行的,
    • 修改消息而不更改其哈希值是不可行的,

    当然,第一个属性可能是真的,但其余的则不是。反转散列函数就像求解 system of linear equations ,这很简单。我假设你已经对实数上的线性映射做了这个,但这里的方法是完全相同的。

    如果您发现 kernel 散列函数的,即消息 K 如此 Hash(K) 全部为零,则最后一个属性也将失败。带上任何信息 M M^K Hash(M^K) = Hash(M)^Hash(K) = Hash(M)^0 = Hash(M) . 找到内核元素也很容易。

    第三个属性有点难,但也可以被破坏。(例如,假设您正在散列一个合法的合同。找几个地方,可以修改一些零散的逗号或其他东西。考虑这些变化对hash函数的影响,然后求解一个线性方程组。)