SLH-DSA(SPHINCS+)とFIPS 205

格子暗号に未知の欠陥が出ても、ハッシュ関数さえ健全なら守れる保険がほしい。SLH-DSAはWOTS+・FORS・ハイパーツリーを積み、状態管理なしで最も保守的な量子耐性署名を実現する仕組みを原理から押さえられる。

応用ハッシュベース署名SPHINCS+SLH-DSAポスト量子暗号FIPS 205暗号最終更新: 2026-07-28
3つの要点
TL;DR
  1. SLH-DSA(FIPS 205)は SPHINCS+ ベースのステートレスなハッシュ署名。安全性をハッシュの原像・第2原像・衝突耐性だけに置き、格子や数論と独立した量子耐性を持つ。
  2. WOTS+ が一回署名、FORS がメッセージ署名、ハイパーツリーが多数の WOTS+ 鍵を1公開鍵へ束ねる。鍵インデックスを乱数で選び、XMSS/LMS のような状態管理を不要にする。
  3. 署名は 128s で約7.8KB、128f で約17KB、256f で約50KB。s は小さく署名が遅く、f は大きく速い。ML-DSA より巨大でも保守性を優先する場面で使う。

なぜ「ハッシュだけ」に賭けるのか

ポスト量子暗号の標準として NIST が最初に選んだ署名は、格子ベースの ML-DSA(Dilithium)でした。速く鍵も署名も小さい優等生です。にもかかわらず NIST は同時に、遅くて署名が桁違いに大きい SLH-DSA をもう1本標準化しました。理由は保険です。

格子暗号の量子耐性は「Shor が効かず、いまのところ効率的な量子攻撃が見つかっていない」という経験的な安全性に支えられています。もし格子に未知の構造的欠陥が見つかれば、ML-DSA は一斉に崩れます。そこでまったく別の土台に立つ署名を1本用意しておく。SLH-DSA の安全性は、格子とも数論とも無関係に、ハッシュ関数の第2原像・原像・耐衝突性だけに帰着します。ハッシュはすでに数十年の解析に耐え、量子計算機に対しても Grover による平方根の加速しか知られていません。この「壊れにくさ」こそが SLH-DSA の存在意義です。

ステートフルとステートレスの分岐点

ハッシュベース署名には先行標準の LMS(RFC 8554)と XMSS(RFC 8391)がありますが、これらはステートフルです。1回限りの署名鍵を使うたびに「どの鍵を消費したか」を不揮発に記録し、二度と使い回さないよう管理する義務があります。バックアップからの巻き戻しや仮想マシンのクローンで状態が復元されると、同じ鍵を再利用してしまい秘密鍵が漏洩します。SLH-DSA はこの運用リスクを設計で消したのが最大の売りで、鍵の選び方を状態ではなく擬似乱数に委ねます。

部品1:WOTS+ ――1回限りの内部署名

土台の部品が WOTS+(Winternitz One-Time Signature Plus)です。名前のとおり1つの鍵ペアで1回しか署名できない方式で、原理はハッシュ鎖です。

横にスクロール

WOTS+はメッセージ桁の位置までハッシュ鎖を公開し残りを進めて検証するについて、攻撃経路、信頼境界、防御・検知点、運用判断を示した解説図
WOTS+はメッセージ桁の位置までハッシュ鎖を公開し残りを進めて検証するの処理を、攻撃経路・信頼境界・防御・検知・運用判断とともに整理します。

秘密鍵は乱数の並び sk = (sk_1, ..., sk_len)。各要素にハッシュを w-1 回繰り返し適用した終端が公開鍵になります(w は Winternitz パラメータ、典型的には16)。

公開鍵要素:  pk_i = H^(w-1)(sk_i)
署名:        メッセージのi番目の桁 a_i に対し sig_i = H^(a_i)(sk_i)
検証:        H^(w-1-a_i)(sig_i) が pk_i に一致するか

署名者は桁 a_i の分だけハッシュを進めた中間値を出し、検証者は残り w-1-a_i 回進めて公開鍵に届くかを確かめます。ここに落とし穴があります。攻撃者が桁を1つ増やす方向にはハッシュを進めるだけで偽造できてしまう。これを防ぐのがチェックサムです。メッセージ桁の合計を補うチェックサム桁を付け、どこかの桁を増やせば必ず別の桁が減る(=ハッシュを逆向きに戻す必要が生じ、原像計算に阻まれる)ように設計します。「Plus」はマスク付きハッシュ鎖などの改良を指し、汎用的なハッシュ関数の仮定だけで安全性を証明できる形に整えたものです。

OTSは文字どおり一度きり

WOTS+ の秘密鍵で2つの異なるメッセージに署名すると、桁ごとに異なる位置までハッシュ鎖が公開され、攻撃者は両者を組み合わせて第3のメッセージの署名を合成できます。1鍵1署名は破ってはならない絶対の制約です。だからこそ多数のメッセージを扱うには、大量の WOTS+ 鍵を用意し「未使用の鍵を確実に1回だけ使う」仕掛けが要ります。それがハイパーツリーです。

