Digital Signature Algorithm (DSA)とは?
Digital Signature Algorithm (DSA) は、メッセージが正当で改ざんされていないことを、暗号鍵の一対を使って証明する標準的な方法です。数式で瞬時に検証できる封蝋のようなもので、公証人は不要です。
DSAはデータを暗号化する、というのは違います。DSAはデータに署名をして、誰が送ったかと内容が変わっていないことを他者が確認できるようにするものです。暗号化は別の仕組みです。
Digital Signature Algorithm (DSA) の仕組み
ウォレットを例に簡単に説明します。秘密を明かさずにメッセージが自分のものであることを証明したいときの流れは次の通りです:
- Step 1: あなたのウォレットはあなたの 秘密鍵 を保持し、それは秘密のままです。
- Step 2: ウォレットにあなたの 暗号通貨の取引 やメッセージの一つに署名するよう依頼します。
- Step 3: ウォレットはメッセージをハッシュし、k と呼ばれる新しいランダムな数を選び、秘密鍵を使って署名ペア r と s を計算します。
- Step 4: 誰でもあなたの 公開鍵 を使って、r と s がメッセージとあなたの鍵に一致するかを検証できます。
- Step 5: 検証が通れば、ネットワークはその操作を正当なものとして受け入れます。秘密は露出しません。
これが基本的な考え方です。秘密で署名し、公開で検証します。
Digital Signature Algorithm (DSA) が重要な理由
なぜ気にするべきか?インターネット上の信頼には証拠が必要だからです。
- 利点: 秘密鍵を共有せずに著作者性と完全性を証明できます。処理は高速で自動的、そして良い意味で地味です。
- 視点: 偽造された承認や密かな改ざんを防ぎ、デジタル資産 の市場をより安全にします。
- 関係性: ウォレット操作、ソフトウェア更新、スマートコントラクトの承認などに署名するときは必ず出会います。アプリが内部の計算を隠していても同じです。
署名時にランダムな k 値を再利用しないでください。サポートがあれば決定論的な署名を優先してください。k を使い回すと、一度のミスで秘密鍵が露出する可能性があります。
Digital Signature Algorithm (DSA) の主な特徴
安全性を支える特徴:
- ランダム性: 各署名は安全を保つために新しく予測不可能な k を必要とします。
- 対: 署名は単一の塊ではなく、2つの数 r と s で構成されます。
- ハッシュ化: メッセージのハッシュに署名するため、一貫性があり処理も高速です。
- 標準: NIST の FIPS 186 によって定義されており、監査者やライブラリが共通の仕様を参照できます。
- 検証: 公開鍵を持つ誰でも、秘密を知らずに証明を検証できます。
Digital Signature Algorithm (DSA) はどのように計算されるか?
手で計算する必要はありませんが概略は以下の通りです。システムには公開パラメータ p, q, g があり、秘密鍵は x、公開鍵は y で y = g^x mod p です。
H = hash(message) choose k as a nonzero random in Z_q r = (g^k mod p) mod q s = inv(k, q) * (H + x*r) mod q signature = (r, s) 検証では、まず w = inv(s, q) を計算し、u1 = H * w、u2 = r * w を求めます。v = (g^u1 * y^u2 mod p) mod q が r と等しければ署名は有効です。
署名は送信元と完全性を証明しますが、機密性は証明しません。メッセージが機密であれば、別途暗号化が必要です。
例
ウォレットが送金リクエストに署名し、メッセージと r、s をブロードキャストすると、検証者は署名を確認してからコインを移動します。
面白い事実
DSA は90年代初頭に標準化され、Schnorr の考えに影響を受けました。後に有名な教訓があり、あるゲーム機チームが署名用のノンスを使い回したために秘密鍵が露呈してしまったという話があります。
まとめ
Digital Signature Algorithm (DSA) はメッセージや送金に対する数理的な承認印です。考えは単純ですが、強力な保護を提供します。
