2010-03-10 30 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.