【问题标题】:How XOR Hash Works + Picking A KeyXOR Hash 的工作原理 + 选择密钥
【发布时间】:2010-03-10 01:52:00
【问题描述】:

我的任务是在 Perl 中为可变长度的二进制字符串实现 XOR 哈希;长度可以从 18 到超过 100。根据我的理解,我用一个键对我拥有的二进制字符串进行异或运算。我已经在网上阅读了这两个不同的应用程序:

  1. 其中一个选项是,如果我的密钥长度比字符串短,我将字符串分成与密钥长度相同的块;然后将它们全部折叠在一起(因此生成的哈希的长度就是键的长度)。
  2. 我还了解到,您只需对字符串的每个键长度块的键进行异或运算(因此生成的哈希将是字符串的长度)。

其中一个比另一个更正确吗?这是用于索引中的散列值,所以我倾向于认为第一个选项(可能会产生短散列)会更好。

最后,有没有生成足够随机密钥的好方法?根据要散列的字符串的长度,是否有合适的密钥长度可供选择?

编辑:顺便说一句,我非常清楚这个哈希值有多糟糕。严格来说是为了比较。 :)

【问题讨论】:

  • 使用 XOR 有什么特别的原因吗?这需要可逆吗?这也许是家庭作业?只是好奇。
  • 不要忘记以下任何两个部分:密文、明文、密钥 - 当您使用异或“加密”/散列时,可用于查找剩余部分。谨慎行事;)
  • 还有,你为什么用钥匙?对我来说听起来不像是哈希。
  • 不,不是作业——刚做了一些项目工作,我想比较不同的哈希值,我听说过 XOR 哈希值,但从未使用过。这里也不需要加密。我对 XOR 散列的理解(来自在线某处)是用于 XORing 的密钥 - 否则,您是否只需将原始字符串折叠在一起并 XOR ,而不使用密钥?

标签: hash indexing xor


【解决方案1】:

另一种选择,来自 here(搜索 XOR 哈希)。

假设哈希应该是 x 字节长,将消息分成 x 字节的块;并将它们异或在一起。这实际上与使用带有 x 0 键的方法 1 相同。 (或者,或者,从字符串的前 x 个字节的键开始,忽略字符串的第一个字节。各种有趣的方式来思考它)

(另请注意关于 XOR 哈希的说法,即它很糟糕。非常糟糕。)(粗略地说。它比其他方法更好,但对于很多哈希的用途来说,这还不够)

编辑:另一件小事;如果方法 1 在所有经过哈希处理的二进制字符串中使用相同的键;那么 真的 关键是什么并不重要。对常数进行异或运算类似于ROT13<sarcasm>Alternatively,如果您使用 SHA1 为每个字符串派生一个密钥...这可能会使 XOR 哈希更好。</sarcasm>

key xor key == 0 //always
key xor (((key xor msg1) xor msg2) xor msg3) 
== (msg1 xor msg2 xor msg3)

【讨论】:

  • +1 (Also note what is said about XOR hashing, namely that it is bad. Very bad.)
  • 哈哈,我知道了。这是为了与更好的哈希值进行比较。
【解决方案2】:

通常,您希望哈希值的长度一致。您描述的第二种方法听起来像是要恢复数据的加密,第一种是单向哈希。

【讨论】:

    【解决方案3】:

    xor 并不是一个很好的哈希方法:

    1 有点像哈希,因为无论有没有密钥,您都无​​法取回原始数据。如果可以的话,我建议使用 sha2 (224/256/384/512)、md5、ripemd160 或漩涡

    2 是具有重复密钥的异或密码。这绝对不是哈希。

    至于生成随机数,你可以找到生成十六进制无理数的程序(如 pi: 3.243F6A8885A308D313198A2E03707344A4093822299....)

    【讨论】:

    • 好吧,然后是其他一些人们想不到的无理数的十六进制值的小数部分,比如rad(53.3)
    【解决方案4】:

    第一种技术可用于创建字符串的快速且脏的散列。

    第二种技术可用于创建快速、肮脏且极不安全的字符串对称加密。

    如果您需要哈希,请使用第一种方法(或者更好的是,选择现成的现有哈希函数。)

    密钥的随机性不会成为您最大的问题 - 整个技术是不安全的。

    密钥越长,您获得的哈希值越不同,发生冲突的可能性就越小。对于中等规模的数据集,很快就会发生碰撞。

    【讨论】:

      【解决方案5】:

      如果您想执行仅使用 XOR 的“哈希”,我只需将字符串拆分为某个预定大小 X 的块。当输入字符串小于 X 时,不要忘记以某种方式进行补偿。

      【讨论】:

        猜你喜欢
        • 2016-12-30
        • 2016-09-19
        • 1970-01-01
        • 2015-03-10
        • 2014-06-28
        • 1970-01-01
        • 2011-02-09
        • 1970-01-01
        • 2015-03-12
        相关资源
        最近更新 更多