LoginSignup
24
9

More than 1 year has passed since last update.

Symbolの秘密鍵をシャミアの秘密分散で管理する

Last updated at Posted at 2021-12-18

ネタ探しのためにSymbolドキュメントを眺めていたところ気になるライブラリを見つけました。

image.png

Implementing Shamir's secret sharing on symbol.
「シャミアの秘密分散をSymbol上に実装。」

ほぉ、秘密分散とな。
何やら面白そう。
よし、このテーマでいこう。(理解できるだろうか...)

注意)正確に理解できている自信がないので、何か間違っていることを書いていましたらご指摘ください。

秘密分散とは

秘密分散とは秘密鍵などの重要な情報を複数のデータに分散させて
それら単独では元の情報を得られない形にすることです。
by 「暗号と認証のしくみと理論がしっかりわかる教科書」

暗号技術の一つです。
秘密分散とはあるデータ(シークレットと呼ぶ)を複数のデータ(シェアと呼ぶ)に分散させることで暗号化する方法です。
一定数(閾値)のシェアを持ち寄ることで元データを復号化することができます。
Shamir(シャミア)の秘密分散法が有名らしいです。

秘密分散法で秘密鍵の管理

秘密鍵の管理に秘密分散法を適応するケースを考えてみます。
秘密分散により秘密鍵の情報(シークレット)を3つのデータ(シェア)に分散させることができます。

例えば、この3つのデータを3人にそれぞれ渡して管理します。
3人のうちの2人がお互いのデータを持ち寄ることで
再び秘密鍵を復元することができます。
これは2of3の秘密分散のケースになります。
3つのシェアの内、1つのデータが紛失したとしても
残りの2つで秘密鍵を復元することができます。

image.png

あれ?
これってマルチシグ機能に似ている?

On-ChainマルチシグとOff-Chainマルチシグ

Symbolerなら直ぐにお気づきかと思いますが
上記の応用例は正にマルチシグです。

実際に秘密分散法は(Symbolのような)ネイティブにマルチシグが
実装されていないブロックチェーンに
マルチシグ機能を実装する手段として考えられていたそうです。

「マルチシグが既にできるSymbolには秘密分散法は不必要では?」

たしかに・・・
いや、考えればまだまだ用途はあるはず!

こう考えるのはどうでしょう。
SymbolはOn-Chainマルチシグ、秘密分散法はOf-Chainマルチシグ
と考えることができそうです。

オンチェーンのマルチシグとオフチェーンのマルチシグを
組み合わせることで何か面白いことができないでしょうか?

例えば、Symbolのマルチシグはたしか最大32アカウントですが
ここにオフチェーンマルチシグを組み合わせれば
より多階層で巨大なマルチシグが実現できそうだなと思いました。
利用用途は不明ですが…

NFTデータを秘密分散で管理

秘密鍵を秘密分散法で分散して管理する例を挙げましたが
対象データは何でもよいわけです。
例えば、NFTのデータを秘密分散法で分散させることで複数人で管理したり、ゲームアイテム的な使い方(シェアを全部集めるとデータが見れるようになる)が実現できるでしょうか?

ただの思い付きでですが
追求してみると何か面白い発見がみつかる気もします。

皆さんと一緒に考えていきたいです。

Symbolの秘密鍵をシャミアの秘密分散で管理する

やっと本題です。
せっかくなので手を動かしましょう。
Symbolの秘密鍵をシャミアの秘密分散で管理してみようと思います。

Symbolドキュメントに載っていたライブラリを使ってみようと思ったのですが、こちらはうまく動かすことができませんでした。

なので他に秘密分散のライブラリがあるか探していたところ以下のライブラリを見つけました。
今回はこちらを使ってみました。(中身をちゃんと検証していないため利用の際は自己責任でお願いします)

今回は2of3の秘密分散を実装してみました。以下コードになります。
とても簡単です。

import { Account, NetworkType } from "symbol-sdk";
import { split, combine } from 'shamirs-secret-sharing-ts'

// 秘密鍵を生成
const newAccount = Account.generateNewAccount(NetworkType.TEST_NET);
const privateKey = newAccount.privateKey;
console.log('privateKey: ' + privateKey);

// シークレットの準備
const secret = Buffer.from(privateKey);
console.log(secret);

// 2 of 3秘密分散
const shares = split(secret, { shares: 3, threshold: 2 });
console.log(shares);

// 1番と2番のシェアをつかって復号
const recovered = combine(shares.slice(0, 1));
console.log(recovered.toString());

実行結果

privateKey: D60AC5D06901D102AEBBD4961E67CA568FF2592BC8D2E9695DEE4628E4C08297
<Buffer 44 36 30 41 43 35 44 30 36 39 30 31 44 31 30 32 41 45 42 42 44 34 39 36 31 45 36 37 43 41 35 36 38 46 46 32 35 39 32 42 43 38 44 32 45 39 36 39 35 44 ... 14 more bytes>
[
  <Buffer 08 01 10 c6 5d a4 1f b8 dd c3 b2 bf 00 8e e9 55 25 97 09 a7 b9 43 a7 ac c5 d8 c6 b4 09 0e 99 35 f6 44 88 20 49 56 a7 b6 e0 d0 bf 4d 2c aa e5 36 51 fa ... 96 more bytes>,
  <Buffer 08 02 20 91 ba 55 3e 6d a7 9b 79 63 00 01 cf aa 4a 30 12 0a 6f cd 53 13 97 e5 91 25 12 d9 2f 36 f1 47 0d 08 92 fa 53 2b dd e1 63 55 58 86 d7 a0 a2 b6 ... 96 more bytes>,
  <Buffer 08 03 30 57 e7 f1 21 d5 7a 58 cb dc 00 8f 26 ff 6f a6 1b 9a d6 b7 f4 8d 52 05 57 a1 1b 94 b6 37 07 46 85 10 db 9e f4 ab 3d 05 dc 5d 74 69 32 d2 f3 79 ... 96 more bytes>
]
recoverd: D60AC5D06901D102AEBBD4961E67CA568FF2592BC8D2E9695DEE4628E4C08297

一番上の行が新しく生成した秘密鍵になります。
2行目は秘密鍵を文字列からバイナリに変換したものです。
4,5,6行目が3つに分散したデータ(シェア)になります。
そして最後が、3つのうち2つのチェアを持ち寄ることで復元した結果になります。
ちゃんと元の秘密鍵が復元されていることがわかります。

おぉ面白い!

まとめ

今回はシャミアの秘密分散について調べてみましたが
ブロックチェーンと秘密分散の組み合わせ自体は数年前から話題に上がっているネタで新しさはありません。
しかし私自身の勉強のため記事にさせて頂きました。
 
その他にも、ブロックチェーン等に活かせそうな暗号技術としては
・検証可能な秘密分散手法のVSS
・複数人で強調して計算するマルチパーティ計算(MPC)
・誰も元の秘密鍵sを知ることなくk-of-n秘密分散する方法のDKG
・DFINITYやイーサリアムなどのブロックチェーンに利用されているBLS署名
・ゼロ知識証明
など興味深いものがたくさんありそうだということも
今回調査してみてわかりました。

他の暗号技術についても学んで
Symbolに活かせそうなものは活かしていけたらなと
思います。

参考

24
9
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
9