コアなビットコイナーは秘密鍵の管理にうるさかったり、一家言ある人が多いというイメージはありませんか?少なくとも自分の印象ではWeb3系の人たちよりよほど秘密鍵の生成や管理に関心がある気がします。

ビットコイナーの一部の間ではマルチシグによって自身のコールドストレージのセキュリティを強化する人も見られるようになりました。しかし通常のシードフレーズとは異なり、複数のシードフレーズとスクリプト文のデータなどを用意し別々の場所で安全に保管するのが煩雑なのも間違いありません。

他にはシャミアの秘密分散法という知名度の高い手法を使って1つのシードフレーズを複数の「シェア」に分割し、それらのシェアを使ってn-of-mのマルチシグを擬似的に再現することも考えられます。実際には1つのシードフレーズを復元するので狭義のマルチシグトランザクションにはなりませんが、比較的シンプルな手法で(ビットコイン以外のブロックチェーン系のウォレットで)人気があります。

例えば友人や親戚にシェアを1つ預けてソーシャルリカバリーできるようなウォレットの多くはこのスキームになっています。数人に結託して裏切られないように注意しましょう。

さて、ビットコイナーはできる限り検証可能な方法で乱数を生成し、シードフレーズを導出したほうが良いという立場を取りがちですが、シャミアの秘密分散法でシェアを生成するのはさすがに電子機器を使う必要がありそうですよね。

ところが、実はその必要はないのです。かなり時間をかけて手計算したり表と照らし合わせる必要はありますが、Codex32という手順書に従えばシェアの分割や誤り検出・誤り訂正、秘密の復元といった処理が紙とペンで実行できるのです!

今日はちょっとだけ中身を覗いて見ましょう。MITライセンスで提供されているので、上記のリンクからダウンロードして利用できます。デザインも優れているのでせめて見てみてください!

ちなみにシャミアの秘密分散法を用いたビットコインウォレットについて広く普及している規格はありませんので、本番利用はある程度リスキーかつ不便だと思ったほうが良いです。(不便承知でやってみる遊びだと思ってください)

・ボルベル(ホイールチャート)を使った見事な設計

・生成時に利用するサイコロの出目の偏りを検出し修正するためのワークシート

・アドレスの導出やトランザクションの作成、署名はまだできない

ボルベルを使った見事な設計が好奇心をくすぐる

「紙とペンでシャミアの秘密分散法の計算ができる」と聞いたら、たくさん数式があって自分で筆算をするなんて…というふうに最初は思うかもしれません。ですが、中身を見てみると紙でできた手動計算機を工作することがわかります。

ボルベルの上側(のぞき窓や矢印、目盛りがある側)

ボルベル(ホイールチャート)と呼ばれるこのアナログコンピューターはそれ自体が大変興味深いものですが、うまいこと設計されており3つ利用することでCodex32が対応する難しい計算を行えてしまうようです。

ボルベルの下側(のぞき窓から見える側)

あとはめちゃくちゃ大量の表があり、必要に応じて参照することになるのですが、途方もない作業になる予感はします。シードとシェアの生成から誤り検出を行い、試しに復元してみるまでトータルで半日はかかってしまうかもしれません。でもこのボルベルを見るとそれでもやってみたくなりませんか?

シードの生成に使用するサイコロの出目の偏りを明らかにするワークシート

ビットコインガチ勢は「カジノダイス」と呼ばれる非常に精密なサイコロを使って乱数を生成することがあります。しかし、カジノダイスなんて珍しい品物ですし、安くもありません。特に軽く試してみたいだけの場合、普通のサイコロでやってみたくなりますよね。

しかし普通のサイコロでは構造的な重心の偏りや摩耗などによる変形で完璧な乱数を期待できません。そこで5個のサイコロを用意し、"Dice De-biasing Worksheet"の手順に従うことで偏りを修正できるようです。具体的にはそれぞれのサイコロを2回振り、1回目と2回目の出目の大小を右側の二分木に当てはめることで1文字(32ビット)分の乱数として扱うようです。(もし2回とも同じ目が出たサイコロがある場合は5個とも2回振り直します)

これは数学者フォン・ノイマンが発明した、不正なコインから公正な結果を得ることができる有名な手順の応用らしいです。ポイントとして、不正なコインの偏りは毎回同じなことから結果が(1: A, 2: B)になる確率と(1: B, 2: A)になる確率が等しいことを利用するために(1: A, 2: A)と(1: B, 2: B)を排除します。

サイコロの場合は3投したときの数字の増減パターン(↗↗↘など)に公正な出目を当てはめる方法が一般的なようですが、ここでは出目ではなくサイコロごとに1ビットの情報(左か右か)を得ることが目的なので2投で十分そうです。なんならコイン5枚でフォン・ノイマンの手法をそのまま使っても良さそうな気さえします。

アドレスの導出やトランザクションの作成はまだできない

残念ながらCodex32には現時点では致命的な欠点があります。それはせっかくシードを生成してもアドレスの導出ができないこと、つまりシェアを復元してもアドレスの導出は電子計算機に頼ることになるということです。(というかそもそも先にアドレスを導出して入金しないとマルチシグで空気を保管するだけですよね)

もちろん最初にシードフレーズをハードウェアウォレットやエアギャップされたデバイスに読み込んでアドレスだけ導出しておくという手はあります。せっかく手で秘密分散をやる意義を感じているのになんとも興ざめですが…。

アドレスの導出やトランザクションの作成が将来的に紙とペンでできるようになる可能性があるのかないのか私には判断できませんが、誰かマッドサイエンティスト的な数学者が新たなボルベルを作り出してくれることに期待しています。笑

とりあえず現時点では細かい作業が好きな方、たくさんの表を参照して値を記入していくことで心に安らぎを得られる性格の方にぜひおすすめしたい週末の暇つぶしです。暗号技術の神秘と数学を身近に感じましょう!