Upgrade to Pro — share decks privately, control downloads, hide ads and more …

W-OTS+

 W-OTS+

GBECの解説動画のスライドです。
https://goblockchain.network/2026/03/wots-plus/

Avatar for shigeyuki azuchi

shigeyuki azuchi

March 03, 2026
Tweet

More Decks by shigeyuki azuchi

Other Decks in Technology

Transcript

  1. 1 Winternitz OTS+
 量子耐性のあるハッシュベースのデジタル署名スキーム ランポート署名(https://goblockchain.network/2024/07/lamport-signature/)vs W-OTS • ビットのグループ化: ランポート署名がbit単位で処理するのに対し、パラメーターwを使って複数bitをまとめて処理 •

    ハッシュチェーンの利用: 各グループに対してハッシュを w−1 回繰り返す連鎖関数を提供し、 署名ではチェーンの途中の値を公開する • 署名サイズの削減: w=16 の場合、256bitメッセージの署名に必要な要素数は約67個程度まで減少 (ランポート署名の場合、256個) W-OTS+ではさらに • 連鎖関数でXORマスキングを適用して安全性仮定を改善 SPHINCS+の構成要素
  2. 2 公開パラメーター
 • n:メッセージ、秘密鍵、公開鍵、署名の各要素のbyte長 • w:Winternizパラメーターで、4 or 16を選択。 大きい方がサイズは小さくなるけど署名コストは上がる •

    r:w-1個のランダム化要素(r 1 , …, r w-1 ) • len:秘密鍵、公開鍵、署名内のn byte文字列の数 ◦ len1 = ceil(8n / lg(w)) ◦ len2 = floor(lg(len1 * (w - 1)) / lg(w)) + 1 ◦ len = len1 + len2 n, wを使って計算 WOTSP-SHA2_256 n 32 w 16 len 67 len1 64 len2 3
  3. 3 鍵生成
 • 秘密鍵の生成 1つn byteのランダムなlen個の値を選択し秘密鍵とする ◦ n byteの1つのシードから疑似乱数生成関数( PRF)を使って導出するのでも可

    ◦ WOTSP-SHA2_256の場合、32 byte × 67個 = 2,144 byte • 公開鍵の計算 ◦ len個の各秘密鍵要素を起点に w - 1回ハッシュ計算を行う(ハッシュチェーン) ハッシュする前にランダム化要素 r i で要素をマスク(XOR)する ◦ len個のハッシュの結果を連結したものが公開鍵(秘密鍵と同じサイズ) k 1
 k 2
 k len
 ︙ H 1,1
 H 1,2
 H 1,w-1
 ︙ H 2,1
 H 2,2
 H 2,w-1
 ︙ H len,1
 H len,2
 H len,w-1 
 ︙ k 1
 k 2
 k len
 ︙
  4. 4 署名の生成
 1. 署名対象のメッセージmのハッシュ値H(m)を計算し、 2. H(m)を基数wの数値列に変換する(base-w表現) a. w = 16の場合、H(m)を4

    bit単位に分割し、それぞれ数値に変換する 3. チェックサム(後述)を計算し 4. チェックサムのbase-w表現を計算し、2のリストに追加する(len個の要素) 5. 数値列の各数値分、秘密鍵の要素をハッシュしたものが署名データ 例:数値列が{3, 2, …, 14}だった場合、署名値は k 1
 k 2
 k len
 ︙ H 1,1
 H 1,3
 H 1,w-1
 ︙ H 2,1
 H 2,2
 H 2,w-1
 ︙ H len,1
 H len,w-1 
 ︙ H len,14
 ︙ ︙ len1個の要素 len2個の要素
  5. 5 署名の検証
 1. 署名対象のメッセージmのハッシュ値H(m)を計算し、 2. H(m)を基数wの数値列に変換し(base-w表現) 3. チェックサムを計算し 4. チェックサムのbase-w表現を計算し、2のリストに追加する

    5. 数値列の各数値m i に対し、w - 1との差分w - 1 - m i を計算し、 6. 署名データの各要素にその差分値分ハッシュ関数を適用し、 7. 結果が公開鍵と一致するか検証する H 1,3
 H’ 1,w-1
 H 2,2
 H’ 2,w-1
 ︙ H’ len,w-1 
 ︙ H len,14
 ︙ ︙ H 1,w-1
 H 2,w-1
 H len,w-1 
 ︙ 差分値分ハッシュ関数を実行
  6. 6 チェックサムの計算方法と役割
 チェックサムは、メッセージのハッシュ値の base-w表現{m 1 , … m len1 }の各値と

    w-1の差分を合算することで計算される checksum = Σ(w - 1 - m i ) これはメッセージ全体で消費されなかった『ハッシュの余力』の総量を表す数値 • W-OTS+では署名から公開鍵への変換はハッシュ計算を重ねるだけなので誰でもできる ◦ m i を増やす方向の改ざんは、ハッシュ計算すれば良いだけなので可能 ◦ m i を減らす方向の改ざんは、秘密鍵の知識がないと不可能 • m i を増やす形で改ざんすると、チェックサムの値は小さくなり、 チェックサムのm i を減らす必要があるため、偽造不可能になる
  7. 7 マスクの役割
 ハッシュチェーンを計算する際に XORする値としてランダム値 r i を使用する H 1,2 =

    H(H 1,1 ⊕ r 2 ) • マスク値がない場合 ◦ ハッシュチェーン内で同じハッシュ関数を繰り返し適用することになり、 異なる入力で同じ中間値(衝突)が発生すると問題になる ◦ つまり、ハッシュ関数の 衝突耐性 が安全性の仮定になる • マスク値がある場合 ◦ ハッシュの各ステップで異なる関数を適用しているのと等価になり、 ◦ 衝突耐性とうい強い仮定より弱い 第二原像耐性 が安全性の仮定になる