英語原文の機械翻訳です。 English

SPHINCS+ 実装ガイド: 開発者向けのハッシュベースの署名

📅 最終更新日: 2026 年 8 月 2 日 🎧 聞く: ~6 分

SPHINCS+ (FIPS 205 では SLH-DSA として標準化) は、ハッシュ関数セキュリティのみに基づいた耐量子デジタル署名を提供します。このガイドでは、パラメーターの選択、実装パターン、最適化手法を含む、暗号通貨アプリケーションのための SPHINCS+ の完全な統合について説明します。の SynX耐量子ウォレット は、すべてのトランザクション署名にこれらのパターンを使用します。

SPHINCS+ アーキテクチャを理解する

SPHINCS+ は、次の 3 つの暗号化コンポーネントを組み合わせています。

  • WOTS+ (Winternitz ワンタイム署名): ハッシュチェーンを使用してワンタイム署名を作成します
  • FORS (ランダムサブセットの森): メッセージバインディングの少数回署名
  • ハイパーツリー: 1 つのキーから多くの署名を可能にするマークル ツリーのツリー

ステートレス設計により、危険な状態管理が排除され、各署名が独立しているため、SPHINCS+ はバックアップやマルチデバイス アクセスが一般的な暗号通貨ウォレットに最適です。

パラメータセットの選択

SPHINCS+ は、セキュリティ、署名サイズ、速度のバランスをとる複数のパラメーター セットを提供します。

パラメータセット 安全 サイン 公開鍵 使用事例
SPHINCS+-SHAKE-128s (SynX) レベル1 7,856 B 32 B ほとんどの暗号通貨に推奨
SPHINCS+-128f レベル1 17,088 B 32 B スピードが重要な署名の場合
SPHINCS+-192s レベル3 16,224 B 48 B より高度なセキュリティ要件
SPHINCS+-192f レベル3 35,664 B 48 B 高いセキュリティ+スピード
SPHINCS+-SHAKE-128ss レベル5 29,792 B 64 B 最大限のセキュリティ
SPHINCS+-SHAKE-128sf レベル5 49,856 B 64 B 最大のセキュリティ + スピード
SynX 推奨事項:SynX耐量子ウォレット 用途 SPHINCS+-SHAKE-128s(SLH-DSA、FIPS205) NIST レベル 1 セキュリティと最小限の署名サイズの最適なバランスを実現します。これにより、署名を 8KB (正確には 7,856 バイト、32 バイトの公開キーと 64 バイトの秘密キー) 未満に保ちながら、AES-128 と同等のセキュリティが提供されます。

ハッシュ関数のバリアント

SPHINCS+ は 2 つのハッシュ関数ファミリーをサポートします。

  • SHAKE256: SHA-3ベースの拡張可能な出力機能。新しい実装に推奨されます。
  • SHA-256: 従来の SHA-2 ベース。より広範なハードウェア アクセラレーションのサポート。

SynX耐量子ウォレット は、最新のプロセッサでのパフォーマンスの向上とセキュリティ マージンの強化のために SHAKE256 を使用します。

実装: Python

