【CTO Tech Blog】単一のSchnorr署名と同サイズの集約署名を可能にするDahLIAS
- CTO Tech blog

少し前に発表された集約署名の新しいスキームDahLIAS↓
自分も異なる文脈で集約署名という言葉を使ってるので紛らわしいけど、↑の集約署名というのは、MuSigやFROSTのように複数の署名者(公開鍵)が同じメッセージに署名するマルチシグの集約ではなく、複数の署名者(公開鍵)がそれぞれ異なるメッセージに対して署名した各署名を集約する署名スキームのこと。
このような集約が可能な署名スキームとしてはBLS署名が有名だけど、ペアリングを必要としない離散対数ベースの署名方式では、これまでSchnorr署名を用いた半集約が可能とされてきた↓
techmedia-think.hatenablog.com
半集約というのは、n
人の署名者がそれぞれ異なるメッセージmimiに対するSchnorr署名(Ri,si)(Ri,si)を提供した場合、それらのサイズは単純にn
個分の(Ri,si)(Ri,si)(64×n
byte)になるが、n
個のRiRiと1つのs
値、もしくは1つのR値とn
個のsisi値に集約することで、署名データを約半分のサイズまで集約することができるというスキーム。
このような集約署名スキームには、
- 複数のインプットを持つトランザクションの複数の署名を集約する
- ブロック内のトランザクションの署名を集約する
- LNのチャネル通知をバッチ化する際に各通知の署名を集約する
といった用途がある。
今回提案されたDahLIASは、集約署名のサイズを単一のSchnorr署名のサイズまで圧縮する対話型のスキーム。対話型のスキームなので、上記の半集約のスキームのように後で非署名者が署名を集約するようなことはできない。つまり上記の1は可能だけど、2,3には対応できない。それでも単一のSchnorr署名と同じサイズにまで集約できるのは大きなメリットになる。
DahLIAS
DahLIASのスキームについて見ていく*1。n
人の署名者と対話型のプロトコルを進めるコーディネーターがいるものとして、
- 各署名者の秘密鍵をxixiとし、対応する公開鍵をPi=xiGPi=xiGとする(Gは楕円曲線のベースポイント)
- 各署名者
i
が署名するメッセージをmimiとする - Hnon,HsigHnon,Hsigを暗号額的ハッシュ関数とする*2
署名プロセスは、各署名者とコーディネーターの2ラウンドの通信で行われる以下の4つ(Sign, Coord, Sign’, Coord’)のプロトコルで構成される。
Sign
最初の署名ラウンド(Sign)で、各署名者i
は署名に使用するナンスにコミットする。
- 2つのシークレットナンスr1,i,r2,ir1,i,r2,iをランダムに選択し、
- 対応する公開ナンスR1,i=r1,iG,R2,i=r2,iGR1,i=r1,iG,R2,i=r2,iGを計算し、
- 第1ラウンドのステートとしてsti=(r1,i,r2,i,R2,i)sti=(r1,i,r2,i,R2,i)を保存し、
- outi=(R1,i,R2,i)outi=(R1,i,R2,i)とし、コーディネーターに送信する。
ここでは公開ナンスを送るだけで、署名対象のメッセージにはコミットしてないので、事前処理が可能。
Coord
コーディネーターは、すべての署名者から公開鍵PiPiおよびメッセージmimiおよび最初のラウンドのoutioutiを受け取ったら、
- R1=∑ni=1R1,iR1=∑i=1nR1,iとR2=∑ni=1R2,iR2=∑i=1nR2,iを計算し、
- セッションコンテキストctx=(R1,R2,((P1,m1,R2,1),...,(Pn,mn,R2,n)))ctx=(R1,R2,((P1,m1,R2,1),…,(Pn,mn,R2,n)))を定義し*3、
- b=Hnon(ctx)b=Hnon(ctx)を計算し、
- R=R1+bR2R=R1+bR2を計算し、
- ステートst = Rを保存し、ctxを全署名者に送信する。
Sign’
2回めの署名ラウンド(Sign’)で、各署名者i
は部分署名を作成する。
- コーディネーターから受け取ったctx=(R1,R2,((P1,m1,R2,1),...,(Pn,mn,R2,n)))ctx=(R1,R2,((P1,m1,R2,1),…,(Pn,mn,R2,n)))をパースし、
- 第1ラウンドで生成したR2,iR2,iと合致するR2,jR2,jが1つだけ存在するかチェックする。存在しない場合、一意ではない場合はプロセスを中止。
- 2をパスしたらそのインデックスを
j
として、(Pj,mj)=(Pi,mi)(Pj,mj)=(Pi,mi)かどうかチェックする。そうでない場合はプロセスを中止。 - 3をパスしたら、ctxの公開鍵とメッセージのペアからL=((P1,m1),...,(Pn,mn))L=((P1,m1),…,(Pn,mn))を定義し、
- b=Hnon(ctx)b=Hnon(ctx)を計算し、
- R=R1+bR2R=R1+bR2を計算し、
- ci=Hsig(L,R,Pi,mi)ci=Hsig(L,R,Pi,mi)を計算し、
- 部分署名si=r1,i+br2,i+cixisi=r1,i+br2,i+cixiを計算し、コーディネーターに送信する。
Coord’
(s1,...,sn)(s1,…,sn)を受け取ったコーディネーターは、s=∑ni=1sis=∑i=1nsiを計算し、σ=(R,s)σ=(R,s)を返す。
検証
公開鍵とメッセージのリストL=((P1,m1),...,(Pn,mn))L=((P1,m1),…,(Pn,mn))と署名σ=(R,s)σ=(R,s)を受け取った検証者は、
sG=R+∑ni=1Hsig(L,R,Pi,mi)PisG=R+∑i=1nHsig(L,R,Pi,mi)Pi
が成立するか検証する。有効な署名であれば、sGは、
sG=∑ni=1siG=∑ni=1(r1,i+br2,i+cixi)G=R1+bR2+∑ni=1ciPi=R+∑ni=1ciPisG=∑i=1nsiG=∑i=1n(r1,i+br2,i+cixi)G=R1+bR2+∑i=1nciPi=R+∑i=1nciPi
であるため、↑の式は成立する。
通常のSchnorr署名の検証と異なるのは、ciPiciPiを署名者の数分合算する点で、この検証方式はBellare-Nevenのマルチシグ方式と似ている。
ROS攻撃
通常のSchnorr署名であればナンスは1つのみだけど、Signラウンドで各署名者はナンスを2つ用意している。これは、攻撃者が複数の署名セッションを使って、正直な署名者のSignラウンドの出力outioutiを得た後で、署名に使われる最終的なナンスは同じだがチャレンジの値ciciが異なる2つの署名セッションを作ることで、実際の署名者が署名していないメッセージに対する有効案署名を作成するという攻撃*4を回避するため。
具体的には、
- b=Hnon(ctx)b=Hnon(ctx)とR=R1+bR2R=R1+bR2により、最終的なナンスがセッションコンテキストに依存することになる
- Sign’ラウンドでR2,iR2,iと合致するR2,jR2,jの一意に存在するかのチェックと、同じインデックスで(Pj,mj)=(Pi,mi)(Pj,mj)=(Pi,mi)が成立するかのチェック
がこの回避策になってるみたい。
以上がDahLIASのスキーム。他にもTaprootで使用する際に必要になる鍵の調整に関する説明も論文には記載されてる。あと少しだけ触れられていたアトミックスワップへの適用とか面白そう。
ブログ元記事へのリンク
Chaintopeでブロックチェーンの未来を共に創りませんか?
Chaintopeは、独自のブロックチェーン「Tapyrus」と、開発プラットフォーム「Tapyrus Platform」を活用し、デジタル社会の信頼基盤を構築しています。
私たちは、ブロックチェーン技術の可能性を最大限に引き出し、社会に新しい価値を提供することを目指しています。
募集職種:
ブロックチェーンエンジニア
アプリケーションエンジニア
インフラ・保守エンジニア
プロジェクトマネージャー
フィールドセールス
Chaintopeで働く魅力:
最先端のブロックチェーン技術に触れる機会
リモートワークやフレックスタイム制による柔軟な働き方
専門性の高いチームとの協働
ブロックチェーン技術に情熱を持つあなたのスキルを、私たちのチームで活かしませんか?
詳細は、採用情報をご覧ください。
https://www.chaintope.com/recruit/