BIP-39 Mnemonic validate

前言

最近處理了一些加密貨幣的問題,其中一個是助記詞的驗證,這邊將會解釋助記詞的生成和驗證方式。

生成助記詞

首先我們這邊所介紹的是助記詞生成方式,先建立一個 128 bytes 的隨機序列,也就是隨機產生 16 個 UInt8 的序列;

主要有分成 128、160、192、224、256 bits(每 32 bits 做為一個區間),而下列會以 128 bits 作為流程解釋。

對隨機序列加密(SHA256)

我們對剛剛所產生的序列做 SHA256 加密,便會得到由 32 個 UInt8 所組成的 Array。

Checksum

用來驗證助記詞是否正確的方式是透過 Checksum 來辨別,而 Checksum 的 size 為序列的長度 / 區間,如我們這邊所提及的 128 / 32 = 4;

意思便是剛剛所加密完的序列,我們取前面 4 bytes 的數值當作 checksum。

產生助記詞

而剛剛的隨機序列(128 bits)加上 4 bits 的 checksum 組成 132 bits,接著我們每 11 bits 作為一個分隔,也就可以得到 132 / 11 = 12 個數字。

而每 11 bits 作為一個分隔的意思也意味著數字的區間落在 0 – 2047 之間,也就是為什麼 12 字的助記詞所支援的單字庫數量為 2048。

接著就到詞庫裏頭撿取相對應 index 的字詞來組成助記詞。

驗證助記詞

驗證的方式就是將上述的流程反過來做,我們先講助記詞轉成詞庫的 index 順序;

接著看最後 4 bits 的內容,也就是這組助記詞的 checksum。

而前 128 bits 以 8 bits 作分隔,接著以 SHA256 加密,判斷前 4 bits 是否和剛剛提及的 checksum 相符。

comments powered by Disqus