Hash

如何創建可重新創建的雜湊?

  • May 25, 2022

我最近偶然發現了一段解釋賭場遊戲的 YouTube 影片。簡而言之,它們會為您的初始投資隨機生成一個乘數。這個乘數應該由雜湊值支持。賭場還向客戶提供第一個遊戲的初始雜湊值和每個後續滾動的乘數的雜湊值。客戶應該通過將隨機生成的雜湊應用於以下 P​​ython 函式來驗證它:

def get_prev_game(hash_code):
   m = hashlib.sha256()
   m.update(hash_code.encode("utf-8"))
   return m.hexdigest()

一遍又一遍地將生成的雜湊放入此函式當然應該會導致給出初始遊戲雜湊。

現在我的問題是:由於這個get_prev_game函式基本上是一遍又一遍地散列雜湊值,直到它得到第一個雜湊值,我真的想知道賭場一側的下一個雜湊值是如何創建的?這是否意味著他們必須創建一個與前一個雜湊值匹配的新雜湊值?我認為這應該是很難解決的問題。也許我錯過了一些東西。感謝您提前提供任何解釋!

PS:我不知道我是否可以發布 YouTube 影片,但它是 /watch?v=F1HA7e3acSI

編輯:我正在添加計算乘數的函式。從統計數據來看,這場比賽是贏不了的。我更感興趣的是他們如何生成新的雜湊值以及回溯以前的雜湊值是如何工作的。

def get_result(game_hash):
   hm = hmac.new(str.encode(game_hash), b'', hashlib.sha256)
   hm.update(salt.encode("utf-8"))
   h = hm.hexdigest()
   if (int(h, 16) % 33 == 0):
       return 1
   h = int(h[:13], 16)
   e = 2**52
   return (((100 * e - h) / (e-h)) // 1) / 100.0

這只是賭場的雜湊承諾,這不是原像問題。

在所有遊戲開始之前,賭場會選擇一個 $ seed $ 並對其進行雜湊處理 $ 2M $ 次。讓 $ H^{s}(m) $ 表示散列 $ m $ $ s $ - 級聯時間

$$ H^{s}(m) = \underbrace{H(H(\ldots (H(m) ))}_{s-times} $$

第一場比賽從 $ H^{2000000}(seed) $

當第二場比賽開始時 $ H^{1999999}(seed) $ 他們這樣說;

  • 看我們不是在使用隨機種子遊戲,我們是在我們的承諾。通過散列此遊戲雜湊並查看結果是前一遊戲的雜湊來檢查這一點。

$$ H^{2000000}(seed) = H(H^{1999999}(seed)) $$或通用的 $ i $ 第一場比賽(省略 $ 2000000-i+1 $ 為了清楚起見);

$$ H^{i}(seed) = H(H^{i-1}(seed)) $$

因此,他們可能會說服一些賭徒,但不能說服真正的密碼學家,因為最初的種子選擇不是基於公證人下的真正隨機性。

他們可以簡單地搜尋一個總是有利於賭場的種子,而不是依賴於加密雜湊的預期均勻隨機性。均勻隨機性只是告訴我們有 2M 級聯雜湊,賭場總是會失去。他們只會消除這些情況。

使用者無法找到未玩遊戲的雜湊值,因為 SHA-256 具有成本前映像阻力 $ 2^{256} $ . 他們只能驗證承諾是否正在進行。

賭場使用這些雜湊承諾的主要原因是向玩家保證,當他們玩遊戲時,他們的行為不會影響他們獲勝的機率。特別是賭注的變化。他們向您保證,當您打開遊戲時,會為您分配一個 2M 的乘數序列,並且您的電腦會在每次旋轉後進行檢查,以確保它們仍然兌現他們的承諾。

這樣,如果在 5 美元下注 100 次後,您決定將賭注降低到 25 美分,並且在第一次嘗試時您獲得了巨大的乘數,至少您知道他們不是故意的!

引用自:https://crypto.stackexchange.com/questions/98017