Verifiable Random Function
概要
VRF (verifiable random function) は公開鍵ペアを使用する暗号学的ハッシュ関数
である。VRF 関数は秘密鍵を使ってある入力値に対するハッシュ値を算出することができる。加えて、第三者がその公開鍵を使って、受信したハッシュ値が本当にその秘密鍵を使って生成されたものであるかを検証することができる。
VRF によって生成される証明
Table of Contents
アルゴリズム
VRF は証明の生成、ハッシュ値の生成、証明の検証の 3 つの関数で構成される。
証明とハッシュ値の生成
ある主体
ハッシュ値の検証
VRF には公開鍵
セキュリティ
攻撃者は公開鍵
VRF の生成するハッシュ値
指名型暗号抽選スキーム
VRF を使った公平でセキュリティの高い抽選や宝くじシステムを設計してみよう。説明を簡略化するため参加者 1 人あたり 1 枚の抽選券を持っているとする (1 枚以上の場合は後述する)。参加者数 (=総抽選券枚数) を
この指名型抽選は信頼済みのディーラー (抽選会の運営団体) が当選者を指名する。VRF を使用することでディーラーが意図的に乱数を操作していないことを参加者が検証することができる。
設定
- ディーラーは鍵ペア
, を持っており、公開鍵 はすべての参加者に共有されている。 - 参加者は ID 等で決定性のあるソートが可能であり、参加者リストはすべての参加者に共有されている。
- シード (メッセージ)
は誰でも知りえるが、ディーラーが推測したり操作することができない。
アルゴリズム
指名型抽選はランダムサンプリングに基づいた抽選アルゴリズムである。
- ディーラーは秘密鍵
とシード を使って証明 と乱数 を生成し参加者に通知する。 val pi = vrf_prove(Sk, m) val t = vrf_hash(pi) - 参加者はディーラーの公開鍵
とシード 、証明 を使用して乱数 を検証し、当選者を認識する。 if(vrf_verify(Pk, m, pi) != t) { abort() } val winner = participants[floor(t * N)]
ここで、ディーラーがすぐに当選者を公表するか、先に当選者のみに通知するかはアプリケーションの要件によって考慮する必要がある。
- 当選者を公表する場合:
- ディーラーは
をブロードキャストする。 - 各参加者は
と が に基づいてディーラーによって生成されたものであることを検証する。 - 各参加者は参加者リストから
番目の参加者を当選者と判断する。
この方法は単純で公明だが、匿名性が低く、当選者が当選した権利を行使する前に悪意のある参加者からの攻撃を受けて権利の行使を妨害される可能性がある。
- ディーラーは
- 当選者のみに通知する場合:
- ディーラーは参加者リストから
番目の参加者を当選者と判断する。 - ディーラーは
を当選者のみに送信する。 - 当選者は
と が に基づいてディーラーによって生成されたものであることを検証する。 - 当選者はディーラーと同じ方法で自分が当選者であることを検証する。
- 当選者は当選の権利を行使する。
- 当選者またはディーラーは、当選権の行使後に
をブロードキャストし、他の参加者は正当な抽選であったことを検証する。
これは抽選結果を検証可能にするため最終的に当選者は公表されるが、当選権利を行使するまでは公表されない方法である。抽選が失敗したとき、当選者以外の参加者は、ディーラーが故障したのか当選者が故障したのかを判断することができない。
- ディーラーは参加者リストから
このような抽選を継続的に行う場合、あるラウンド
Pros. and Cons.
- 乱数を発生させるディーラーは参加者より早く当選者を知りえてしまう点が公平性の解釈で不利と言える。例えば、ディーラーに不利な参加者が当選した場合に抽選そのものを無効にするかもしれない。
- シードが既に暗号的乱数の性質を持っているのであれば、ディーラーが VRF を使用して乱数を生成する必要性は薄い。
複数抽選券に拡張
上記は単純化のため参加者 1 人あたり 1 つの抽選券を想定していた。ここで各参加者が 0 枚以上の抽選券を持つことができる場合を考えてみよう。
参加者の総数を
例: A, B, C がそれぞれ 1 枚, 1 枚, 2 枚の抽選券を持っているとすると、それぞれの当選確率は
P2P 型暗号抽選スキーム
このスキームは各参加者が各自のプライベートな環境で VRF 乱数を生成し自分が当選者かを判断する。乱数は各参加者の秘密鍵
このスキームは特定のしきい値
設定
- 全ての参加者は鍵ペア
, を持っており、公開鍵 は全ての参加者に共有されている。 - 参加者は公開鍵バイナリ等を使った決定性のあるソートが定義されている。
- シード (メッセージ)
はどの参加者でも知りうる。 - 当選しきい値
が決められて共有されている。
アルゴリズム
各参加者
Pros. and Cons.
- ディーラーが不要であるため P2P 環境に適している。
- 抽選時点での参加者数は決定的でなければならない。
- 確率的な抽選であるため、結果として当選する参加者の数を正確に予測することができない。
複数抽選券に拡張
各参加者が 0 枚以上の抽選券を持つことができるケースを考える。ある参加者
総発行数
この方法は 1 人の参加者が 2 枚以上の当選券を手にしている可能性があることに注意。
例: この方法で
参加者
他の暗号技術との比較
個人的な意見として VRF は以下の暗号技術との類似した特徴があると考えている。VRF を検討するとき、これらの技術を使った方が有利である可能性を考慮する必要があるだろう。
- HMAC
-
HMAC は共有鍵
を用いてメッセージ に対するハッシュ値を算出する機能である。 に対する同一のハッシュ値は同一の鍵 でしか生成し得ないことから、メッセージを送受信する主体の双方が共有鍵 を共有していれば MHAC を使ってメッセージが改ざんされていないかを検証することができる。VRF は HMAC の共有鍵を公開鍵に拡張した概念と言える。 - 電子署名
-
を署名生成、 を一般的なハッシュアルゴリズムとすると、電子署名はメッセージ に対する秘密鍵 による証明 と考えることができる。これで VRF と類似した機能を構築することができるだろう。ただ、この方法は VRF より計算量が多く非効率的らしい。VRF が実装されていない環境での代替手段に使えるかもしれないのでここに書き留めておく。
VRF を使用することでワンタイムパスワードのようなスキームを考えることができるが、本人認証 (秘密鍵
参考文献
- Silvio Micali, Michael Rabiny, Salil Vadhan (1999) Verifiable Random Functions (日本語訳)
- Verifiable Random Functions (VRFs) draft-irtf-cfrg-vrf-05 (日本語訳)
- Yossi Gilad, Rotem Hemo, Silvio Micali, Georgios Vlachos, Nickolai Zeldovich (2017) Algorand: Scaling Byzantine Agreements for Cryptocurrencies (日本語訳)
- Dan Boneh, Ben Lynn, and Hovav Shacham. Short signatures from the weil pairing. J. Cryptology, 17(4):297–319, 2004.
- Bernstein, D. J., Hamburg, M., Krasnova, A., Lange, T. Elligator : elliptic-curve points indistinguishable from uniform random strings. Cryptology ePrint Archive; Vol. 2013/325. IACR, 2013.


