暗号署名検証ツール

メッセージ、署名、そして(任意で)署名したと主張するアドレスを貼り付けてください。Ethereum の署名者を復元し、Solana ed25519 と Bitcoin BIP-137 の署名を検証し、途中のハッシュをすべて表示します。何もアップロードされず、秘密鍵が関与することもありません。

例:

ブラウザ内で JavaScript により計算されます。アドレスがアップロードまたは保存されることはありません。

署名検証ツールとは

署名検証ツールは、メッセージ、デジタル署名、公開された識別子(アドレスまたは公開鍵)を受け取り、その識別子が本当にそのメッセージに対してその署名を生成したかどうかを判定します。Ethereum では復元によって検証します。secp256k1 では署名とメッセージハッシュから署名者の公開鍵を計算でき、それをハッシュしてアドレスにし、比較します。Solana(ed25519)や Bitcoin の SegWit / レガシーメッセージ形式でも同じ考え方が使われ、ハッシュの規則だけが異なります。このページは、今日のウォレットが使う 4 つの方式すべてを、公開データのみを使ってブラウザ内で実装しています。

対応する署名の種類

種類規格署名対象のダイジェスト曲線出力
Ethereum personal_signEIP-191(バージョン 0x45)keccak256("\x19Ethereum Signed Message:\n" + length + message)secp256k1復元されたアドレス、一致バッジ、メッセージハッシュ
Ethereum 型付きデータEIP-712(eth_signTypedData_v4)keccak256(0x1901 ‖ domainSeparator ‖ hashStruct(message))secp256k1ドメインセパレーター、構造体ハッシュ、ダイジェスト、復元された署名者
Solana signMessageRFC 8032 Ed25519EdDSA の式の内部で SHA-512、プレフィックスなしed25519有効 / 無効
Bitcoin 署名メッセージBIP-137(Bitcoin Core signmessage)SHA-256d("\x18Bitcoin Signed Message:\n" + varint(len) + message)secp256k1復元された鍵、導出アドレス、一致判定

Ethereum の復元の仕組み

ECDSA 署名は (r, s) の組です。32 バイトのダイジェストとリカバリー ID v が与えられると、候補となる公開鍵は最大 2 つあり、v がそのどちらかを選びます。ツールは選択した規格に従ってダイジェストを計算し、64 バイトの公開鍵を復元し、その Keccak-256 ハッシュの末尾 20 バイトをアドレスとして取り出し、想定アドレスが入力されていればそれと比較します。アドレスは参照ではなく導出されるため、一致すれば署名時点で鍵を保有していたことの証明になり、オンチェーンのデータは不要です。

実例: EIP-712 Mail

上の「EIP-712 Mail」をクリックしてください。この型付きデータは EIP-712 仕様の例そのもので、ドメインは Ether Mail バージョン 1、チェーン ID 1、検証コントラクト 0xcccc…cccc、そして Cow から Bob への Mail 構造体で、内容は「Hello, Bob!」です。ツールはドメインセパレーター 0xf2cee375…、構造体ハッシュ 0xc52c0ee5…、最終ダイジェスト 0xbe609aee… を表示します。これは仕様のリファレンス実装が出力する値と完全に一致し、その後、添付された署名の署名者を復元します。「Hello, Bob!」を 1 文字変えるだけで復元されるアドレスはまったく別のものになります。これこそが構造化データに署名する意味です。

Bitcoin メッセージ署名の読み方

base64 署名の先頭バイトには、リカバリー ID と署名者が意図したアドレス種別の両方がエンコードされています。27–30 は非圧縮鍵の P2PKH、31–34 は圧縮鍵の P2PKH、35–38 は P2SH でラップした SegWit、39–42 はネイティブ SegWit(bc1q)です。ツールは鍵を復元して 4 種類すべてのアドレス形式を導出し、入力したアドレスにどれが一致するかを報告します。Electrum をはじめいくつかのウォレットは bc1q アドレスに 31–34 のヘッダーで署名しますが、この場合は拒否せず、注記付きで受け入れます。テストネットアドレス(m…、n…、2…、tb1q…)はプレフィックスから認識されます。

主な用途

受け付ける入力形式

関連: ハッシュツールでメッセージの Keccak-256 を自分で計算する、EIP-55 コンバーターでアドレスのチェックサムを修正する、Ethereum トランザクションデコーダーで署名が使われたトランザクションをデコードする。

よくある質問

personal_sign と eth_signTypedData の違いは何ですか?

personal_sign(EIP-191)は、生のメッセージにプレフィックス \x19Ethereum Signed Message:\n とその長さを付けてハッシュします。ウォレットはテキストを表示できますが、その意味は説明できません。EIP-712 は型付き構造体をドメイン(name、version、chainId、verifyingContract)と一緒にハッシュするため、ウォレットは各フィールドを表示でき、ある dApp やチェーン向けの署名を別の場所で再利用することもできません。復元の計算は同じで、ダイジェストだけが異なります。

復元されたアドレスが一致しないのはなぜですか?

ほぼ必ずメッセージのバイト列が異なることが原因です。末尾の改行、Windows の改行コード、Unicode 正規化の違い、あるいはテキストが UTF-8 ではなく hex バイト列として署名された、などです。EIP-712 では、chainId、verifyingContract、型定義が異なるとドメインセパレーターが変わり、結果として署名者も変わります。署名そのものが間違っていることはまれです。このページが表示するハッシュを、コードが計算した値と比較してください。

v の値は何を意味しますか?

65 バイトの Ethereum 署名の最後のバイトがリカバリー ID です。元々の Ethereum のエンコーディングでは 27 または 28、新しいライブラリでは 0 または 1、EIP-2098 のコンパクト署名では s の最上位ビットに折り込まれます。どの形式も受け付け、復元の前に正規化します。

Solana の検証に RPC やウォレットは必要ですか?

いいえ。Solana の signMessage は生のバイト列に対するプレフィックスなしの通常の ed25519 署名を生成するため、検証にはメッセージ、64 バイトの署名、32 バイトの公開鍵(ウォレットアドレス)だけが必要です。このページは RFC 8032 の検証を JavaScript で実装しています。

対応している Bitcoin の署名形式は?

Bitcoin Core の signmessage、Electrum、Sparrow、ほとんどのハードウェアウォレットが生成する従来の 65 バイト base64 形式(BIP-137)です。ヘッダーバイト 27–42 の後に r と s が続きます。レガシー、ネスト SegWit、ネイティブ SegWit のアドレスに対応し、Electrum が bc1q アドレスにレガシーヘッダーを使う慣習も扱います。BIP-322 と Taproot(bc1p)の署名は別の方式のため対応していません。

このツールで署名できますか?

いいえ。署名には秘密鍵が必要ですが、このサイトは鍵を生成、インポート、保存することは一切ありません。公開データ、つまりメッセージ、署名、署名者のアドレスまたは公開鍵から署名を検証するだけです。

署名はサーバーに送信されますか?

いいえ。すべてのハッシュ計算(Keccak-256、SHA-256、SHA-512)と曲線演算(secp256k1 の復元、ed25519 の点演算)はブラウザ内で実行されます。ページは読み込み後にネットワークリクエストを行いません。