暗号資産におけるノンス:ノンス・カバートチャネル攻撃とは
「nonce(ノンス)」は「number used once(一度だけ使う数)」の略とされることもありますが、語源は中英語の「nonse(一度きりの機会や用途)」に由来すると考えられています。
ノンスは、各ブロックのハッシュ値(暗号学的な指紋・識別子)の一意性を保証する重要な役割を担っています。このハッシュ値はブロックチェーンの成長に不可欠です。マイナーはノンスを調整することでハッシュ値を変化させ、新しいブロックを作成するための数学的問題を解決します。
暗号資産マイニングにおけるノンスの役割
Proof of Work(PoW)コンセンサスアルゴリズムに基づくブロックチェーンのマイニングでは、ネットワークノードが新しいブロックをチェーンに追加するために数学的な問題を解いています。
ブロックの中身を「のぞいて」みると、ブロックヘッダーとトランザクションリストが含まれています。ブロックヘッダーには以下が含まれます:
- 前のブロックのハッシュ値
- マークルルートハッシュ(トランザクションのハッシュ)
- タイムスタンプ
- マイニング難易度(ブロックヘッダーのハッシュ値がこの目標値以下になるよう定期的に調整される)
- ノンス
ブロックをチェーンに追加するには、単純にハッシュ値を計算するだけでなく、その結果がネットワークで定められた難易度条件を満たす必要があります。これがなければ、ブロックが高速に追加されすぎてネットワークが合意形成できなくなります(ハッシュ計算自体は比較的簡単な処理です)。
ノンスはこの「過剰なスピード」を防ぐために使われます。マイナーはブロックを受け取ると、ノンスを加えて「セット」のハッシュ値を計算します。もしその結果が難易度目標値に合致しなければ、ノンスの値を変更して再計算します。
この仕組みのため、ネットワークノードには膨大な計算能力が必要となり、マイナーは正しいノンスを見つけるまで何十億回も試行を繰り返します。
正しいノンスが見つかると、必要なハッシュ値が得られ、ブロックが生成されます。その後、他のマイナーによる検証のためにネットワークへ共有され、問題がなければブロックチェーンに追加されます。新しいブロックを作成したマイナーには報酬が与えられます。
ノンスの主な目的は、同じ平文を同じ秘密鍵で複数回暗号化した場合に、同じハッシュ値が生成されるのを防ぐことです。これにより、盗聴者による頻度解析などのリスクを軽減できます。しかし、このノンスがランダムでなかった場合はどうなるでしょうか。ノンスの計算方法を見てみましょう。
ノンス・カバートチャネル攻撃とは
ビットコインやイーサリアムなど主要な暗号資産を支える技術は、楕円曲線デジタル署名アルゴリズム(ECDSA)です。
ECDSAは、暗号資産の所有権を証明するためのデジタル署名を生成する方式です。各署名は以下の2点を証明します:
- 秘密鍵を所有していること。各秘密鍵は公開鍵とリンクしており、暗号資産の「アドレス」はこの公開鍵を短縮したものです。
- その秘密鍵を使って特定のメッセージ(トランザクション)に署名したこと。
ECDSAは、秘密鍵から公開鍵を生成するのは簡単ですが、公開鍵から秘密鍵を導き出すのはほぼ不可能という原理に基づいています。ただし、署名に使われたノンスが特定条件下で漏洩すると、秘密鍵を解読できてしまう場合があります。やや技術的ですが、以下で説明します。
署名生成には、秘密鍵(d)、ランダムな数値(k)、メッセージのハッシュ値(h)、および秘密鍵に対応する公開鍵(Q)、ECDSAアルゴリズムで標準化された2つの値(G, n)が使われます。これらの要素を組み合わせて、デジタル署名が計算されます。
r = k × G mod n
s = (h + d × r) ÷ k mod n
The Nonce value
ECDSA署名で使われるランダムな数値k(ノンス)は非常に重要で、必ず秘密にし、一度しか使ってはいけません。そのため「ノンス」と呼ばれています。もし攻撃者が特定の署名で使われたノンスを知った場合、署名に使われた秘密鍵を突き止めることができます。数式で表すと、次のようになります。
d = (s × k − h) × r−1 mod n
また、1つのノンスを2つの異なる署名で使い回した場合も、秘密鍵が危険にさらされます。この場合、次の式からノンスを導き出せます。
k = (h1 − h2) × (s1 − s2)−1 mod n
How can you detect nonce reuse?
ECDSAアルゴリズムでrを生成する式「r = k × G mod n」を思い出してください。Gとnは定数なので、署名ごとに変わるのはk(ランダムな数値)のみです。そのため、kを2つのメッセージで使い回すと、署名のrが同じ値になります。これが、kを再利用してはいけない理由です。
この仕組みを利用し、イーサリアムのトランザクションで同じアカウントからrが同じでsが異なる2つの署名を見つけることで、ECDSAノンスの再利用を特定できます。
Tangem Walletによるノンス・カバートチャネル攻撃からの保護
ECDSAのノンスは、Samsungの認証済み(CC EAL5+)ライブラリと、認証済みハードウェアの真性乱数生成器(TRNG)によって生成されます。Tangemではノンスに一切干渉できず、認識することすらできません。
シードフレーズなしでウォレットを作成する場合も、同じTRNGモジュールと認証済みライブラリを使って秘密鍵が生成されます。これは、シードフレーズを使わないすべてのTangem Walletに該当します(推奨オプション)。この場合、すべての処理はカード内(TRNGモジュールはチップの一部)で完結し、外部データは一切使用されません。ECDSA nonce never leaves the Tangem card and is kept secret.
ブロックチェーンエクスプローラー上のノンス
トランザクションのノンスは、単に名前が同じだけで、実態はトランザクションのシーケンス番号(ブロックチェーンエクスプローラーで確認可能)です。これはリプレイ攻撃(同じトランザクションの繰り返し)を防ぐために使われ、署名データの一部となります。そのため、過去のトランザクション数に依存し、ブロックチェーンの現在の状態から導き出されるもので、TRNGやTangem Cardとは無関係です。
Tangem Walletの単一アドレス運用
アドレスの使い回しを避けることで、ビットコインや他のUTXO型ブロックチェーンではノンス再利用の問題が起きにくくなりますが、根本的な解決にはなりません。イーサリアムのようなアカウントベース型ブロックチェーンは、1組の鍵ペアで運用される設計であり、ECDSA署名では同じノンスのリスクが残ります。一方、トランザクションリプレイ防止用のノンスはまったく別物です。したがって、これらのブロックチェーンでも適切なノンス生成が必須となります。
Tangem Walletの正しいTRNGによって、同じノンスが偶然2回生成される心配はありません。これは、他人が偶然自分と同じ秘密鍵を作ってしまうのと同じくらい、現実的にはあり得ない確率です。