部品2:ハイパーツリー ――多数の鍵を1本の公開鍵へ

膨大な数の WOTS+ 公開鍵を、たった1つのルートハッシュに束ねるのが Merkle 木です。葉に WOTS+ 公開鍵を並べ、ペアを ハッシュで上へ畳んでいくと、最上位に1本のルートが残ります。任意の葉が「この木に属する」ことは、兄弟ノードの列(認証パス)を示すだけで検証できます。これが1段(XMSS 相当の木)です。

問題は木の高さです。2^60 個の葉を1本の木に収めれば高さ60となり、署名のたびにすべての葉の WOTS+ 公開鍵を計算してルートを作り直す羽目になり非現実的です。そこで ハイパーツリー(木の木)を使います。

ハイパーツリーは複数の木を縦に積み、上の木の WOTS+ 鍵で下の木のルートに署名して連結する。総高さ h をd層に分割し、各木の高さを h/d に抑えることで、1署名あたり d 本ぶんの小さな木しか展開せずに済む。
葉に置くもの署名する対象役割
最上層の木WOTS+ 公開鍵1つ下の層の木のルート公開鍵(ルート)を確定
中間層の木WOTS+ 公開鍵さらに下の層の木のルート署名の連鎖を中継
最下層の木WOTS+ 公開鍵FORS 公開鍵メッセージ署名部へ接続

各層の木は、その葉の WOTS+ 鍵で1つ下の層の木のルートに署名します。総高さ hd 層に分ければ、1つの木の高さは h/d に縮み、署名時に構築するのは d 本ぶんの小さな木だけで済みます。SLH-DSA では例えば総高 h = 63d = 7 層に分割します(1層あたり高さ9)。こうして 2^63 という天文学的な鍵空間を、現実的な計算量で扱えるようにしています。

部品3:FORS ――メッセージを直接署名する少数回署名

ハイパーツリーの最下層が署名するのは、実はメッセージそのものではなく FORS(Forest Of Random Subsets)の公開鍵です。FORS は「少数回(few-time)署名」で、同じ鍵を数回なら使い回せる点が WOTS+ と決定的に違います。この性質がステートレス化の鍵になります。

FORS は k 本の小さな木のです。メッセージのハッシュを k 個のインデックスに切り分け、各木でそのインデックスが指す葉(の秘密値)を1つだけ開示し、認証パスと合わせて署名とします。

メッセージダイジェスト md を k 個のチャンクに分割
各チャンク t_j (0 <= t_j かつ t_j が木の葉数未満) について:
  木jの葉 t_j の秘密値を開示 + その認証パスを付す

なぜ「少数回」で許されるのか。WOTS+ と違い FORS は各木で1葉しか開かないため、1回の署名で漏れる情報が限定的です。同じ鍵で別メッセージに署名しても、開く葉が別のインデックスであれば新たな情報しか出ず、直ちには偽造につながりません。偽造には「攻撃者が狙うメッセージのインデックス集合が、過去に開示済みの葉だけで賄える」必要があり、その確率が無視できるほど小さくなるよう k と木の大きさを選びます。

ステートレスの正体:擬似乱数でインデックスを選ぶ

ここが SPHINCS+ の核心です。署名時、秘密鍵に含まれる秘密シード SK.prf とメッセージから擬似乱数を導出し、それで「ハイパーツリーのどの葉(=どの FORS 鍵)を使うか」を決めます。状態を記録して未使用鍵を選ぶ代わりに、毎回ランダムに選ぶ。同じ FORS 鍵がたまたま複数回当たっても、FORS が少数回署名なので破綻しない――だから状態管理が要らない。ステートフル方式が背負う「巻き戻しで鍵再利用」の運用リスクを、この確率的設計が根こそぎ消しています。

全体を貫く署名フロー

3つの部品を接続すると、1本の署名は次のように積み上がります。上から順にたどると、ルートまで一気通貫でハッシュがつながることが分かります。

1. R = PRF(SK.prf, opt_rand, M)         ランダム化値を導出
2. md ∥ idx = H_msg(R, PK, M)           ダイジェストと使用する葉インデックス
3. FORS_sig = FORS.sign(md, ...)        メッセージを FORS で署名
   → FORS 公開鍵 pk_FORS を復元
4. HT_sig  = HyperTree.sign(pk_FORS, idx) pk_FORS をハイパーツリーで署名
   → 各層の WOTS+ 署名と認証パスを連結
5. 署名 = (R, FORS_sig, HT_sig)

検証者は逆にたどります。R とメッセージから md とインデックスを再計算し、FORS 署名から FORS 公開鍵を復元、それを起点にハイパーツリーの各層の WOTS+ 署名と認証パスを順に登り、最終的に得られたルートが自分の持つ公開鍵(ハイパーツリー最上位のルート)と一致するかだけを確かめます。公開鍵はこのルートハッシュそのものであり、わずか数十バイトです。

FIPS 205 のパラメータとサイズの代償

