準同型多項式公開鍵(Homomorphic polynomial public key = HPPK)暗号は、量子耐性を持つ新しい暗号方式で、もともとは鍵カプセル化方式(KEM)として提案されたものが、その後デジタル署名に拡張されたもの↓
HPPK DS
HPPK DSでは、内部でバレット還元アルゴリズムを利用してデジタル署名スキームを構築しているので、まず前提となるアルゴリズムについて理解する↓
バレット還元アルゴリズム
このバレット還元アルゴリズムは、1986年にPaul Barretによって開発されたアルゴリズム。
z = a mod n
のような剰余演算において、任意の数値に対する除算は高コストなので、乗算と2の冪乗での除算(ビットシフト)に置き換えることで計算を高速化する。 *1なので、商
の部分が効率的に計算できればいい。
まず事前に *2として、
と
を計算する。
これらの事前計算値を使って商の近似値を計算する。q'は近似値でqと一致しない場合もあるので、
を計算し、zがnより大きい場合は、nより小さくなるまでz -= nを繰り返す(この場合、最大2回)。
については除算コストが発生するけど、これは実際にmod計算をするaとは無関係のパラメーターであるため、事前計算して固定値とすれば、mod計算時のコストにはならない(逆に毎回計算すると、このアルゴリズムの恩恵を受けられない)。残りの除算はビットシフトで計算できる。
このアルゴリズム自体は、剰余演算の高速化のためのものだけど、の値が分かれば
の計算時に
nについて知らなくても近似値を計算できるようになることに注目して、HPPK DSスキームでは剰余演算の法を秘匿した状態での計算を署名検証に組み入れている。詳しくは後述。
鍵生成
素体(pはセキュリティパラメーター)上のHPPKについて、まず最初に以下の秘密の値を生成する。
- 単変量多項式*3f(x)とh(x)を生成し(多項式の各係数は
内からランダムに選択)、
- 2つの大きな整数
を選択
攻撃者が公開情報からこれらを推測するのを困難にするため、各値はpのビット長の2倍以上となることが推奨されている - 2つの秘密の値
を選択
この2つはそれぞれはより小さい数で
と互いに素である(逆元が存在するようにする)必要がある。
HPPKではこれらのが秘密鍵になる。
次に秘密鍵から公開鍵を計算する手順が↓
- ランダムな多変量基底多項式*4
を生成し、
- 1をそれぞれf(x)とh(x)に乗算して積多項式P、Qを計算する:
なお多項式の性質上、が成立し、この等式が署名方式の正しさを支える根本的な要素。
- 多項式PとQの各係数を
を使って暗号化する(各係数 × R mod Sを計算する)
- 多項式Pについては、
を計算する。元の多項式の各係数を
とした場合*5、暗号化後の各係数は
- 多項式Qについては、
を計算する。元の多項式の各係数を
とした場合、暗号化後の各係数は
- 多項式Pについては、
内からランダムな値βを選択し、
をβでマスクした
を計算する。
- 3で暗号化した各係数
をβでマスクした
を計算する。
- バレット変換のアイディアを基に、バレットパラメーターR(公開パラメーター)を使って、
を計算する。
これらの結果、が公開鍵となる。
を公開することで、その値を使って
のような秘密の剰余演算の近似値を計算できるようになる。つまり、検証者は
の値を直接知らなくても検証式の計算が可能になる。
※ ステップ3の準同型な暗号化要素が、署名スキームの名前に準同型と付いている理由。
署名の生成
署名の生成プロセスは↓
- 署名対象のメッセージMのハッシュ値x = Hash(M)を計算する。
内からランダムな値αを選択し、
- xで多項式f(x)、h(x)を評価し、以下の証明要素を計算する*6
- 署名データは
※ αは多項式に対するブラインドファクターとして機能する。これがないと多数の署名が揃うと秘密鍵の漏洩に繋がってしまう。
署名の検証
- メッセージMのハッシュ値x = Hash(M)を計算する。
- ランダムなノイズ変数
を選択し*7、
- 署名データF, Hおよび公開鍵を使って多項式U、Vの各係数
を計算する。
- 3の係数を使って多項式UとVを構築し、1で計算したxの値と2の変数を使って多項式
と
を評価する。
- 4で評価した2つの多項式の結果が一致すれば署名検証は成功、一致しなければ失敗。
つまり、ここでは、秘密の多項式の等式を何重にもマスキングした状態で間接的に検証している。
検証者は秘密の値を知らないため、これらの等式はバレット変換による以下の変換形式での検証になる。
については、
については、
バレット変換の本来の目的は剰余計算なので近似値の補正が必要になるものの、上記の等式にはそれぞれ同じ近似値が適用されており、厳密な剰余計算がされていなくても署名の正当性は安全に確認できる。
※ もともと先行研究としてMPPK DSという署名スキームが提案されていたものの、その方式では秘密鍵と公開鍵の関係に線形性があり、それを悪用して署名の偽造ができてしまうという脆弱性があった。それを解消するためにHPPK DSではバレット変換で床関数を導入することで、秘密鍵と公開鍵が非線形になるように改良したらしい。
パラメーターとデータ長
素体pのサイズによるデータ長とセキュリティレベルは、論文の表1より↓
| セキュリティレベル | エントロピー | フィールドサイズlog(p) | 公開鍵 | 秘密鍵 | 署名 |
|---|---|---|---|---|---|
| NIST Level I | 144 bit | 64 bit | 196 byte | 104 byte | 144 byte |
| NIST Level III | 208 bit | 96 bit | 276 byte | 152 byte | 208 byte |
| NIST Level V | 272 bit | 128 bit | 356 byte | 200 byte | 272 byte |
既存の耐量子デジタル署名スキームと比べるとかなりデータサイズが小さくて良い。また署名の生成/検証速度も非常に高速。ネックはまだ研究段階という点。