2010-03-10 31 views
2

我一直负责在Perl中为变长二进制字符串实现XOR哈希;长度可以从18到100多。在我对它的理解中,我用一个键对X的二进制字符串进行异或运算。我读过这个在线的两个不同的应用程序:XOR哈希如何工作+选择密钥

  1. 其中一个选项是如果我的密钥的长度比字符串短,我把字符串分成块的密钥长度;然后这些都被折叠在一起(因此得到的散列的长度将是密钥的长度)。
  2. 我也读过,你只是在字符串的每个关键字长度块之间进行异或操作(因此生成的哈希值将是字符串的长度)。

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

最后,有没有一种很好的方法来生成一个足够随机的密钥?根据要被散列的字符串的长度,是否有一个好的长度来选择密钥?

编辑:顺便说一下,我很清楚这个散列工作有多糟糕。这是严格的比较目的。 :)

+0

任何使用XOR的特定推理?这需要是可逆的吗?这也许是功课吗?只是好奇。 – 2010-03-10 01:58:24

+0

不要忘记,在使用XOR“加密”/散列时,可以使用以下任何两部分:密文,明文,密钥 - 查找其余部分。请谨慎行事;) – Cam 2010-03-10 02:02:05

+0

也是,你为什么要用钥匙?听起来不像是给我的散列。 – Cam 2010-03-10 02:06:55

回答

3

另一个替代方案,从here(搜索XOR散列)。

假设散列应该是x字节长,则将消息分解成x字节的块;并将它们放在一起。这与使用具有x 0的键的方法1实际上是相同的。 (或者,也可以从字符串的前x个字节开始,并忽略字符串的第一个字节。所有有趣的方式来思考它)

(还请注意关于XOR散列,也就是说它是坏的,非常糟糕)(粗略地说,它比其他选择更好,但是对于大量的哈希算法是不够的)

编辑:另一个小东西;如果方法1跨散列的所有二进制字符串使用相同的密钥;那么确实是重要的是什么。反对常数类似于,例如,ROT13<sarcasm>或者,如果您使用SHA1来为每个字符串派生一个密钥......这可能会使XOR散列好得多。</sarcasm>

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

+1'(另外请注意关于异或哈希的说法,即它是坏的,非常糟糕。)' – Cam 2010-03-10 02:02:30

+1

哈哈,我知道。这是为了比较而用更好的哈希值。 – 2010-03-10 02:06:02

0

第一种技术可以用来建立一个字符串的快速和肮脏的哈希值。

第二种技术可以用来创建一个快速,肮脏和非常不安全的字符串对称加密。

如果你想要一个散列,使用第一种方法(甚至更好,选择一个现有的哈希函数关闭的,现成的

关键的随机性不会是你最大的问题 - 整个技术是不安全的。

密钥越长,越独特的哈希值,你会得到,就越有可能你有一个碰撞。对于中等大小的数据集来说,碰撞非常罕见。

1

一般而言,你希望你的散列值都是一致的长度。你描述的第二种方法听起来像加密,你想恢复你的数据,第一种是单向散列。

1

XOR不是哈希一个真正好方法:

1是有点散的,因为你真的无法得到原始数据后面,带或不带钥匙。我建议使用sha2(224/256/384/512),md5,ripemd160或漩涡,如果可以的话

2是带有重复键的xor密码。这绝对不是一个散列。

如用于生成随机数,你可以发现,在十六进制产生无理数的程序(如pi:3.243F6A8885A308D313198A2E03707344A4093822299 ....)

+0

使用Pi的小数将不会是随机的... – Laurent 2010-03-10 04:17:53

+0

罚款,那么人们不会想到的一些其他无理数的十六进制值的小数部分,就像rad(53.3) – calccrypto 2010-03-13 23:38:59

0

如果你想执行一个“哈希”只使用XOR,我只需将字符串拆分成某些预定大小为X的块。不要忘了补偿输入字符串小于X.