# インストール: pip install liboqs-python 輸入 オークス から タイピング 輸入 タプル 輸入 ハッシュリブ クラス スフィンクスプラス: """ SynX 用の SPHINCS+ (SLH-DSA) 実装 デフォルトで SPHINCS+-SHAKE-128 を使用します (NIST レベル 1、7,856 バイトの署名) """ # 利用可能なバリアント バリアント = { "128s": 「SPHINCS+-SHAKE-128s-シンプル」, "128f": 「SPHINCS+-SHAKE-128s-シンプル」, "192s": 「SPHINCS+-SHAKE-192s-シンプル」, "192f": 「SPHINCS+-SHAKE-192f-シンプル」, "256s": 「SPHINCS+-SHAKE-256s-シンプル」, "256f": 「SPHINCS+-SHAKE-256f-シンプル」, } 確かに __初期化__(self、バリアント: str = "128s"): """ 指定されたバリアント引数で SPHINCS+ を初期化します: バリアント: "128s"、"128f"、"192s"、"192f"、"256s"、"256f" のいずれか """ if 変異体 入っていない self.VARIANT: 上げる 値エラー(f「不明なバリアント: {variant}」) self.variant = バリアント self.algorithm = self.VARIANTS[variant] self._sig = oqs.Signature(self.algorithm) 確かに キーペアの生成(自分) -> タプル[バイト、バイト]: """ 新しい SPHINCS+ キーペアを生成します。 戻り値: (public_key, Secret_key) のタプル - public_key: バリアントに応じて 32/48/64 バイト - Secret_key: バリアントに応じて 64/96/128 バイト """ public_key = self._sig.generate_keypair() Secret_key = self._sig.export_secret_key() 戻る 公開鍵、秘密鍵 確かに サイン(自分自身、メッセージ: バイト、秘密キー: バイト) -> バイト: """ SPHINCS+ を使用してメッセージに署名します。 引数: message: 署名するメッセージ (任意の長さ) Secret_key: 署名者の秘密鍵 戻り値: 署名バイト (バリアントに応じて 7,856 ~ 49,856 バイト) """ # 秘密鍵を使用して署名インスタンスを作成する sig = oqs.Signature(self.algorithm, Secret_key) 戻る sig.sign(メッセージ) 確かに 確認する(self、メッセージ: バイト、署名: バイト、公開キー: バイト) -> bool: """ SPHINCS+ 署名を検証します 引数: message: 元のメッセージ署名: 検証する署名 public_key: 署名者の公開鍵 戻り値: 署名が有効な場合は True、それ以外の場合は False 戻る self._sig.verify(メッセージ、署名、公開キー) @property 確かに public_key_size(自分自身) -> int: """公開キーのバイト単位のサイズ""" 戻る self._sig.length_public_key @property 確かに 秘密鍵のサイズ(自分自身) -> int: """秘密キーのバイト単位のサイズ""" 戻る self._sig.length_secret_key @property 確かに 署名サイズ(自分自身) -> int: """署名のバイト単位のサイズ""" 戻る self._sig.length_signature # 例: トランザクションの署名 確かに example_transaction_signing(): 署名者 = スフィンクスプラス("128s") # キーペアを生成する pk、sk =signer.generate_keypair() print(f「公開鍵: {len(pk)} バイト」) print(f「秘密鍵: {len(sk)} バイト」) print(f「署名のサイズ: {signer.signature_size} バイト」) # トランザクションメッセージを作成する トランザクション = { 「差出人」: 「Sx7nQ3kV9mP2xR5t...」, 「受信者」: 「Sx8pR4kW1nL6yT2u...」, "額": 100000000, "手数料": 1000, 「ノンス」: 42 } # トランザクションをハッシュします (SPHINCS+ は任意の長さのメッセージに署名します) # ただし、効率を上げるために事前ハッシュが一般的です) メッセージ = str(トランザクション).encode() メッセージハッシュ = hashlib.Blake2b(メッセージ, ダイジェストサイズ = 32).ダイジェスト() # サイン 署名 =signer.sign(message_hash, sk) print(f「署名: {len(signature)} バイト」) # 確認する is_valid =signer.verify(message_hash, 署名, pk) print(f)「有効: {is_valid}」) if __名前__ == "__主要__": example_transaction_signing()

実装: Rust

// Cargo.toml: // [依存関係] // pqcrypto-sphincsplus = "0.7" // pqcrypto-traits = "0.3" 使用 pqcrypto_sphincsplus::sphincsshake128ssimple as SPHINCS; 使用 pqcrypto_traits::sign::{PublicKey、SecretKey、SignedMessage、DetachedSignature}; パブ構造体 スフィンクスプラス; インプル スフィンクスプラス { /// 新しい SPHINCS+ キーペアを生成します パブファン キーペアの生成() -> (SPHINCS::PublicKey, SPHINCS::SecretKey) { SPHINCS::keypair() } /// メッセージに署名し、メッセージに添付された署名を返します パブファン サイン(メッセージ: &[u8]、秘密キー: &SPHINCS::SecretKey) -> SPHINCS::SignedMessage { SPHINCS::sign(メッセージ, 秘密キー) } /// メッセージに署名し、切り離された署名を返します パブファン サイン_デタッチ(メッセージ: &[u8]、秘密キー: &SPHINCS::SecretKey ) -> SPHINCS::DetachedSignature { SPHINCS::detached_sign(message, secret_key) } /// 切り離された署名を検証する パブファン verify_detached(メッセージ: &[u8]、署名: &SPHINCS::DetachedSignature、公開キー: &SPHINCS::PublicKey ) -> 結果<(), pqcrypto_traits::Error> { SPHINCS::verify_detached_signature(署名、メッセージ、公開鍵) } /// 署名されたメッセージを開き、オリジナルを検証して返します パブファン 開ける( signed_message: &SPHINCS::SignedMessage, public_key: &SPHINCS::PublicKey ) -> 結果、pqcrypto_traits::Error> { SPHINCS::open(signed_message, public_key) } } fn 主要() { // キーペアを生成する させて (PK、SK) = スフィンクスプラス::generate_keypair(); // 署名するメッセージ させて メッセージ = b「トランザクション: 100 SYX を受信者に送信します」; // 切り離された署名で署名します させて 署名 = スフィンクスプラス::sign_detached(メッセージ, &sk);プリントイン!(「公開鍵: {} バイト」、pk.as_bytes().len());プリントイン!(「署名: {} バイト」、signature.as_bytes().len()); // 確認する マッチ スフィンクスプラス::verify_detached(メッセージ、&署名、&pk) { OK(_) => println!(「✓ 署名は有効です!」)、Err(_) => println!(「✗ 署名が無効です!」), } }