FIPS 205 は SHA-256 系(SHA2)と SHAKE 系の2系統、そして安全性水準128/192/256ビットごとに s(small)と f(fast)の2変種を定義します。合計12のパラメータセットです。

公開鍵は全セットで数十バイトと極小だが、署名は数KB〜約50KBに達する。ML-DSA-65 の署名が約3.3KBであることと比べても桁が違う。sとfは、木を大きく少なくするか(s:署名小・署名遅)/小さく多くするか(f:署名大・署名速)のトレードオフ。
セット公開鍵署名サイズ署名速度検証速度
SLH-DSA-128s32 B約 7,856 B遅い速い
SLH-DSA-128f32 B約 17,088 B速いやや遅い
SLH-DSA-192s48 B約 16,224 B遅い速い
SLH-DSA-256s64 B約 29,792 B遅い速い
SLH-DSA-256f64 B約 49,856 B速いやや遅い

s と f のトレードオフは、ハイパーツリーと FORS の木を「大きく少なく」するか「小さく多く」するかの選択です。s は木を大きく取るため署名時のハッシュ計算が増えて遅くなる代わり、署名に含める認証パスが短くサイズが小さい。f は木を小さくして署名を速くする代わり、木の本数が増えて署名が肥大します。いずれにせよ公開鍵は数十バイトで一定です。

巨大な署名が現実のプロトコルを壊す

署名が最大約50KBという大きさは、既存プロトコルに実害を及ぼします。TLS のハンドシェイクは複数の証明書署名を運ぶため、SLH-DSA を証明書チェーン全体に使うと1接続で数百KBが飛び、往復遅延(RTT)とパケット断片化が悪化します。DNSSEC のように応答サイズが厳しく制限される場面ではそもそも収まりません。だから SLH-DSA は「あらゆる署名を置き換える」用途ではなく、ファームウェアやルート認証局の署名のように署名回数が少なく長期の壊れにくさが最優先の場所に選ぶのが定石です。

どこで使い、どう位置づけるか

SLH-DSA の最良の適所は、署名頻度が低く、検証は多数でも構わず、何より数十年単位の安全余裕が要るケースです。具体的にはコード署名やファームウェア更新の署名、ルート認証局の自己署名、ソフトウェア権利証明などです。これらは署名が数KB増えても運用に響かず、逆に「20年後に量子計算機が現れても偽造されない」保証の価値が高い領域です。

ML-DSAとの使い分けを一言で

標準的な TLS やトークン署名など高頻度・低遅延が要る場面では ML-DSA(FIPS 204)が第一候補です。SLH-DSA は、その ML-DSA を含む格子系に万一の破綻が起きても守り切りたい最終防衛線として、低頻度・長寿命の署名に配します。両者は排他ではなく、移行戦略では用途ごとに使い分ける(あるいは古典署名との併用でハイブリッド化する)のが実務の落とし所です。

まとめ

SLH-DSA(FIPS 205)は SPHINCS+ を基にしたステートレスなハッシュベース署名で、安全性がハッシュ関数の原像・第2原像・耐衝突性だけに閉じる点で、格子や数論から独立した最も保守的な量子耐性を持ちます。WOTS+ が1回限りの内部署名を担い、ハイパーツリーが膨大な WOTS+ 鍵を1本のルートに束ね、FORS の少数回署名がメッセージを直接扱いつつ、擬似乱数によるインデックス選択で状態管理を不要にしました。

代償は最大約50KBに達する署名サイズで、TLS や DNSSEC のような帯域制約の厳しい場面には不向きです。したがって署名スキーム一般の中での立ち位置は、高頻度用途を担う ML-DSA の保険――ファームウェアやルート認証局のように署名回数が少なく壊れにくさが最優先の場所で真価を発揮する専用装備、と理解するのが正確です。

セキュリティの記事ガイド

SLH-DSA(SPHINCS+)とFIPS 205を実務で読む

TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。

解決すること

ハッシュベース署名

比較で見る軸

難易度: advanced / カテゴリ: セキュリティ / タグ数: 6

導入後に効く点

WOTS+ が一回署名、FORS がメッセージ署名、ハイパーツリーが多数の WOTS+ 鍵を1公開鍵へ束ねる。鍵インデックスを乱数で選び、XMSS/LMS のような状態管理を不要にする。

先に潰すリスク

用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。

数字・仕様の読み方
難易度
advanced
カテゴリ
セキュリティ
タグ数
6

判断チェックリスト

  • 自社の用途が「ハッシュベース署名 / SPHINCS+」に近いか確認する。
  • 強みである「SLH-DSA(FIPS 205)は SPHINCS+ ベースのステートレスなハッシュ署名。安全性をハッシュの原像・第2原像・衝突耐性だけに置き、格子や数論と独立した量子耐性を持つ。」が本当に評価軸になるか確認する。
  • 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
  • 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
  • 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

ハッシュベース署名SPHINCS+SLH-DSAポスト量子暗号FIPS 205
参考: 公式情報