デジタル署名~シュノア署名とECDSAの比較~
はじめに
デジタル署名はビットコインには欠かせない暗号技術の1つであり、その署名方式には楕円曲線DSAが使われています。また近いうちに新しいデジタル署名「シュノア署名」がビットコインに実装される予定です。今回は、既存の署名方式である楕円曲線DSA(以下、ECDSAと称す)とシュノア署名の署名と検証方式を比較し、シュノア署名がECDSAとどう違うのかを見ていきます。
デジタル署名
デジタル署名とは、秘密鍵を使って任意のメッセージを署名し、第三者がそれに対応する公開鍵を使ってその署名を検証することで、そのメッセージが秘密鍵を持っている本人によって署名されたことを認証するための仕組みです。以下の図はIPAが公開しているデジタル署名の概要図ですが、IPAのサイトではデジタル署名やPKIについて網羅的かつ簡潔に解説しているので、興味のある方はのぞいてみて下さい(リンク先はこちら)。
ビットコインでは、コインの所有者を証明するためにこのデジタル署名を活用しており、そのデジタル署名をECDSAといいます。ビットコインはこのECDSAという署名方式を採用していますが、近年ビットコインは新しい署名方式を採用しようとする動きがあるのをご存知でしょうか。そのデジタル署名は「シュノア署名」と呼ばれており、ECDSAにはない特性をもっており、その特性を活かすことでビットコインのセキュリティやプライバシーの向上、検証処理の効率化などが期待されています。シュノア署名はビットコインにとって重要な要素で、スケーリング問題やプライバシーの向上にとって欠かせない技術なのです。シュノア署名の解説サイトは多々あるので、署名自体の解説や導入メリットはそれらに譲るとし、ここではシュノア署名と現状のビットコインの署名方式であるECDSAの違いについて見ていきたいと思います。
ECDSAによる署名と検証
ECDSAの署名は以下のように秘密鍵、公開鍵などを入力とし、計算1の演算をすることで、署名(r, s)を出力します。
ECDSAの署名過程
-----------------------------------
秘密鍵 k
公開鍵 P = k * G
メッセージ m
ランダムな値 z
R = z * G
RのX座標 r
-----------------------------------
計算1 s = (Hash(m) + r*k)/z
署名 (r, s)
検証は以下のように公開鍵や署名を入力とし、計算1~3の演算をすることで、Nが出力され、そのNのX座標と署名(r, s)の r が等しいかを検証します。もし等しければ署名は有効とみなします。
ECDSAの検証過程
-----------------------------------
公開鍵 P
署名 (r, s)
メッセージ m
-----------------------------------
計算1 u = Hash(m)/s
計算2 v = r/s
計算3 N = u*G + v*P
検証 NのX座標 = r かどうか
では次にシュノア署名について見ていきましょう。
シュノアによる署名と検証
シュノアの署名においては、入力データはECDSAと同じですが、計算部分が異なっていることに注目してください。
シュノアの署名過程
-----------------------------------
秘密鍵 k
公開鍵 P = k * G
メッセージ m
ランダムな値 z
R = z * G
RのX座標 r
-----------------------------------
計算1 s = z + Hash(r || P || m)*k
署名 (r, s)
検証における入力データもECDSAと同じですが、計算と検証部分が異なっていることに注目してください。
シュノアの検証過程
-----------------------------------
公開鍵 P
署名 (r, s)
メッセージ m
-----------------------------------
計算1 r から Rを求める
検証 s * G = R + Hash(r || P || m)*P かどうか
2つのデジタル署名の比較
ECDSAとシュノアの署名計算を比較すると、シュノアは除算がないことが分かります。
ECDSAの署名計算 s = (Hash(m) + r*k)/z
シュノアの署名計算 s = z + Hash(r || P || m)*k
これは些細なことのように思われますが、これによって署名と署名の加算が可能となります。以下に2つのシュノア署名を加算した場合の検証過程を見てみましょう(便宜上Hash関数の中身は省略しています)。
シュノア署名の加算
-----------------------------------
署名1 s1 = z1 + Hash(...)*k1
署名2 s2 = z2 + Hash(...)*k2
加算 s = s1 + s2
= (z1 + z2) + Hash(...)*(k1 + k2)
検証 s*G = z*G + Hash(...)*(k1 + k2)*G
= z*G + Hash(...)*(P1 + P2) [P1 = k1*G, P2 = k2*Gより]
= R + Hash(...)*P
このように2つの署名を加算して新しい1つの署名を作ったとしても、それは有効な署名になることがわかります。この特性を応用できるものの1つがマルチシグです。通常のマルチシグの場合、例えばライトニングネットワークで使われる2 of 2マルチシグだと、2つの署名(と公開鍵)がブロックチェーンに記録され、またビットコインアドレスもマルチシグアドレス(P2SH)だと分かってしまいます。しかし、シュノア署名の場合、署名と署名を加算して1つの新しい署名を作ることができるので、ブロックチェーンに記録されるのは1つの署名(と公開鍵)であり、またアドレスも通常のアドレス(P2PK)のままとなります。この応用技術はMuSigと呼ばれる名前でBlockstream社から提案されています。これによってブロックチェーンへ書き込むデータ量を削減したり、アドレスの種類を見かけ上同じにすることで、スケーリングやプライバシーの向上が見込まれます。
この他にもシュノア署名を応用することで可能となるユニークな技術があります。例えばアダプター署名やスクリプトレススクリプト、ペイメントポイントなど数え切れないほどの応用例が提案されています。それらについては以降の記事で紹介できたらなと思います。
(参考サイト)
- シュノア署名(日本語解説)
- シュノア署名(BIP340)
- その他のシュノア署名関連