用語集 / アドレスと鍵
バニティアドレス
- バニティアドレスとは?
- バニティアドレスとは、選択した単語や接頭辞をアドレス自体の文字で表現したもので、ランダムな鍵を片っ端から試し、そのうちの1つがそのパターンを符号化するまで探し続けることで得られます。
巧妙な仕掛けは何もありません。プログラムは鍵を生成し、アドレスを導出し、その文字列が希望どおりの始まり方になっているかを確認し、必要なら数十億回もこれを繰り返します。要求する文字が1つ増えるごとに、レガシーアドレスでは作業量が58倍、bech32アドレスでは32倍になるため、レガシーアドレスで6文字の接頭辞となると、およそ380億回の試行が必要です。
仕組み
バニティアドレスの生成は、暗号ではなく符号化に対する総当たり攻撃です。ビットコインのアドレスは、ハッシュをチェックサムで包み、限られた文字種で表したものなので、その見え方に影響を与える唯一の方法は、気に入った文字列になるまで新しい鍵を引き続けることです。望むアドレスから鍵へ逆向きにたどることはできません。
その算術は容赦がありません。Base58は58文字を使うため、先頭の1の後に5文字を一致させるには平均して656,356,768回の試行が必要になり、6文字なら38,068,692,544回になります。bech32は32文字の文字種を使うので、こちらは多少優しく、bc1qの後に6文字なら1,073,741,824回の試行です。vanitygenやそのGPU向け派生版といったツールは、毎秒数億個の鍵という速度でこれを処理します。だからこそ短い接頭辞は珍品であり、長い接頭辞はハードウェアの予算になるのです。
鍵を渡さずに見た目だけを手に入れたい人のために、分割鍵による生成という方法があります。自分で秘密鍵を生成し、対応する公開鍵だけを検索を行う相手に送ります。相手は、あなたの鍵と組み合わさってそのパターンを生み出す部分鍵を総当たりで探し、あなた自身が2つの半分を足し合わせます。検索する側が完成した鍵を知ることはありません。完成した秘密鍵をメールで送ってくるようなサービスは、すでにその鍵を見ています。
どこで見られるか
バニティアドレスは、アドレスがスキャンされるのではなく印刷される場面で現れます。
寄付ページ、カンファレンスのポスター、準備金証明として公開される取引所のコールドウォレットのアドレス、そして誰も鍵を保有していない文言を綴ったバーンアドレスなどです。これらのいずれも、静的な、意図的に再利用されるアドレスです。つまり所有者は、新しいアドレスなら得られたはずのプライバシーを手放し、残高が誰でも読める公開された数値になることを受け入れています。
教訓となる事例はEthereumに由来し、そのまま当てはまります。広く使われていたバニティアドレス生成ツールであるProfanityは、32ビットのランダム性から検索を開始しており、取り得る鍵の空間を4,294,967,296に縮めてしまっていました。1inchのチームは2022年9月にこの欠陥を公表し、2022年9月20日にマーケットメイカーのWintermuteは、このツールが生成したアドレスからおよそ1.6億ドルを失いました。バニティアドレス生成ツールは、秘密鍵を作ることだけを目的としたプログラムであり、あなたはそのランダム性に、そのアドレスが今後保有するすべてを委ねているのです。
バニティアドレスvsアドレスポイズニング
バニティアドレスは所有者が選ぶものですが、ポイズニングされたアドレスは、あなたのアドレスに似せて攻撃者が作り出すものです。アドレスポイズニングは同じ総当たりの手法を用いて、すでに送金したことのあるアドレスの先頭と末尾の4文字を一致させ、その後ごくわずかな額を送ることで、そっくりのアドレスをあなたの取引履歴に残し、誤ってコピーされるのを待ちます。バニティアドレスが促す習慣、つまり数文字を読んで残りを信用する習慣こそ、この攻撃が依存している習慣です。文字列全体を比較するか、コンピューターが書き換えられないハードウェアウォレットの画面で確認してください。