LoginSignup
5
1

More than 3 years have passed since last update.

秘密分散と触れ合おうの話

Posted at

はじめまして、ゆうぴっぴ(@_yu_pippi_)と申すものです
ITに全く秀でていないながらもお勉強中なのでアウトプットしてみようと思います
対戦よろしくお願いします

そもそも秘密分散って?

  • 数ある暗号技術の一つ
  • 秘密情報を何人かのメンバーで分散して管理する方法の総称

秘密情報をバラしてみんなで管理してリスク減らそうぜって考えですね

具体的に、各メンバーに渡される分散された秘密情報のことを「シェア」、秘密情報からシェアを生成する人(端末)を「ディーラー」、シェアを受け取って管理する人を「参加者」といいます。
なんで最後だけ参加者なんでしょうね...自分の見立てではシェアとディーラーに対応する日本語がなかったのかな...と勝手に妄想してます

具体的なシナリオ

以下のようなシナリオが考えられます(全てフィクションです)

ある会社の社長は役員たちに告げました
しゃっちょ「これ、マジで†トップシークレット†なんで大切に保管しといてね あとよろしく」
役員たちはザワつきます
A「こんなもの、僕じゃ手に負えないよ」
B「お前のとこで保管しといてよ」
C「一人では荷が重すぎる」
「・・・」
「「「!!!」」」
そうですね、一社に一台、秘密分散です
彼らは三人で、全員が集まった時に復元できるように秘密分散するようにしました

加法的秘密分散法

今回は一番簡単にできる加法的秘密分散法を実装してみましょう
まず以下、定義します

S:秘密情報 \\
r_1,r_2,\cdots,r_{n-1}:n人分の乱数

今回はAさんBさんCさんの3人で管理するので乱数は2つです

分散(シェア作成)

BさんとCさんには生成した乱数をそのままシェアとして渡します

s_2=r_1 \\
s_3=r_2

Aさんには以下のようなシェアを渡します

s_1=S-r_1-r_2

これでみんなにシェアを渡せました

実装例(Python3.8)

def create_share(secret, n):
    share = []
    for i in range(1, n):
        r = random.randint(-(2**63-1), 2**63-1)
        share.append(r)
    s = secret - sum(share)
    share.insert(0, s)
    return share

再構築(秘密の復元)

みんなが合意したときにシェアを持ち寄って全て足します(簡単!)

s_1+s_2+s_3=(S-r_1-r_2)+r_1+r_2=S

これで復元できました

実装例(Python3.8)

def combine_share(share):
    s = sum(share)
    return s

以上のような感じで秘密を分散できました
n個のシェアをn人で管理するので(n,n)しきい値法とも呼ばれます
今回紹介した方法はだいぶ簡単に実装できるので安全性もそこまで高くありませんが他の方法(たとえばShamirの秘密分散)だともっと強い秘密分散を実現できたりします

いかがでしたでしょうか
拙い文ですが読んでいただきありがとうございました
みなさんも良い秘密分散ライフを!

5
1
0

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
5
1