Troika 雜湊函數介紹

YuWei Wu
3 min readJan 13, 2019

--

Troika 是一個用海綿建構 (sponge construction)的三進制雜湊函數。在三進制中,trit 為最小位元代表 {0, 1, 2}(當然在平衡三進制會是 {-1, 0, 1} 不過不影響此函數計算),tryte 由三個 trit 組成代表 {0 … 26},可以把 trit 和 tryte 與二進制的 bit 與 byte 做對應。

圖一:海綿建構概覽

海綿建構

海綿建構主要由三個部分組成:

  • 記憶體狀態(state):上圖的 rate (r) 243 trits 和 capacity (c) 486 trits,總共為 729 trits
  • 能夠置換 (permutation) 記憶體狀態的函數 (f):下文會介紹 Troika 每輪所做的置換動作
  • 填充函數:在 Troika 中是將欲進行處理的訊息以每 243 trits 分成一段 (上圖 m0, m1…),每輪按照順序位置直接填入狀態中

然後海綿函數會分成兩大階段進行:

  • 吸收(absorb):依序按照填充函數將訊息填入狀態並進行置換函數,直到訊息均填入
  • 擠出(squeeze):吸收完後擠出 rate 即為第一段結果,如果長度不足的話,在對狀態進行置換函數然後取出下一次 rate,重複這樣的動作直到滿足長度為止

置換函數

在解釋處理的過程之前,我們需要先了解狀態在 Troika 中的結構。如下圖所示,狀態可以想成是一個 9*3*27 的長方體,前 243 trits 是 rate 以橘色表示、後 486 trits 為 capacity 以白色表示。

圖二:Troika 狀態結構

運算中的狀態結構名稱與 Keccak 相同於下圖所示。所以 Troika 的狀態有 9 個 column、3 個 row、27 個 slice。在進行置換函數時會進行 24 輪,每輪會做以下的運算:

  • SubTrytes:用 3-trit S-box 替換狀態內的每個 tryte
  • ShiftRows:每個 row 依照宣告的常數平移
  • ShiftLanes:每個 lane 依照宣告的常數平移
  • AddColumnParity:每個 column 加上相鄰兩個 column 的 parity (該 cloum 每個 trit 相加再 mod 3)
  • AddRoundConstant:每輪再加上對應宣告的常數
圖三:狀態中的每種結構

以上依據 Troikahash Github repo

--

--