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 以白色表示。
運算中的狀態結構名稱與 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