BLS署名の基本
初めに
今回はBLS署名を紹介します。BLS署名はBoneh, Lynn, Shachamが提案した署名で、EthereumのPoSの暗号プロトコルなどで利用されています。
数学用語の復習
素数
すると集合
同様に、別の楕円曲線の0でない点で
すなわち、
任意の整数
ここで紹介した用語を初めて見る方は過去の記事を参照してください。
- 群, 加法群, 楕円曲線 : 群と楕円曲線とECDH鍵共有
- 巡回群 : 楕円ElGamal暗号
- ペアリング : ペアリングと内積計算可能なL2準同型暗号
また任意の文字列から
とします。
BLS署名の基本形
署名の一般的な説明については署名の概要を参照ください。
鍵生成
有限体
署名鍵と検証鍵の作り方は、(楕円曲線の種類は異なりますが)ECDSAなどと同じです。
署名
文字列
検証
検証鍵
正当性の確認
正しく作った署名が検証に通ることを確認します。構成法から
が成り立ちます。2番目の等号はペアリングの双線型性を使っています。
安全性
署名の偽造ができないことの説明はここでは省略しますが、楕円曲線としてBLS12-381曲線を使い、
ここでBLS12-381曲線のBLSはBarreto, Lynn, Scottの略でBLS署名のBLSとは異なります。BLS12-381曲線の詳細はまた解説しますが、381ビットの素数上の楕円曲線です。以前はBN254というタイプの楕円曲線が使われていたのですが、離散対数問題の解読理論の向上により100ビットセキュリティレベルに落ちたため(それでも2023年のスーパーコンピュータでは解けませんが)、よりセキュリティレベルの高いBLS12-381が主流になっています。
ハッシュ関数の仕様
安全性の説明で「
文字列から楕円曲線
としてしまいたくなるかもしれません(
なぜなら攻撃者が、あるメッセージ
を得たとします。すると任意のメッセージ
と、署名鍵
最近は流石に無いと思いますが、以前はたまにこのようなハッシュ関数を使ったBLS署名の実装があったそうなので注意してください。
EthereumではRFC 9380(のドラフト段階)で定義された非常に複雑な方法が使われています。Ethereumの中の人にこのハッシュ関数の実装をたのまれたときは、ドラフトのバージョンが上がるごとに仕様が結構変わって苦労しました。いつ、fixされるのかと思ったものです。
なお、このアルゴリズムで使われるDSTというパラメータはブロックチェーンのプロジェクトや製品によって異なることがあるので注意してください(私のGitHubでもよくissueに上がる)。
G_1 と G_2 の取り替え
BLS署名は
この場合、検証はメッセージ
を検証します。
二つのタイプのBLS署名
プロジェクト | 署名鍵 | 検証鍵 | 署名 |
---|---|---|---|
(A) Ethereumなど | |||
(B) DFINITYなど |
署名鍵のサイズは同じですが、どちらのタイプのBLS署名を選ぶかによって、検証鍵と署名の群(楕円曲線)が入れ代わっています。
実はBLS署名でよく使われるペアリングでは楕円曲線
したがって、自分のプロジェクトでBLS署名を採用する場合、検証鍵(公開鍵)を小さくしたい場合は(A)を、署名を小さくしたい場合は(B)を選ぶことになります。
また署名生成と、検証は(B)の方が速いので速度を考慮するなら(B)となります。
私のプロジェクトherumi/blsではコンパイル時にどちらを選ぶか選択できるようになっています。
まとめ
ブロックチェーン系プロジェクトでよく見られるBLS署名を紹介しました。ペアリングの群が非対称なため、検証鍵と署名の大きさのトレードオフが存在します。また楕円曲線へのハッシュ関数を安易に作ると安全ではないことを示しました。
Discussion