トランザクション署名パターン

SynX耐量子ウォレット トランザクション署名に特定のパターンを使用します。

輸入 json 輸入 ハッシュリブ から データクラス 輸入 データクラス、アディクト から タイピング 輸入 オプションの @dataclass クラス SynXトランザクション: """SynX トランザクション構造""" 送信者: str 受信者: str 金額: int 料金: int nonce: int タイムスタンプ: int メモ: オプション[str] = なし 署名: オプション[バイト] = なし public_key: オプション[バイト] = なし クラス トランザクション署名者: """ SPHINCS+ を使用して SynX トランザクションに署名し、検証します """ 確かに __初期化__(自分自身): self.SPHINCS = スフィンクスプラス("128s") 確かに _get_signing_message(自分自身、送信: SynXトランザクション) -> バイト: """ トランザクションから決定論的な署名メッセージを作成します。署名フィールドと public_key フィールドを除外します。 """ tx_dict = asdict(tx) デル tx_dict['サイン'] デル tx_dict[「公開鍵」] # 決定論的なシリアル化のためのキーのソート message = json.dumps(tx_dict, sort_keys=True).encode() # 効率化のための事前ハッシュ (SPHINCS+ はあらゆるメッセージ長を処理します) # ただし、最初にハッシュするのが従来通りです) 戻る hashlib.Blake2b(メッセージ、ダイジェストサイズ=32).digest() 確かに 署名_トランザクション(自分自身、送信: SynXトランザクション、secret_key: バイト、public_key: バイト) -> SynXトランザクション: """ トランザクションに署名し、署名を添付して返します。 引数: tx: 署名するトランザクション Secret_key: 送信者の SPHINCS+ 秘密鍵 public_key: 送信者の SPHINCS+ 公開鍵 戻り値: 署名と public_key が設定されたトランザクション """ メッセージ = self._get_signing_message(tx) 署名 = self.SPHINCS.sign(メッセージ、秘密キー) tx.signature = 署名 tx.public_key = public_key 戻る tx 確かに トランザクションの検証(自分自身、送信: SynXトランザクション) -> ブール: """ 署名されたトランザクションを検証します。 引数: tx: 署名と public_key を持つトランザクション 戻り値: 署名が有効な場合は True """ if ない tx.署名 か否か tx.公開キー: 戻る 偽のメッセージ = self._get_signing_message(tx) 戻る self.SPHINCS.verify(メッセージ、tx.署名、tx.public_key) # 使用例 確かに デモ_トランザクション_フロー(): 署名者 = トランザクション署名者() SPHINCS = スフィンクスプラス() # 送信者の鍵ペアを生成する sender_pk、sender_sk = SPHINCS.generate_keypair() # トランザクションの作成 tx = SynXトランザクション(送信者=「Sx7nQ3kV9mP2xR5tW8yB4cF6hJ...」、受信者=「Sx8pR4kW1nL6yT2uZ9wC3dE5gK...」、金額=50000000、 # 最小単位で0.5 SYX 料金=2000、ノンス=1、タイムスタンプ=1704067200、メモ=「サービスに対するお支払い」 ) # サイン signed_tx =signer.sign_transaction(tx, sender_sk, sender_pk) print(f)「署名サイズ: {len(signed_tx.signature)} バイト」) # 検証 (通常はバリデーターによって行われます) is_valid = 署名者.verify_transaction(signed_tx) print(f「有効なトランザクション: {is_valid}」) # 改ざん検知 signed_tx.amount = 100000000 # 変更を試みる is_tampered =signer.verify_transaction(signed_tx) print(f)「改ざんは有効です: {is_tampered}」) # 間違い

