はじめに
みなさんこんにちは。
VIPPOOL でエンジニアをやっています、星月です。
前回は、駆け足で TFHE の全体像を見ました。
今回からは、bootstrapping の手順を1つずつきちんと見ていこうと思います。
bootstrapping key の組み立て
TLWE 暗号文に使う秘密鍵 ( 次とします)とは別に、
bootstrapping に使うために を暗号化するための鍵、
を二進数で選びます。このベクトルの次数は、あとで出てくる
テストベクタ多項式 の次数とそろえる必要があります。
そして、 の各要素ごとに、TRGSW の暗号文を作ります。
まず、Gadget Decomposition から元に戻す作用素を としました。
で復号すると となる TRLWE 暗号文を 個だけ作成します。
そうして TRGSW 暗号文の構成通り、
とします。この TRGSW 暗号文を 個用意したセットを bootstrapping key と呼びます。
に必要な道具、
先ほど作った TRGSW 暗号文 と TRLWE 暗号文 の外積を、
と定義します。
Gadget Decomposition は、 を最小化する だったので、
と誤差 を用いて、
と書けます。
すると、
となり、左半分は内積を計算し、右半分は先ほどの式を代入すると、
となり、3つの暗号文、
の和を計算したことと同じになります。
TRLWE 暗号も加法準同型の性質を持つため、暗号文同士の和を取ると、
平文同士の和を取ったことになります。
このうち、 は を何倍かして足したものなので、
平文 の期待値は 0 になります。
また を復号した は、
平文の絶対値の大きさをシステムパラメータで制約できるため、
この後の演算も含めて十分に小さくなるように設定します。
そうすると、 となりますが、
が 0 であっても 1 であっても、計算結果は3つの暗号文の和になっているため、
単純な比較では がどちらなのか判別がつかないところが重要なポイントです。
さて、ここまでできればあとは簡単な話で、2つの平文 に対応する
TRLWE 暗号文 があるとして、 と代入して、
最後に を加算すれば、 の完成です。
何をしているかというと、 が 0 なら 、1 なら の暗号文を、
復号することなく選択します。C 言語風に書けば です。
もしくは の暗号文を計算はできるけれども、どちらを選択したのかわからない。
それが 関数です。 のコアとなる重要なパーツです。
を計算する
前回説明した通り、平文 を秘密鍵 で暗号化された TLWE 暗号文 があるとします。
をかけ続けると位数 の有限巡回群をなす、 次の多項式、
に を掛けた多項式をテストベクタ とします。
なお、 とします。
として、 の各要素と を 倍してから四捨五入します。
そうして作った暗号文 を復号すると、
となります。
この時の誤差も後できちんと考慮する必要がありますが、
が大きくなるほど誤差は小さくなります。
テストベクタ を平文とする自明な TRLWE 暗号文 を用意して、
とします。
以降、 を用いて、順番に を計算します。
すると、 が 0 の時はそのまま、つまり が、1 の時は が順番に乗算されていくので、
と繰り返すと、
となり、 の肩に乗っているのは、復号関数 と等しいので
となります。
要するに、 は、 に を 回乗算した多項式の暗号文となります。
この時、平文の多項式の定数項だけ見ると、
が 以上、 未満の場合、つまり が の場合、定数項は となり、
それ以外、つまり が の場合、定数項が となるのは
前回説明した通りです。