シャミアの秘密分散法 ~漏洩に強い鍵分散技術~

秘密分散法とは?

秘密分散法とは、任意のデータをいくつかに分散させ、隠しておくための方法。

例えば、パスワード文字列として、"APPLE"という文字列をどこかに隠したいとしよう。普通にどこかのサーバーに平文でそのパスワードを保存してしまえば、そのサーバーがハッキングされた際には文字列"APPLE"も見られてしまう。

また、もっと複雑な例えばビットコイン秘密鍵を考えると、5人中3人が承認しないと送金できないような仕組みを作りたいとする。その場合、素直にマルチシグを使うという選択肢以外に、このシャミア秘密分散法で鍵をバラバラに分解し、任意の3名が持ち寄ればもとの秘密鍵が復元できるような仕組みを作ることができる。

原理

原理はそれほど難しくなく、まず、隠したい情報としてデータsを考える。これは例えば、前述のパスワードや、ビットコイン秘密鍵に当たるものだ。今回はs=10とする。

その次に、n個中p個揃えば復元できるという数npを決める。これは任意の値でよい。例えば、n=5p=3を考える。 この場合、生成される鍵は5個で、そのうち任意の3個が揃えばデータsが復元できるようになる。

npを決めたあとは、次のようなp-1多項式を考える。

y=ax^{2}+bx+s

そして、abに任意の値を設定し、多項式を作る。例えば、a=5b=3を考えてみる。すると、

y=5x^{2}+3x+10

となる。

このグラフは、一般的な二次関数のグラフとなるが、この関数の異なる任意の5点を取ると、その情報が分散された鍵となる。

分散された鍵の保有者は、p個あれば鍵が復元できるという情報を知っているので、

y=ax^{2}+bx+s

という二次関数を想像し、持ち寄った(x,y)をこの関数に当てはめることで、元のabsが復元でき、知りたかったデータsを得ることができるというわけだ。

実装

Golangの実装としては、以下のものがある。 GitHub - corvus-ch/shamir: Shamir's Secret Sharing in Golang

HashicorpのVaultにある実装をベースとしているらしいので、VaultのUnsealもこの原理を用いているのかな、という気がする。