準同型暗号化ライブラリOpenFHEのインストールから実行方法まで

# 0. はじめに

本記事では準同型暗号化ライブラリOpenFHEの

1. インストール方法
2. サンプルを用いた動作確認
3. OpenFHEライブラリを用いたコードの実行方法

について説明します。最終的に、OpenFHEを使ったオリジナルのコードを実行できるようになることを目的とします。

なお、以降の文章は**2022/09/11**時点の公式ドキュメント[Installation](https://openfhe-development.readthedocs.io/en/latest/sphinx_rsts/intro/installation/installation.html)、[CMAKE in OpenFHE](https://openfhe-development.readthedocs.io/en/latest/sphinx_rsts/intro/installation/cmake_in_openfhe.html)に基づいて書かれています。そのため、今後のバージョンアップによりインストール方法などが変更される可能性があります。その場合はこれらのドキュメントの参照をお願いします。

## 0.1 環境

著者が使用した環境はWindows10とUbuntu(WSL2)です。以降で説明するインストール方法などはLinuxOSでもmasOSでも共通ですが、macOSは実行できるかどうかの確認がとれていませんので、ご了承ください。

| ソフトウェア名 | バージョン |
|:-----------:|------------:|
| Windows 10 | 21H1 |
| Ubuntu(WSL2) | 20.04.4 LTS |

## 0.2 事前準備

OpenFHEをインストールする際に必要になるソフトウェアとそのバージョンは次の通りです。

| ソフトウェア名 | バージョン |
|:-----------:|------------:|
| g++ | 9.4.0 |
| cmake | 3.16.3 |
| make | 4.2.1 |
| Autoconf | 2.69 |

なお、公式ドキュメントには必要になるバージョンが記載されていないため、上記のバージョンは著者がインストールした際のものとなっています。

次に各種ソフトウェアのインストールを行います。

```bash
sudo apt install g++ -y
sudo apt install cmake -y
sudo apt install autoconf -y
```

# 1. インストール方法

<ol><li> まず初めにOpenFHEのリポジトリをクローンします。どこに作っても問題ないですが、説明の簡略のためホームディレクトリに作ります。

```bash
cd
git clone https://github.com/openfheorg/openfhe-development.git
```

<li> リポジトリに移動し、buildディレクトリを作成します。

```bash
cd openfhe-development
mkdir build
```

<li> buildディレクトリに移動し、cmakeコマンドを実行します。このとき、「-DCMAKE_INSTALL_PREFIX」オプションを、「~/openfhe_install」とします。これは後ほど実行する「make install」コマンドのインストール先となります。

```
cd build
cmake -DCMAKE_INSTALL_PREFIX=~/openfhe_install ..
```

<li> 次にmakeコマンドを実行します。

```
make
```

<li> 最後にmake installコマンドを実行します。このコマンドを実行することで、「~/openfhe_install」にOpenFHEに関するライブラリや依存ファイルが作成されます。

```
make install
```

</ol>

以上でインストールは完了です。次にサンプルを用いた動作確認について説明します。

# 2. サンプルを用いた動作確認

<ol><li> OpenFHEリポジトリのサンプルが置かれたディレクトリに移動します。

```
cd ~/openfhe-development/build/bin/examples/pke
```

<li> このディレクトリには用意されたサンプルの実行ファイルが置かれています。試しに「simple-integers」というファイルを実行します。

```
./simple-integers
```

<li> simple-integersを実行すると、3つの平文の準同型演算が行われます。問題なく実行することができれば、OpenFHEライブラリのインストールは成功です。また、これらの実行ファイルのソースコードについて、次のリンクを参照してください。

</ol>

https://github.com/pranavgangwar/OpenFHE/tree/main/src/pke/examples

以上で動作確認は完了です。次にOpenFHEライブラリを用いたコードの実行方法について説明します。

# 3. OpenFHEライブラリを用いたコードの実行方法

<ol><li> 初めに、ホームディレクトリにOpenFHE_codeディレクトリを作成し、移動します。

```bash
cd
mkdir OpenFHE_code
cd OpenFHE_code
```

<li> OpenFHEライブラリを使ったソースコードを作成します。main.cppを作成し、次のコードをコピペしてください。

```c++
#include <openfhe.h>
using namespace std;
using namespace lbcrypto;

int main(int argc, char *argv[]) {
    // パラメータの設定
	CCParams<CryptoContextBFVRNS> parameters;
    parameters.SetMultiplicativeDepth(2);
    parameters.SetPlaintextModulus(65537);

    // 使用する機能の設定
    CryptoContext<DCRTPoly> cryptoContext = GenCryptoContext(parameters);
    cryptoContext->Enable(PKE);
    cryptoContext->Enable(KEYSWITCH);
    cryptoContext->Enable(LEVELEDSHE);

    // 鍵の作成
    KeyPair<DCRTPoly> keyPair = cryptoContext->KeyGen();
    cryptoContext->EvalMultKeyGen(keyPair.secretKey); // 乗算によって暗号文の次元が増加した際の削減に使用する

    // 平文の作成
    std::vector<int64_t> v = {1, 2, 3, 4, 5};
    Plaintext plain_text = cryptoContext->MakePackedPlaintext(v);

    // 暗号化
    Ciphertext<DCRTPoly> cipher_text = cryptoContext->Encrypt(keyPair.publicKey, plain_text);

    // 演算(自乗)
    Ciphertext<DCRTPoly> square_cipher_text = cryptoContext->EvalMult(cipher_text, cipher_text);

    // 復号
    Plaintext square_plain_text;
    cryptoContext->Decrypt(keyPair.secretKey, square_cipher_text, &square_plain_text);
    
    cout << plain_text << endl;
    cout << square_plain_text << endl;
}
```

このプログラムではまず初めにn個分の平文「$0, 1, \cdots , 5$」を暗号化します。次にOpenFHEライブラリの準同型乗算を使い、暗号文に対して自乗します。最後に復号し、演算結果の「$0^2, 1^2, \cdots, 5^2$」を出力します。

<li> main.cppの実行ファイルを作成するため、CMakeLists.txtを作成します。これは、OpenFHEリポジトリにある「CMakeLists.User.txt」というファイルを利用します。

```
cp ~/openfhe-development/CMakeLists.User.txt ./
mv CMakeLists.User.txt CMakeLists.txt
```

CMakeLists.txtの最後の行を次のように書き換えます。

```text:CMakeLists.txt(編集前)
:
### add_executable( test demo-simple-example.cpp )
```

```text:CMakeLists.txt(編集後)
:
### add_executable( main main.cpp )
```

<li> cmakeコマンドでビルドし、makeコマンドを実行します。

```
cmake -S . -B build
cd build
make
```

<li> 最後に、作成されたmainファイルを実行します。

```
./main
```

<li> 次の出力結果が表示されればOKです。0の2乗から始まり、5の2乗の25が計算できていることが分かります。

```
( 1 2 3 4 5 ... )
( 1 4 9 16 25 ... )
```

</ol>

# 4. おわりに

ここまでくれば、あとはmain.cppをさらにいじったりして、いろいろな処理を実行することができます。

OpenFHEライブラリで提供されている関数等については、リポジトリにあるexampleのソースコードに書かれたコメントを参考にすると分かりやすいです(参照：[example](https://github.com/pranavgangwar/OpenFHE/tree/main/src/pke/examples))。本記事の`main.cpp`は、サンプルの「[simple-integers.cpp](https://github.com/openfheorg/openfhe-development/blob/main/src/pke/examples/simple-integers.cpp)」をもとに記述しました。

最後になりますが、本記事の情報が役に立てれば幸いです。なんらかの理由でうまくいかなかった場合は、コメントにて教えていただけるとありがたいです。