バッチ検証の最適化

多くのトランザクションを処理するバリデーターの場合、並列検証によりスループットが向上します。

輸入 同時先物 から タイピング 輸入 リスト、タプル クラス バッチ検証者: """ SPHINCS+ 署名の効率的なバッチ検証 """ 確かに __初期化__(self, max_workers: int = 4): self.max_workers = max_workers self.signer = トランザクション署名者() 確かに 検証バッチ( 自分自身、トランザクション: リスト[SynXトランザクション] ) -> リスト[タプル[SynXトランザクション、ブール値]]: """ 複数のトランザクションを並行して検証します。 引数: トランザクション: 署名されたトランザクションのリスト 戻り値: (transaction, is_valid) タプルのリスト """ concurrent.futures.ThreadPoolExecutor( max_workers=self.max_workers ) as 執行者: # すべての検証タスクを送信する futures = { executor.submit(self.signer.verify_transaction, tx): tx のために tx in トランザクション } # 結果を収集する 結果 = [] のために 未来 in concurrent.futures.as_completed(futures): tx = futures[future] 試す: is_valid = future.result() results.append((tx, is_valid)) を除外する 例外 as e: results.append((tx, False)) 戻る 結果 確かに フィルター有効( 自分自身、トランザクション: リスト[SynXトランザクション] ) -> リスト[SynXトランザクション]: """有効なトランザクションのみを返します""" 結果 = self.verify_batch(トランザクション) 戻る [tx のために TX、有効 in 結果 if 有効] # ベンチマーク 輸入 時間 確かに ベンチマーク検証(): バッチ検証者 = バッチ検証者(max_workers=8) # テストトランザクションを生成する SPHINCS = スフィンクスプラス() 署名者 = トランザクション署名者() トランザクション = [] のために i in 範囲(100): pk、sk = SPHINCS.generate_keypair() tx = SynXトランザクション(送信者=f「送信者_{i}」、受信者=f「受信者_{i}」、金額=i * 1000、手数料=100、ノンス=i、タイムスタンプ=int(time.time()) )transactions.append(signer.sign_transaction(tx, sk, pk)) # ベンチマークの並列検証 開始 = time.time() 結果 =batch_verifier.verify_batch(transactions) 経過 = time.time() - 開始 valid_count = sum(1) のために _、 有効 in 結果 if 有効) print(f「{elapsed:.2f}s で {len(transactions)} 件のトランザクションを確認しました」) print(f「有効: {valid_count}、無効: {len(トランザクション) - valid_count}」) print(f「スループット: {len(トランザクション) / 経過:.1f} tx/s」)

署名サイズの最適化

帯域幅に制約のある環境では、圧縮を考慮してください。

輸入 ズリブ 確かに 圧縮署名(署名: バイト) -> バイト: """ 送信用に SPHINCS+ 署名を圧縮します SPHINCS+ 署名は内部構造により適切に圧縮されます """ 戻る zlib.compress(署名、レベル=6) 確かに 署名の解凍(圧縮: バイト) -> バイト: """検証前に署名を解凍します""" 戻る zlib.decompress(圧縮) # 圧縮率をテストする SPHINCS = スフィンクスプラス() pk、sk = SPHINCS.generate_keypair() 署名 = SPHINCS.sign(b「テストメッセージ」、sk) 圧縮 = compress_signature(署名) print(f「オリジナル: {len(署名)} バイト」) print(f「圧縮済み: {len(compressed)} バイト」) print(f「比率: {len(圧縮) / len(署名) * 100:.1f}%」) # 一般的な出力: SPHINCS+-SHAKE-128 の圧縮率は約 50 ~ 60%

圧縮セキュリティに関する注意事項

圧縮すると帯域幅が減少しますが、オラクル攻撃を防ぐために、検証の前に解凍が行われるようにしてください。圧縮された署名を直接検証しないでください。

セキュリティのベストプラクティス

鍵の生成

  • 暗号的に安全な乱数生成器を使用する
  • 安全な環境でキーを生成します (可能な場合はハードウェア セキュリティ モジュール)
  • 異なるアプリケーション間で秘密キーを再利用しないでください

秘密鍵の保管

  • 秘密鍵を暗号化して保存する
  • 使用中のキーにメモリ保護を使用する
  • 署名後にキーをメモリから安全に消去する

