◦ 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 ︙
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. 数値列の各数値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 ︙ 差分値分ハッシュ関数を実行
w-1の差分を合算することで計算される checksum = Σ(w - 1 - m i ) これはメッセージ全体で消費されなかった『ハッシュの余力』の総量を表す数値 • W-OTS+では署名から公開鍵への変換はハッシュ計算を重ねるだけなので誰でもできる ◦ m i を増やす方向の改ざんは、ハッシュ計算すれば良いだけなので可能 ◦ m i を減らす方向の改ざんは、秘密鍵の知識がないと不可能 • m i を増やす形で改ざんすると、チェックサムの値は小さくなり、 チェックサムのm i を減らす必要があるため、偽造不可能になる