ハッシュベース暗号
概要
ハッシュベース暗号 (hash-based cryptography) は素因数分解や離散対数のような数学的な問題の困難性を利用するのではなく、暗号論的ハッシュ関数によって確立されるセキュリティに基づいている。量子計算機を使用して暗号論的ハッシュ関数の衝突と見つけることが困難であると同様に、ハッシュベースの暗号も量子計算耐性を持つと考えられている。一般に電子署名スキームとして使用されているハッシュベース暗号には XMSS (extended Merkle signature scheme), LMS (Leighton-Micali Signature), BPQS (blockchained post-quantum signature), SPHINCS, SPHINCS+ などがある。
Table of Contents
Winternitz ワンタイム署名
ハッシュベース暗号の最も単純な例として 1979 年に Winternitz が開発した Winternitz ワンタイム署名 (WOTS; Winternitz one-time signature) を挙げる。ここで "one-time" とは 1 つの秘密鍵で 1 つのメッセージにのみ署名できることを意味している (2 つ以上の署名から別の署名を偽造できるため)。ただし WOTS を後述する MSS などと組み合わせることで複数のメッセージに署名することができる。
WOTS は IOTA で使用されている。
- 鍵生成
- まず秘密鍵
を構成する 2 つのランダムな値 を選択する。公開鍵 の構成要素はこの秘密鍵に対して を 回繰り返して適用した値である。 - 署名の生成
- あるメッセージ
に対して、秘密鍵 の 2 値をそれぞれ 回と 回繰り返してハッシュ関数 に適用した値を署名 とする。 - 署名の検証
- 検証者は与えられたメッセージ
と署名 の構成要素 に対してハッシュ関数 をそれぞれ 回と 回適用し、それが公開鍵 の構成要素と等しければメッセージ及び署名が有効であることを確かめることができる。
ワンタイム特性
ハッシュ関数
単一の署名であれば
例としてパラメータ
8-bit 程度の大きさでは、たかだか 256 回の試行で となるような が見つかるのではないか? これを最大でも 256 回試行すれば が求まり、さらに 32 回繰り返せば 256-bit 全ての秘密鍵 が特定できるのではないか?
パフォーマンス問題
WOTS は 8-bit のように非常に短い鍵や署名を生成するケースでもハッシュ値の計算を少なくとも 256×2 回計算する必要がある。このスキームは非常に短いメッセージや署名に対しては機能するが、256-bit のような比較的長いメッセージに対して適用することは現実的ではない。回避策は、このような長いメッセージをより短いメッセージに分割することである。
例えば 256-bit のメッセージに署名を行うとき、8-bit 単位の
マークル署名スキーム
マークル署名スキーム (MSS; Merkle signature scheme) は WOTS をマークルツリーと組み合わせて
- 鍵生成
-
- 対象とするワンタイム署名スキームに基づいて
個の OTS 鍵ペア を作成する。 - すべての OTS 公開鍵
に対してハッシュ値 を計算してマークルツリーを作成する。 - すべての OTS 鍵ペア
を MSS における秘密鍵 、マークルルートを MSS における公開鍵 とする。
- 対象とするワンタイム署名スキームに基づいて
- 署名生成
-
- 署名者はまだ署名に使用していない OTS 鍵ペア
を選択する。 - メッセージ
に対してワンタイム署名スキームを適用して OTS 署名 を作成する。 - また
からマークルルートまでの認証パスとなる 個のノードのハッシュ値 を取得する - OTS 署名、OTS 公開鍵、認証パスのタプル
を MSS における署名 とする。
- 署名者はまだ署名に使用していない OTS 鍵ペア
- 署名検証
- 検証者は公開鍵 (マークルルート)
、メッセージ 、署名 の情報を持っている。以下の 2 つの検証が成功すれば署名 はメッセージ に対して有効である。 -
を算出し認証パス とのハッシュ値を計算して と等しいこと、つまり が正しいことを検証する。 - ワンタイム署名スキームに従って OTS 署名
が正しいことを OTS 公開鍵 を使用して検証する。
-
MSS はワンタイム署名用の