Develop with pleasure!

福岡でCloudとかBlockchainとか。

実際に紙とペンでCodex32のマスターシードの生成/検証/リカバリーをしてみる

先日書いたCodex32について↓

techmedia-think.hatenablog.com

手計算可能と書いたけど、チェックサムの生成や、シェアの正しさの検証、追加シェアの導出やシェアを使ったリカバリーが本当に手計算可能なのか?実際にやってみる。やり方は、この冊子にまとめられている。

※ 実際にCodex32のシェアをロード可能なウォレットは現時点ではないので、あくまで実験。

準備するもの

Codex32でシェア、シードを作成するのにデジタル機器は必要ない。用意するのは

  • 5個のサイコロ
  • 計算に使用する3つのVolvelle回転盤。冊子のP.21〜27の材料を切り取って組み立てると、3つの回転盤が出来上がる。
    • 加算用:有限体上の要素の加算用の回転盤
    • 変換用:有限体上の要素の乗算用の回転盤
    • リカバリー用:ラグランジュ補間に使用する回転盤

新しいシードの作成

初期シェアの作成

まず新しいシード用にk個の初期シェアを作成する。サイコロの偏り除去ワークシート(P.11、12)を用意しておく↓

  1. 5個のサイコロに対して、それぞれ対応するマーカーを作成し(ポストイットとかに対応するサイコロの番号書くとかでOK)、マーカーをワークシートのFree Spaceの場所に初期配置する。
  2. 5個のサイコロを振って、Free Spaceの隣のDie Padsの各サイコロの出目の部分にマーカーを移動する。
  3. 再度5個のサイコロを振って、今度はサイコロ自体を同じDie Padsの出目の部分に配置する。
  4. もし、サイコロの出目が同じだった場合、そのサイコロについて、2と3を再度行う。
  5. Die Padsのそれぞれ異なる場所にマーカーとサイコロが配置されたら、続いてP.11の右上のワークシートのツリーの頂上からツリーを降りていく。
    • まずDie Tracksの1つめのDie Padsについて、サイコロがマーカーより左にあればツリーを左に降り、右にあれば右に降りる。
    • これを5つのサイコロ分実行すると、最終的にツリーのリーフの1文字に辿り着く。
  6. 1〜5までの作業を繰り返し、26文字を出力する。

この26文字が128 bitのシェアのデータになる。やり直しがなかったとして、1つのシェアを作るのに最低でも5個のサイコロを52回振る必要がある。

チェックサムの計算

続いて、↑のシェアのチェックサムを計算する。チェックサムの計算には、P.17のチェックサムのワークシート↓

と加算用の回転盤↓

と、P.15, 16のチェックサムテーブル↓

を使用する。

  1. まず、ワークシートの非ピンクの太字の四角の中を左上から埋めていく。
    • 一番左上のMS1の後は、閾値パラメーターkの値、4文字の識別子、1文字のシェアインデクスを埋める。
    • それ以降は、先程生成した26文字のシェアを順番に埋めていく。
  2. 続いて、最初の行と2行目を加算し、その値を3行目に埋めていく。この時の加算に、加算用の回転盤を使う。たとえば1行目が2、2行目が3の場合の2 + 3は、↑の加算用の回転盤で▲を2に合わせた上で、回転盤内の3が指す枠の値(M)になる。
  3. 3行目の左端2文字で、P15, 16のMS32 チェックサムテーブルの該当レコードを探し、その値で4行目を埋める。
  4. 2,3を繰り返し、ワークシートの非ピンクの部分を埋めていく。
  5. 非ピンクが埋まったら、今度は下の行からスタートしてピンクの枠を埋めていく。下からなので、加算用の回転盤で回転盤内の枠が指す値をマッピングしてその時▲が指す値が1つ上のピンクの枠の値になる。
  6. すべて埋まったら、対角線上のピンクの太字の枠がチェックサムの値になる。ちょうど13文字。

ここまで完了したら、Codex32エンコードされたシェアが完成する。

※ シェア=シードとする場合は、k = 0、シェアインデックス=sとしてチェックサムを計算する。

チェックサムの検証

↑でシェアは完成したけど、一応チェックサムが正しいか検証しておこう。チェックサムの検証の手順は↓

  1. 新しいチェックサムワークシートを用意する。
  2. MS1以降の右上に番号がついた太枠のマスを、さっき計算したCodex32文字列(48文字)で埋めていく(ピンクの部分も含めて)。
  3. さっきと同じように、上から順に加算用の回転盤を使って今度は一番下まで計算していく。
  4. 最終行がSECRETSHARE32となったら検証成功。

