Develop with pleasure!

福岡でCloudとかBlockchainとか。

楕円曲線を使ったゼロ知識証明

↓のゼロ知識証明の解説記事に掲載されている楕円曲線を使ったゼロ知識証明をbitcoin-rubyを使って検証してみた。

www.atmarkit.co.jp

検証手順は↑のの記事の通りで、

証明者(アリス)と検証者がいて、楕円曲線上の点Pとアリスの秘密鍵aがあるとき、その公開鍵は

Q(公開鍵) = aP

となり、PQは検証者に共有されている。この状況でアリスは確実に秘密鍵aを持っていることをaを開示することなく、検証者に証明する。

まず、アリスはランダムな値rを選択肢、 R = rPb = H(P, Q, R)を計算する。Hはハッシュ関数で、今回はBitcoinハッシュ関数hash160を使用。
続いてc = r + abを計算し、検証者に(R, c)を渡す。

検証者は共有された値PQRcを使ってアリスがaを持っていることを確認する。
確認方法b = H(P, Q, R)X = cPY = R + bQを計算し、XYが等しければアリスはaを持っていると判断する。

どうしてXYが等しければアリスはaを知っていると判断できるのかというと、X = cP = (r + ab)Pは、秘密鍵abを乗算し、ランダムに選択した秘密鍵rを加算した値になる。そしてYは公開鍵Qbを乗算し、秘密鍵rの公開鍵Rを乗算した値になる。秘密鍵に対してrを加算した場合、その楕円曲線上の点は公開鍵QRを加算したものと等しくなるという楕円曲線の特性と、仮にaを知らない場合その計算式が成り立つようなRや(ハッシュ関数によって生成された)cをアリスが導出することは非常に難しいことから、X = Yが等しい場合アリスはaを知っていると判断することができる。

検証コードは↓