VRF(検証可能ランダム関数)とランダムビーコン
くじやリーダー選出で「主催者が結果を仕込んだのでは」という疑いを消せるのが VRF。秘密鍵で決定論的に乱数を作りつつ、誰でも公開鍵で正しさを検証できる仕組みを原理から解説します。
- 1.VRF は秘密鍵で入力から決定論的に擬似乱数の出力と証明を作り、対応する公開鍵で「その出力が正しく導かれた」ことを第三者が検証できる関数。ハッシュに検証可能性と一意性を足したものと考えられます。
- 2.満たすべき3性質は、一意性(公開鍵と入力に対し検証を通る出力はただ1つ)、擬似ランダム性(証明を見るまで出力は予測不能)、検証可能性(証明で出力の正しさを公開検証できる)。これでくじの後出し操作を防げます。
- 3.ECVRF は楕円曲線上で hash-to-curve と Fiat-Shamir 変換を組み合わせた標準構成(RFC 9381)。リーダー選出や分散ランダムビーコンの部品として、結果を事前に操作させないために使われます。
解きたい問題:乱数を「後から操作できない」形で配る
くじ引き、抽選、ブロックチェーンのリーダー選出――どれも「公平な乱数」を必要とします。ところが単に乱数を発表するだけでは、主催者が結果を見てから都合の良い値に差し替えたのではないか、という疑いを拭えません。逆に全員に乱数を見せて検証可能にすると、今度は発表前に結果を先読みして有利に動けてしまう。
ここで欲しいのは矛盾した二つの性質です。作る側にとっては決定論的(同じ入力なら必ず同じ結果で、後から差し替え不能)でありながら、見る側にとっては予測不能(証明が出るまでランダムにしか見えない)。さらに、出てきた値が本当に正規の手順で導かれたかを、秘密鍵を知らない第三者が検証できる必要があります。これを満たすのが**検証可能ランダム関数(VRF: Verifiable Random Function)**です。
VRF とは:鍵付きハッシュに「検証可能性」と「一意性」を足したもの
VRF は鍵ペア (SK, PK) を持ちます。秘密鍵 SK の持ち主は、任意の入力 alpha に対して2つを計算します。
(beta, pi) = VRF_prove(SK, alpha)
beta : 出力(疑似ランダムな固定長の値。ハッシュ値のように見える)
pi : 証明(beta が SK と alpha から正しく導かれたことの根拠)
ok = VRF_verify(PK, alpha, beta, pi)
公開鍵 PK だけで、(alpha, beta) の対応の正しさを検証できる
beta は pi から決定論的に取り出せる: beta = proof_to_hash(pi)
要点は、beta 自体は鍵付きハッシュのように決定論的だが、pi を見ない第三者には予測できないこと。そして pi を公開すれば、SK を渡さずに beta の正しさだけを証明できることです。HMAC のような鍵付き MAC は決定論的だが検証に秘密鍵が要るため公開検証できず、第三者は正しさを確認できません。VRF はこの「秘密鍵なしで検証」を公開鍵暗号で実現した点が決定的に違います。
満たすべき3性質
VRF の安全性は次の3つで定義されます。応用の正しさはすべてここに帰着します。
| 性質 | 意味 | 破れると起きること |
|---|---|---|
| 一意性 (Uniqueness) | PK と alpha を固定すると、検証を通る beta はただ1つ。SK を持つ作成者でも複数の有効な beta を作れない | 同じ入力で別の当選結果を2通り用意し、都合の良い方を提出できてしまう |
| 疑似ランダム性 (Pseudorandomness) | pi を見るまで、beta はランダムな値と区別できない。PK と alpha を知っても出力は予測不能 | リーダーやくじの結果を事前に予測し、有利に立ち回れる |
| 検証可能性 (Verifiability) | pi により、SK を知らない誰でも (alpha, beta) の正しさを検証できる | 作成者が beta を恣意的にでっち上げても誰も見抜けない |
普通のハッシュは衝突困難(同じ出力になる別入力を見つけにくい)を求めますが、VRF の一意性は鍵の持ち主自身を縛る点が特殊です。SK を握る作成者ですら、固定した (PK, alpha) に対して検証を通る beta を2つ作れてはいけません。もしこれが破れると、当選番号を2通り用意して結果を見てから提出する、という不正が成立します。署名スキームに「決定論性+一意性」を強制した変種と捉えると分かりやすいです。
なぜ「署名」では代用できないのか
「秘密鍵で署名して、その署名をハッシュすれば乱数になるのでは」と考えがちですが、これは VRF にはなりません。多くの署名はランダム性を含み一意でないからです。例えば ECDSA は署名ごとにノンス k を選ぶため、同じメッセージでも有効な署名が無数に存在します。署名者は k を変えて出力ハッシュを試行し、都合の良い値が出るまでガチャを回せる――一意性が壊れ、くじを操作できてしまいます。
署名ベースの素朴な案(NG):
beta = Hash(Sign(SK, alpha))
→ ECDSA など多くの署名は (alpha に対し) 有効な署名が多数あり、
署名者がノンスを変えて beta を選び放題 = 一意性が無い
VRF が必要とするのは:
alpha ごとに「検証を通る出力 beta が一意」であること
このため VRF は、署名の決定論化(RFC 6979 のように k を入力から導く)だけでなく、出力の一意性そのものを暗号学的に保証する専用構成として設計されます。
ECVRF の構成:hash-to-curve と Fiat-Shamir
実用の標準が ECVRF(RFC 9381)で、楕円曲線 上で構成します。鍵は SK = x(スカラー)、PK = x·B(B は生成元)。核心は、入力 alpha を曲線上の点 H に写す hash-to-curve と、H を秘密鍵でスカラー倍した Gamma = x·H を出力の種にすることです。
ECVRF(概念。実際は cofactor 等の細部あり):
prove(x, alpha):
H = hash_to_curve(PK, alpha) # alpha を曲線上の点へ決定論的に写像
Gamma = x · H # 秘密鍵で H をスカラー倍(これが一意性の源)
# Gamma が正しく作られたことを、x を晒さずに示す NIZK 証明を付ける:
k = nonce(x, H) # 決定論的ノンス(RFC 6979 風)
c = Hash(H, Gamma, k·B, k·H) # Fiat-Shamir でチャレンジを自前生成
s = k + c·x (mod q)
pi = (Gamma, c, s)
beta = Hash(cofactor · Gamma) # 出力は Gamma から決定論的に導出
return (beta, pi)
verify(PK, alpha, beta, pi=(Gamma,c,s)):
H = hash_to_curve(PK, alpha)
U = s·B − c·PK # = k·B のはず
V = s·H − c·Gamma # = k·H のはず
c がそれらから再計算した Hash(H,Gamma,U,V) と一致し、
かつ beta == Hash(cofactor·Gamma) なら受理
一意性は Gamma = x·H がスカラー倍として一意に定まることから来ます。H は alpha で決まり x は固定なので、Gamma は数学的に1点しかなく、署名のようにノンスで揺らせません。pi 内の (c, s) は「Gamma が公開鍵と同じ x で作られた」ことを離散対数の知識証明として示すもので、構造は Schnorr 署名と同じく Fiat-Shamir 変換で対話証明を非対話化したものです。証明の一般論はゼロ知識証明 と地続きで、ここでは「x を漏らさず Gamma の正当性だけ示す」ために使われています。
入力 alpha を曲線点に写す際、安易に「ハッシュ値を x 座標とみなす」実装はまずいです。曲線上に存在しない x 座標が出たり、写像に偏りが生じて疑似ランダム性が崩れます。さらに**部分群の取り違え(small-subgroup 攻撃)**を避けるため cofactor 処理が要ります。RFC 9381 は SSWU など定数時間で偏りのない hash-to-curve を規定しており、自前実装ではなくこの標準に従うのが鉄則です。
応用:リーダー選出と暗号くじ
VRF が真価を発揮するのが、ブロックチェーンのリーダー選出や**暗号くじ(cryptographic sortition)**です。各参加者が共通のシード(例:前ブロックの乱数)seed を入力に自分の VRF を評価し、出力 beta が閾値を下回ったら「自分が当選(提案者)」と判断します。当選確率はステーク量に比例させられます。
暗号くじ(sortition):
各参加者 i: (beta_i, pi_i) = VRF_prove(SK_i, seed || role)
当選条件: beta_i / 2^len < threshold(stake_i)
当選者は (beta_i, pi_i) を公開 → 全員が VRF_verify で当選の正当性を検証
利点:
・秘密裏に自分の当落を判定できる(事前に標的にされない= private sortition)
・当選後は pi で「正規に当たった」ことを公開証明できる
・seed 固定なら結果は決定論的=後から当落を捏造できない(一意性)
ここで3性質がそのまま効きます。疑似ランダム性により他者は誰が当たるか予測できず(DoS の標的選定を防ぐ)、一意性により当選者は結果を捏造できず、検証可能性により当選の正しさを全員が確認できます。Algorand の合意や、Ethereum の RANDAO+VDF 以前から VRF 系の選出は広く使われてきました。VRF の出力は予測不能な乱数源でもあり、暗号乱数とエントロピー の文脈では「鍵で決定論化された検証可能な乱数」として位置づけられます。
分散ランダムビーコンとの関係
単一の VRF には限界があります。鍵を持つ1人が beta を計算するため、その人物は自分の出力を事前に知っており、(一意性で差し替えはできないものの)気に入らなければ参加をサボって発表を拒否する(grinding/棄権による偏向)余地が残ります。公共的な乱数源には、誰も単独では結果を左右できないことが求められます。これが**分散ランダムビーコン(distributed randomness beacon)**の動機です。
ビーコンは複数の参加者が協調して、各ラウンドごとに公開・検証可能な乱数を継続出力する仕組みです。VRF はその有力な部品になります。代表的なのが閾値方式で、n 人のうち k 人が部分評価を出し合って初めてビーコン値が定まる構成にすれば、k 人未満の結託では値を操作も先読みもできません。
| 方式 | 乱数を決める主体 | 単独操作・先読み耐性 | 代表例 |
|---|---|---|---|
| 単一 VRF | 鍵を持つ1人 | 差し替えは不可だが棄権による偏向の余地 | Algorand のリーダー選出 |
| commit-reveal | 全参加者が値をコミット後に開示 | 最後の開示者が結果を見て棄権でき偏向可能 | RANDAO |
| 閾値 VRF / BLS | k-of-n の協調署名 | k-1 人までの結託では操作も先読みも不可 | drand, dfinity |
| VDF 併用 | VDF で確定まで時間を強制 | 出力を即座に先読みできず grinding を抑止 | Ethereum の RANDAO+VDF 構想 |
閾値ビーコンの核心は、各参加者の部分出力を集めると1つのビーコン値に決定論的に集約され、しかも誰も全体の秘密鍵を持たない点です。これは閾値署名(BLS など)と同型の構造で、k 人の部分署名が確定的な集約署名になり、それをハッシュして乱数にします。出力は依然 VRF と同じく一意で検証可能なので、ビーコン値が正しく生成されたことを誰でも確認できます。drand のような運用ビーコンはこの閾値 BLS を採用しています。
混同しやすい3つを整理します。VRF は「鍵付きで決定論的かつ検証可能な乱数」を作る関数。VDF(検証可能遅延関数) は「計算に必ず一定時間かかる」性質で、入力確定から出力までに時間を強制し先読みや grinding を抑止します(速く検証できる点は共通)。ランダムビーコン はこれらを部品に、毎ラウンド公開乱数を出力するシステムです。VRF=値の正当性、VDF=時間の強制、ビーコン=継続的な配信、と役割が分かれます。
・VRF の3性質:一意性(後出し差し替え不可)/疑似ランダム性(証明前は予測不能)/検証可能性(公開鍵で公開検証)。
・ECDSA 等の素朴な「署名のハッシュ」は一意でないため VRF にならない。ECVRF は Gamma = x·H の一意性に依拠する。
・単一 VRF は棄権による偏向が残る。閾値 VRF/BLS や VDF 併用で「誰も単独で操作・先読みできない」公共乱数(ビーコン)に拡張する。
まとめ
VRF は、秘密鍵 SK で入力 alpha から決定論的に出力 beta と証明 pi を作り、公開鍵 PK だけで (alpha, beta) の正しさを誰もが検証できる関数です。一意性が後出しの差し替えを、疑似ランダム性が先読みを、検証可能性がでっち上げを封じ、この3つが揃って「公平な乱数の配布」が成立します。ECDSA のようなランダム性を含む署名では一意性が崩れて代用できず、ECVRF は楕円曲線上で Gamma = x·H の一意性と Fiat-Shamir 証明を組み合わせて標準化(RFC 9381)されました。
リーダー選出や暗号くじでは、参加者が自分の当落を秘密裏に判定しつつ証明で公開検証でき、結果を捏造できません。ただし単一 VRF は鍵保持者の棄権による偏向が残るため、公共的な乱数源では閾値 VRF/BLS や VDF を併用した分散ランダムビーコンへ拡張します。基盤となる曲線演算は楕円曲線の内部、証明の作り方はゼロ知識証明、署名一般との違いは署名スキームの内部 と併せて押さえると、検証可能な乱数の全体像がつながります。
セキュリティ Article
VRF(検証可能ランダム関数)とランダムビーコンを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
VRF
比較で見る軸
難易度: advanced / カテゴリ: セキュリティ / タグ数: 5
導入後に効く点
満たすべき3性質は、一意性(公開鍵と入力に対し検証を通る出力はただ1つ)、擬似ランダム性(証明を見るまで出力は予測不能)、検証可能性(証明で出力の正しさを公開検証できる)。これでくじの後出し操作を防げます。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- セキュリティ
- タグ数
- 5
判断チェックリスト
- 自社の用途が「VRF / ランダムビーコン」に近いか確認する。
- 強みである「VRF は秘密鍵で入力から決定論的に擬似乱数の出力と証明を作り、対応する公開鍵で「その出力が正しく導かれた」ことを第三者が検証できる関数。ハッシュに検証可能性と一意性を足したものと考えられます。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。