https://github.com/iotaledger/kerl
先用種子依照安全等級(security level)產生私鑰,安全的等級分為三種,1 為最簡單、2 為官方錢包使用的等級、3 為交易所使用的等級。Hash 目前使用的是 Kerl(Keccak-384),進行的步驟大致上如下:
- 備妥私鑰
- 將私鑰分成「L」等分,
L = security * 27
- 將所有等分都 Hash 過,此過程稱為
digest
- Hash
digest
兩次,此過程稱為address
簡單來說就是 seed>private key>digest>address
簽章會用私鑰來簽署 tangle 上屬於你的資訊(簽署資料像是 bundle),tryte 對照的部分會用到 IOTA 字母系統
- 備妥私鑰
- 將私鑰分成「L」等分,
L = security * 27
- 將第 i 等分 hash N_i 次, N_i 由以下方式算出:
如何算出 N_i
用簽署資料(Signed Data)中的第 i 個 tryte取得十進位數 'd',像是 9 對應
d=0
、[A] 對應d=1
。公式: N_i = 13 - d
- 這些 hash 過的部分就統稱為簽章
- 備妥私鑰
- 將私鑰分成「L」等分,
L = security * 27
- 將第 i 等分 hash M_i 次, M_i 由以下方式算出:
如何算出 M_i (基本上與 N 相同)
用簽署資料(Signed Data)中的第 i 個 tryte取得十進位數 'd',像是 9 對應
d=0
、[A] 對應d=1
。公式: M_i = 13 + d
- 將所有等分一起 Hash 後產生
digest
- 將
digest
Hash 兩次 - 檢查上一步產生的地址是否與簽署資料(通常指 Bundle)上的地址相同
簽章用來簽署輸入的地址,然後會存在簽署過輸入的 bundle 當中。簽署資料的長度為 security * 2187 tryte,存在 signatureFragment
中。signatureFragment
的大小為 2187 tryte,所以安全性越高,bundle 中所需的交易數量也越多。
上述簽章數據指的是包含簽章的 bundle hash (81 tryte),更嚴謹的方式來說應稱作 normalized bundle hash
,它會稍微增加 bundle hash 讓私鑰的曝光度保持在 50%。
normailized bundle hash 會再分成 data[0], data[1], data[2] 作為簽署資料,其中 27 trytes 用來算出對應的 27 個等分個別需 hash 幾次,以上的 data[i] 就是 27 trytes 的簽署資料。如果 security = 1
,那就只有 data[0];如果 security = 2
,那就會需要 data[0] 和 data[1],也就是總共有 54 trytes 做簽署。所以在產生 bundle 時,交易數量的多寡也和安全等級有關。等級越高所需要的 data[i] 也就越多。
雖然說用 API 會產生錯誤,但security >= 4
是能夠被協定允許的(像交易能夠受到確認)。不過因為沒有 data[3] 的關係,data[0] 會重複被使用。
回想上面計算 hash 次數的方式:
如何算出 N_i
用簽署資料(Signed Data)中的第 i 個 tryte取得十進位數 'd',像是 9 對應
d=0
、[A] 對應d=1
。公式: N_i = 13 - d
hash 的次數與簽署資料的第 i 個 tryte 有關,如果簽署資料包含非常多 'M' 的話,就意味著幾乎不會做任何 hash,這會導致私鑰完全被曝光的風險。
此簽章機制源自於 Winternitz one-time signature,WOTS 可以抵擋量子計算的攻擊。