追加シェアの生成

閾値の数分↑の方法で初期シェアを作成したら、追加のシェアを作成できるようになる。

追加シェアを導出するのに使用するのは、k個の初期シェアと、追加分のチェックサムワークシートと、Translationワークシート(P. 18〜20)↓

↑は、P.19のk = 2の場合のワークシート。kの値によって使用するワークシートが異なる。さらにtranslation/fusion用の回転盤↓

と、加算用の回転盤を使用する。

追加シェアの導出方法は(今回はk = 2で行う)、

  1. 最初にk = 2のTranslationワークシート(P. 19)をコピーする。
  2. 左の列の上2つに使用する初期シェアのシェアインデックスを記入する(今回は、AC)。
  3. 2の下に導出するシェアのシェアインデックスを記入する(今回はD)。
  4. 2のシェアインデックスの右隣のマスにTranslationシンボルを記入する。このシンボルは、kの値毎に用意されている変換テーブルを使って導出する。k = 2の場合は↓(他の閾値のテーブルは冊子のModule 2に含まれてる)
    • 今回はDを導出するので、AのシンボルはΠCのシンボルはρ
  5. 続いて既存のシェアの文字をTranslation回転盤を使って変換していく。
    • まず、回転盤のFusionの面で回転盤をシェアインデックスに対応するシンボルに合わせる(↑のAのシェアであればΠに合わせる)。
    • 合わせたら、回転盤を裏返してTranslationを表にする。そして各シェアの文字をそれが▲で指す文字に変換してマスを埋めていく。
  6. 5をk個分繰り返して既存のシェアの変換を終える。
  7. k個埋まったら、加算用の回転盤を使って縦の文字を加算して最終行のマスを埋める。

7を全部埋め終わったら、それが新しいシェアになる。新しいシェアインデックスに対してこれを繰り返せば追加のシェアを作っていける。

マスターシードのリカバリ

続いて、リカバリーをやってみる。シェアの生成や検証ができれば、シードのリカバリーは普通は対応するウォレットにシェアをロードすればいいので、このリカバリー自体を手動でやることはあまりないかも。

  1. リカバリーに使用するk個のシェアを準備する。
  2. 各シェアが正しいかチェックサムを検証する(↑に書いた方法で)。
  3. リカバリーはシェアインデックスがsのデータをTranslationワークシートを使って計算する。計算方法は追加シェアの導出とほぼ同じで、シンボルの導出にリカバリー用の回転盤を使用する部分だけ違う↓
    • リカバリー用の回転盤の枠を使用する1つのシェアインデックスに合わせる。その状態でもう1つのシェアインデックスが指すシンボルが枠に合わせたシェアに適用するシンボルになる。
    • たとえば、シェアインデックスがADのシェアを使う場合、
      • Aのシンボルは、Aを枠に合わせた状態でDが指すΛ
      • Dのシンボルは、Dを枠に合わせた状態でAが指すΘ
    • 各シンボルが見つかったらそれをTranslationワークシートに記載して、追加シェアの導出と同じように計算する。
  4. 加算が終わると、シェアインデックス = SのマスタシードをエンコードしたCodex32文字列が入手できる。

実際にBIP-32のシードにするには、導出したCodex32データのペイロードをbit変換する必要がある。

※ k > 2の場合は、↑の手順3でピックアップするシンボルが1つのシェアに付き複数になる。この複数のシンボルを融合して1つのシンボルにする必要がある。これにはFusion回転盤を使用する。

  1. まず最初のシンボルをFusion回転盤の枠に合わせる。
  2. その状態で、内側の回転盤内で次のシンボルを見つける。このシンボルが新しいシンボルなので、そのシンボルに外側の回転盤の枠を合わせる。
  3. 2をすべてのシンボル分繰り返した最後のシンボルが融合後のシンボルで、これをTranslationワークシートに記載する。

感想

本当に手作業だけで、シェアの生成、検証、シードのリカバリーが可能だった。作業するのに1時間以上はかかるけど。

↑のようにCodex32は回転盤を使ってチェックサムやシャミアの秘密分散法の計算を行うスキーム。その数学的な背景については、以下で公開されてる↓

https://secretcodex32.com/docs/2022-09-26--math.pdf

よくこんなの考えるなー。