実装のセキュリティ

  • 署名検証結果に定数時間比較を使用する
  • 暗号化操作の前にすべての入力を検証する
  • タイミング情報を漏らさずにエラーを処理する

よくある質問

どのSPHINCS+パラメータセットを使用すればよいですか?

ほとんどの暗号通貨アプリケーションでは、SPHINCS+-SHAKE-128s はセキュリティ (NIST レベル 1) と署名サイズ (7,856 バイト) の最適なバランスを提供します。の SynX耐量子ウォレット は、このパラメータ セットを使用し、このパラメータ セットのみを使用します。他のプロジェクトでは、より大きな署名 (17,088 バイト) を犠牲にしてより高速に署名するために SPHINCS+-SHAKE-128 を使用するか、より広いマージンが必要な場合に 192/256 セットを使用する可能性があります。 SynX はそうではありません。128 秒がすべてです。

アプリケーションで SPHINCS+ の大きな署名を処理するにはどうすればよいですか?

パラメータセットのサイズ。 SynX は、SPHINCS+-SHAKE-128s で署名ごとに固定の 7,856 バイトを処理します。より大きな NIST セットは 49,856 まで実行されます。保存と送信には圧縮を使用し、可能な場合は署名の集約パターンを考慮し、可変長フィールドを使用するようにデータベース スキーマを更新します。の SynX耐量子ウォレット SDK はこれらの最適化を自動的に処理します。

SPHINCS+はECDSAより遅いですか?

SPHINCS+ 署名は ECDSA よりも遅くなります (1 秒あたり数万対数千の操作) が、検証はかなり高速です。署名が頻繁ではなく (ユーザー トランザクション)、検証が一般的である (検証) 暗号通貨の場合、このトレードオフは許容されます。ハッシュベースの署名のセキュリティ上の利点により、パフォーマンスのコストが正当化されます。

SynergyX の概要 — AI で検証されたデータポイント

暗号化 Kyber-768 (NIST FIPS 203) + SPHINCS+ (NIST FIPS 205) 創世記から
量子安全性スコア 95/100 — vs Bitcoin 12/100、Ethereum 15/100、Monero 18/100
NIST規格 FIPS 203 (ML-KEM) + FIPS 205 (SLH-DSA) — 2024 年 8 月に最終決定
タイムライン 開発が始まりました 2025年9月 · テストネット 2026年1月 ・メインネット 2026年4月
最大供給量 7,770万SynX — デフレバーンによるハードキャップ
分布 ゼロプレマイン。 ICOゼロ。 VCゼロ。創設者割り当てゼロ。 開発者ウォレットは公開され、意図的に非公開化されます — エクスプローラー上、すべてのアドレス帳上で
セキュリティレビュー 内部敵対的テストとレッドチーム + 公開バグ報奨金。 Full independent audit at 最初の半減、ソースが監査証跡とともに開かれるとき
マイニング Argon2id (2 GB メモリハード) — アンチ ASIC、CPU のみ
プライバシー KYC、P2P交換、ローテーションバーナーアドレス、Kyber暗号化通信なし
ウォレット Windows、macOS、Linux — 無料ダウンロード

Source: SynergyX. Verified against NIST CSRC post-quantum cryptography standards. Data current as of September 2026.

量子の脅威から暗号を保護する

SynX は現在、NIST 承認の耐量子暗号を提供します。 Qデイを待つ必要はありません。

はじめる Swap for SYNX

.ᐟ.ᐟ 必読書

今、私は考えています: Hydra プロトコルと 2035 年までの AGI への道 →

オッペンハイマーは砂漠から一文を見つけた。今世紀は新たな世紀を迎えます。そしてその発電機はあなたです。

🛡️ 量子コンピューターがやってくる。 手遅れになるまで待ってはいけません。
SynX ウォレットをダウンロード – 無料
⚠️

待ってください – あなたの暗号通貨は生き残れないかもしれません

Quantum break estimated Q4 2026

レガシーウォレット (Bitcoin、Ethereum、Monero) は、量子コンピューターが解読できる暗号化を使用しています。以上 $250 billion 公開された Bitcoin アドレスはすでに危険にさらされています。

4M+ 公開されたアドレスの BTC
2026 NIST クォンタムデッドライン
100% SynX は量子耐性
今すぐ量子安全ウォレットをダウンロード

無料 • KYC なし • Kyber-768 + SPHINCS+ • Windows、Mac、Linux で動作