2017-10-21 10 views
2

幾分準同型の暗号化スキームでは、任意の数の加算とそれに続く1回の乗算を実行でき、そのあとでノイズが大きくなりすぎるという印象を受けました。しかし、私が次のことを試してみると、うまくいくように思えます。helibでブートストラップが必要なのはいつですか?

publicKey.Encrypt(ctx1, to_ZZX(2)); 
publicKey.Encrypt(ctx2, to_ZZX(3)); 
publicKey.Encrypt(ctx3, to_ZZX(10)); 

Ctxt ctRes = ctx1; 
ctRes += ctx2; 
ctRes *= ctx3; 
ctRes *= ctx3; 

ZZX ptRes; 
secretKey.Decrypt(ptRes, ctRes); 
std::cout << "(2 + 3) * 10 * 10= " << ptRes[0] << std::endl; 

もう1回乗算を行うと間違った結果になります。

ブートストラップが予測可能になるまでに必要な操作の数や種類はありますか?それは何に依存していますか?基礎となる値または初期化パラメータのいずれか?

+1

の下部にある指示に従って

あなたがブートストラップする必要がある場合は、その同じSRCファイルにparams.cppに見て、実行することにより、ブートストラップのための様々なパラメータをテストすることができます「params_xを...」私は今答える時間がありませんが、Lという名前の暗黙のパラメータがあります。これは "レベル"を表し、何回の乗算を順番に実行できるかを示しています(あなたの例ではL = 2と思われます)。自分のHelibのコードの例を見てください... –

答えて

3

特定のインスタンスで実行できる計算量は、システムの初期化に使用されるパラメータに大きく依存します。一般に、乗算(または乗算を伴う演算)は最もコストがかかる。

モジュラスチェーンのレベル数を示す「L」パラメータは、ブートストラップが必要となるまでに実行できる計算(および乗算)の最も重要な要素です。それをより大きな数に設定してみてください。

HElibのsrcフォルダ(ここでは、https://github.com/shaih/HElib)のTest_General.cppを読むことを強くお勧めします。そのフォルダに "make"を実行してTest_General_xという実行ファイルを生成し、 "Test_General_x L = 10 R = 5"で実行してLを10に設定し、5ラウンドの計算を実行することができます(ソースコード内で変更可能) 。さまざまなパラメータでLを15,20、...、60に変更したり、他のパラメータを変更したり、ランタイム、実行できる計算の数、および復号化エラーにどのように影響するかを確認してください。 params.cpp

関連する問題