(完全)準同型暗号の最前線1（入門編）

# 目次

1. (完全)準同型暗号の最前線1（入門編）←イマココ
2. [(完全)準同型暗号の最前線２（原理編）: TFHEの原理 #1 TLWE](https://qiita.com/nindanaoto/items/82b63cb5453380c029b1)
3. [(完全)準同型暗号の最前線２（原理編）: TFHEの原理 #2 TRLWE & SampleExtarctIndex](https://qiita.com/nindanaoto/items/6796dcf21a37362ce557)
4. [(完全)準同型暗号の最前線２（原理編）: TFHEの原理 #3 TRGSW & CMUX](https://qiita.com/nindanaoto/items/5d33dcbabddfb3f6880e)
5. [(完全)準同型暗号の最前線２（原理編）: TFHEの原理 #4 Blind Rotate](https://qiita.com/nindanaoto/items/c1941561d5d3524bf02a)
6. [(完全)準同型暗号の最前線２（原理編）: TFHEの原理 #5 Identity Key Switching ](https://qiita.com/nindanaoto/items/dc82a31aee0ba2532d59)

#前置き
これは[準同型暗号の最前線1（入門編)](https://qiita.com/herumi/items/d8645efe2cc5be2e7ee3)のUpdate版(補足という方が正確な気がするが)を書いておくのは公益性が高そうだ、ということで書いた記事。
入門編ということで最初に言っておくが、[英語版のwikipedia](https://en.wikipedia.org/wiki/Homomorphic_encryption)はよく書かれている。
また、私は格子暗号をベースとした完全準同型暗号を主に扱っているので、楕円曲線をベースとしたものはほとんど扱わない。
気が向いたら書き足していく感じで行こうと考えている。

#準同型暗号(Homomorphic Encryption)とは
準同型暗号とは、暗号文を復号することなしに演算を行うことを許すような暗号のことである。
RSA暗号といえば、公開鍵暗号として著名であるが、完全準同型暗号が最初に提案されたのはRSAが提案された翌年、1978年のことである。(ちなみにRSAはその名前を冠した学会があったりする) 
RSAは公開鍵暗号であると同時に、乗算をサポートするPHEでもあることから着想を得たのだと思われる。

# 他の秘密計算手法との違い
準同型暗号以外の代表的な秘密計算手法として、Garbled Circuit(GC)、Secret Sharing(秘密分散)とTrusted Execution Environment(TEE)が挙げられるだろう。
TEEはそもそもチップメーカなどを信頼しなければならないという点で暗号学だけに依拠する他の手法とは異なる。
GCは秘密鍵を持つパーティが一番多くの演算しなければならないので計算処理のオフロードができないという点で準同型暗号とは異なる。
秘密分散は計算の過程でパーティ同士が頻繁に通信する必要があり、その点で準同型暗号と異なる。

# 準同型暗号が解決しないこと

準同型暗号の代表的な問題点は、malleability と呼ばれるものである。
これは、「準同型暗号によって他者に暗号文を操作させることを許す場合、その操作が本当に暗号を生成したパーティが許す範囲の演算であるかを保証することが出来ない」というものである。(これは厳密な定義を参照して訳したわけではないのでラフな定義であることは申し添えておく。厳密な良い言い回しがあったら教えていただきたい。)
これはTEEでも同様の問題があり、GCはこの問題がない。(これはGCの特筆すべき点である)
秘密分散に関しては私は把握していないので詳しい方が居たらお教えいただきたい。(なにかの拍子に調べたら追記するだろうけれど)
これを解決するにはVerifiable Computationなどの他の概念と統合するか、[Keyedと呼ばれるタイプのHE](https://eprint.iacr.org/2021/722)を使うことなどを検討する必要がある。

#格子暗号とは
耐量子コンピュータ暗号の有力な候補の一つとされている暗号形式である。代数ではなくベクトルを基本的な概念とする暗号であるのだが、細かい話は理論編においておく。

#準同型暗号の分類
準同型暗号には、その性質によって4つの種類がある。楕円曲線など代数的構造をベースとしたものはPHEかSHEに入る。

## PHE (Partial Homomorphic Encryption;部分準同型暗号)

GHE(Group Homomorphic Encryption)と呼ばれていたこともあった。剰余環上の加算か乗算の片方ができるという意味であることが多い。著名なのはRSA暗号、ElGamal暗号、[Paillier暗号](https://ja.wikipedia.org/wiki/Paillier%E6%9A%97%E5%8F%B7)など代数ベースのものである。格子暗号はそれ単体でも一般的に加法をサポートするPHEであるが、PHEとして使われることはまずない。
どういう原理でRSA暗号がPHEになるかは[英語版のwikipedia](https://en.wikipedia.org/wiki/Homomorphic_encryption)に書いてあるので省略する。ElGamal暗号の場合については[クラウドを支えるこれからの暗号技術](https://herumi.github.io/ango/)に日本語での説明がある。もしくは、[準同型暗号の最前線2（原理編）](https://qiita.com/herumi/items/7d0e4a001ed64364642a)を見てもよいだろう。

## SHE (Somewhat Homomorphic Encryption)

演算回数に制限があるが、加算と乗算の両方ができるような暗号である。[準同型暗号の最前線2（原理編）](https://qiita.com/herumi/items/7d0e4a001ed64364642a)で説明されているのもSHEである。一般に乗算の方の制限のほうが厳しい。乗算できる回数がn回の場合、n-level SHEというらしい。ちなみに、n-level SHEを2n-level SHEにする手法として[Catalano-Fiore変換](https://dl.acm.org/doi/10.1145/2810103.2813624)がある。

## LHE (Leveled Homomorphic Encryption)

演算回数に制限があるが、その制限が定数値ではなく変更可能なパラメータになっているような暗号。比較的新しい分類なためか、FHEといいつつLHEであることがたまにある。[最初の論文](https://eprint.iacr.org/2011/277.pdf)ではLHEという言葉は導入されていないのも影響しているか。残念ながら初出は知らない。
LHE以上は格子暗号ベースのものしか私は知らない。また、少なくともこの記事における分類の第二世代以降のFHEはすべてLHEでもある。
演算回数に制限があるとはいってもSHEよりは評価可能な関数の種類が多く、またFHEよりはずっと高速であるので、最近(2020年頃)の準同型暗号を実用的な処理をやろうという試みはLHEで構成されていることが多い印象である。
## FHE (Fully Homomorphic Encryption;完全準同型暗号)
FHEは加算も乗算も好きなだけ行うことができる準同型暗号である。現時点で存在するものはすべて2009年に[Gentryさんが博士論文で提案した](https://crypto.stanford.edu/craig/craig-thesis.pdf)Bootstrappingという概念をその構成の根幹としている。Bootstrappingとは、準同型暗号上で復号と等価な処理を行うことで演算可能回数をリセットする演算である。
英語版Wikipediaにならって、ここでもFHEを世代わけして紹介する。

### 第一世代

Gentryさんの博士論文で提案された最初の構成はここに含まれる。実際に実装すると必要なストレージが1TBとかを超えると言われており、非現実的ではあったが、Bootstrappingを提案したという点でまさしくseminal workである。
比較的現実的に使える手法としてはSmart-Vercauteren(SV)がある。SVの実装にはたとえば[libScarab](https://github.com/hcrypt-project/libScarab)がある。

### 第二世代

代表的なのは[Brakerski-Gentry-Vaikuntanathan(BGV)](https://eprint.iacr.org/2011/277.pdf)と[Brakerski/Fan-Vercauteren(BFV)](https://eprint.iacr.org/2012/144)である。この世代の特徴はLHEとしての機能が導入されたことと、[SV packing](https://eprint.iacr.org/2011/133.pdf)などと呼ばれるSIMD的な演算が可能であることである。実装としては[HElib](https://github.com/homenc/HElib)や[Micerosoft SEAL](https://www.microsoft.com/en-us/research/project/microsoft-seal/)がある。
英語版wikipediaだと[YASHE](https://eprint.iacr.org/2013/075)も挙げられているが、[この攻撃](https://eprint.iacr.org/2016/127)のせいで実用的でなくなったため最近みなくなった模様。

### 第三世代

代表的なのは[Gentry-Sahai-Waters(GSW)](https://eprint.iacr.org/2013/340)、[FHEW](https://eprint.iacr.org/2014/816)、[TFHE](https://eprint.iacr.org/2018/421)である。この世代の特徴はGSWで導入されたDecompositionという操作で、これによって乗算によって生じるノイズ(格子暗号ではノイズが大きな役割を果たすのだがそれは理論編で)をべき乗から対数に落とすことができること、第二世代までの整数の演算ではなく論理演算を準同型暗号上で評価する基本的な演算とすること、Bootstrappingが他の世代に比して圧倒的に速いことである。(TFHEで10ms程度、他の世代は現状(2020年頃)分単位はかかると思って良い)GSWの実装はぱっとは思いつかないが、FHEWは[公式実装](https://github.com/lducas/FHEW)を、TFHEは[私の実装](https://github.com/virtualsecureplatform/TFHEpp)([公式実装](https://github.com/tfhe/tfhe)より速いし機能が多い)を挙げておこう。

### 第四世代

第四世代に相当するのは現状Cheon-Kim-Kim-Song(CKKS)のみである。第四世代と言っているが、第三世代とはほぼ関連がなく、第二世代の発展形なので第二世代に分類しても良いといえばよい。この世代の特徴は固定小数点数(より厳密には実数ではなく複素数)を評価することに向いていることである。この特徴から、準同型暗号上で深層学習をするのに使いやすいということで今一番流行っている感じがある。FHEとしては(速度ももちろん問題ではあるのだが)Bootstrappingをする際に保持できる精度が少ないことが特有の問題になっていて2020年も[それを改善したと主張する論文](https://eprint.iacr.org/2020/1118)が出ている。実装としては、[Micerosoft SEAL](https://www.microsoft.com/en-us/research/project/microsoft-seal/)、[Palisade](https://palisade-crypto.org/)、[HEAAN](https://github.com/snucrypto/HEAAN)と[Lattigo](https://github.com/ldsec/lattigo)あたりが挙げられるだろう。

# 応用例

準同型暗号の応用先を[準同型暗号の最前線1（入門編)](https://qiita.com/herumi/items/d8645efe2cc5be2e7ee3)に追加して挙げておこう。

## 計算処理のオフロード

ようはクラウドコンピューティングを準同型暗号上でやろうという話である。なんでこれを最初に持ってくるかというとこれで[論文](https://arxiv.org/abs/2010.09410)を書いたからである。
2020年現在のクラウドコンピューティングは[GCPがAMDのTEEに基づいた保護](https://cloud.google.com/blog/products/identity-security/introducing-google-cloud-confidential-computing-with-confidential-vms)を、[AzureがIntel SGXが使えるインタンス](https://azure.microsoft.com/en-us/updates/intel-sgx-based-confidential-computing-vms-now-available-on-azure-dedicated-hosts/)を提供している程度で、基本的にはクラウドベンダにはクライアントがどんな処理をしているかは筒抜けである。(TEEにしたって悪意ある人間がハードウェアに常時アクセス可能な状態では保護が十分であるかは疑わしい)準同型暗号を用いれば、クラウドベンダに何をやっているかを教えずに計算のオフロードをすることが理論的に可能である。
[未踏の成果発表会のビデオ](https://www.youtube.com/watch?v=apCbAPt7r3I&feature=youtu.be)が一番わかり易いだろうか。

## Federated Learning

端的に言えば、深層学習を準同型暗号上でしたいよねという話である。(別に他の機械学習手法でもいいのだが、流行りもあって大体深層学習が念頭に置かれる)わかりやすいのは心臓の画像みたいな医療データを扱う場合の深層学習である。推論だけをサービスとして提供するのはまだなんとかなるのだが、学習の方をやるのは暗号学的課題(セキュリティ敵のほうがいいのだろうか)が山積みなので、今現在も盛んに研究が行われているところである。他の秘密計算手法とミックスするような形の手法も存在するし、必ずしも準同型暗号でなければいけないアプリではないことは注意が必要である。秘密計算全体としては電子投票とこれがキラーアプリだと個人的には思っている。
この[IACRの発表動画](https://www.youtube.com/watch?v=culuNbMPP0k&feature=youtu.be&t=3397)が知っている中ではわかりやすいか。
機械学習でHEを使うためのフレームワークとしては[HE Transformer for nGraph](https://github.com/IntelAI/he-transformer)、[TF Encrypted](https://github.com/tf-encrypted/tf-encrypted)や[PySyft](https://github.com/OpenMined/PySyft)あたりを挙げておくが、私個人は機械学習に詳しくないため使ったことも比較したこともないので紹介に留めさせていただきたい。

# 次回

Update版ということで同じ感じの構成にしようと思うのだが原理編でしゃべるなら[講義資料](https://nindanaoto.github.io/)がを下敷きにTFHEについて触れるか、[OpenMindの解説記事](https://blog.openmined.org/ckks-explained-part-1-simple-encoding-and-decoding/)をベースにCKKSに触れるかなのだが、どっちも重そうで気分次第という感じである。(2021年5月追記 目次見ればわかるとおり結局TFHEをやっている。BFVもやりたい気持ちはある)TFHEの解説は英語版も書きたいし。理論編は格子暗号とノイズの話をすればいいんだとは思うが。まぁ義務ではなく思いつきなので気が向けば書くという感じがある。