データ分析したいけど、プライバシーが・・・そんな経験ありませんか？

# はじめに
この記事は[NTTドコモ R&D Advent Calendar 2021](https://qiita.com/advent-calendar/2021/nttdocomo)の22日目の記事です。

本日は、プライバシーを保護しつつ、別々の組織が持つデータを統合的に分析することを可能にする技術をご紹介します！

これを聞いて、**なんだそれ？と思った方**が今回の対象読者です！
暗号技術や匿名化技術、機械学習など様々なアプローチがある中で、それぞれのソリューションを初心者向けに説明します。

実社会でも、別々の組織が持つデータを統合的に分析したい！という場面は多くあると考えています。
例えば、実店舗の小売店とeコマース企業間のデータ連携と統合的な分析による、より深い顧客理解の実現などです。
特に、異業種同士のデータを結合して分析することで、今までは一つの組織のみでは実現できなかった分析できるようになります！

:::note
本記事では、技術面に関してわかりやすく説明することを目的としています。より詳細な説明や技術の社会実装に向けた法的整理については日本総研から発行されている<a href="https://www.jri.co.jp/page.jsp?id=101511">レポート</a>が非常に詳しいです。本記事を読んで興味を惹かれた方は是非ご参照ください。
:::

# 本記事で伝えたいこと

- プライバシーを保護しつつ、別々の組織が持つデータを統合的に分析することを可能にする技術がある！
- 暗号等の情報セキュリティ技術から、機械学習、ハードウェアなどまでさまざまなアプローチで実現されている！

# プライバシーを保護しつつ、別々の組織が持つデータを統合的に分析するとは？
![fig_ppdm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/877713/41406fd2-3afd-6f28-3cc0-482ae5fd5a38.png)

上図は**別々の組織が持つデータを統合的に分析すること**のイメージ図です。
異なるA社とB社が互いのデータをブラックボックスで描いた**処理**をすると、A社とB社のデータが**処理**された結果が返ってくるという流れです。

処理結果のイメージは、例えばA社とB社のデータを共通IDで結合したテーブルの平均や分散、クロス集計結果といった統計量であったり、結合したテーブルから作成された特徴量を用いて学習した決定木やkNN、DNNの学習済みモデルであったり、データ分析の目的に合致する**最終的に**必要な結果です。
**最終的に**というのが肝になっていて、A社のデータをB社に提供したり、B社のデータをA社に提供したりといったことが必要ないように**処理**をします。

なぜなら、現実的には**データ**をそのまま他社に提供することは難しいケースが多いためです。
例えば、以下のようなことがあります。

- **データ**が非常に機微な情報のため、プライバシーの観点から適切ではない場合
- **データ**がA社の重要な経営資源であるため、情報管理上望ましくない場合
- **データ**が法令のため、（生データでは）渡せない場合

根源的には、データは一度渡してしまうと複製や再頒布を防止するといった制御がしづらいことに起因しています。そのため、生データを提供するということは非常に大きなリスクを伴い、上記以外のケースでも避けられるならば避けたい場合が多いと想定されます。

:::note warn
（2021年12月時点）日本の個人情報保護法等は必ずしも最新のプライバシー保護技術に対応した法整備がなされておらず、後述する技術のいくつかは法的に未整理であり、社会実装の際には注意が必要です。詳細は<a href="https://www.jri.co.jp/page.jsp?id=101511">こちらのレポート</a>のp.39辺りをご参照ください。
:::


#Privacy Preserving Data Mining, PPDMとは

プライバシーを保護しつつ、別々の組織が持つデータを統合的に分析することを可能にする技術を**P**rivacy **P**reserving **D**ata **M**iningの略でPPDMと呼びます。[^ppdm]
[^ppdm]: 一般的には、異なる組織間かどうかに関係なくプライバシー保護技術を活用したデータ分析技術のことをPPDMと呼びます。また、プライバシー強化技術という語も世の中で使われているようです。

PPDMには、基本的に以下の2つの機能が求められます。

- データを保護する機能
- データの保護を維持したまま処理（計算）できる機能

この2つの機能を併せ持つ技術は少なく、大きく4つのアプローチに大別できます。

|アプローチ|要素技術|技術名|
|:----|:----|:----|
|情報理論的手法|匿名加工技術<br>暗号技術<br>統計化（機械学習）|分散匿名化技術<br>秘密計算技術<br>連合学習|
|ハードウェアによる手法|Trusted Execution Environment|Trusted Execution Environment|


上記の各手法について、今回は代表的な技術（筆者基準）について、浅く広くご紹介します。

- <a href="#分散匿名化技術">分散匿名化技術 (Distributed Anonymization)</a>
- <a href="#秘密計算技術">秘密計算技術 (Secure Computation)</a>
    - <a href="#準同型暗号">準同型暗号 (Homomorphic Encryption)</a>
    - <a href="#秘密分散">秘密分散 (Secret Sharing)</a>
- <a href="#連合学習">連合学習 (Federated Learning)</a>
- <a href="#trusted-execution-environment">TEE (Trusted Execution Environment)</a>

## 分散匿名化技術
![dano.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/877713/5863b022-4c5f-9f65-f11c-03c67016f452.png)
分散匿名化技術は、上図に示すように各社がそれぞれ自社が持つデータに匿名化処理を施し、各社の匿名化データを集約し、集約されたテーブルに対して統計化や機械学習等の処理をする技術です。

匿名化処理とは、プライバシー基準を満たすようにデータを加工する処理のことを言います。具体的な処理は以下のようなイメージです。
以下は、k-匿名性 (k=2)を満たす匿名化加工（k-匿名化）の例です。
※k-匿名性とは、ある個人が少なくともk-1人と区別がつかない状態のことを言います。
k=2の場合、ある個人と全く同じデータを持つ個人が少なくとも1人いるという状態です。

**匿名化前**

|性別|年齢|市町村コード|
|:----|:----|:----|
|男性|21|111111|
|女性|25|111222|

**匿名化後**

|性別|年齢|市町村コード|
|:----|:----|:----|
|*|20代|111***|
|*|20代|111***|
※「*」は、データ削除を示します。

## 秘密計算技術
秘密計算技術は、データを暗号化（またはそれに相当する処理）し、データの情報が漏れない状態を構築して、その状態を維持しつつ目的の処理を行うことができる技術です。

秘密計算を実現する技術は数多く提案されていますが、本記事では筆者らが代表的と考える**準同型暗号**と**秘密分散**を紹介します。

### 準同型暗号
準同型暗号は、暗号化したまま平文同士の加算や乗算を可能にする技術です。

例えば、「暗号化したまま平文同士の**加算**が可能」な準同型暗号とは、暗号$E$について、

```math
E(x_1 + x_2) := Add(E(x_1), E(x_2))
```

が成り立つような関数$Add$が$E$を復号することなく、定義できる暗号のことです。
**つまり、$x_1$と$x_2$を暗号化した$E(x_1)$、$E(x_2)$から、$E(x_1+x_2)$が計算できるということです！**

これだけだと何を言っているかわからないと思うので、もう少し具体的な例を挙げて説明します。
イメージしやすいように、暗号$E$としてAESを例に説明します。
※AESは、SSL/TLS(Web通信の暗号化）やWPA（無線LAN通信の暗号化）等で良く用いられる暗号です。

ある秘密鍵について、$AES(10)$、$AES(20)$、$AES(30)$は以下のようなバイナリになります。

```math
\begin{align}
AES(10) &= \text{0x8EAF90AD238F44C569885E0ECDA92FEC}  \\
AES(20) &= \text{0x9D5931409265CDE9B6C54733EE4A2C38}  \\
AES(30) &= \text{0x16D9E72DA9D7988D720F01EB453207A1}
\end{align}
```

この時、「暗号化したまま平文同士の加算が可能」とは、$AES(10)$と$AES(20)$を復号せず、2つのバイナリを基に$AES(30)$を導出できるか？ということです。
**普通の暗号ではできません。**
※当然、AESも準同型暗号ではありません。

これを可能にした特殊な暗号を準同型暗号と呼び、計算可能な演算によって以下のように呼び分けます。

- 加算が可能な方式を加法準同型暗号(Additive Homomorphic Encryption)
- 乗算が可能な方式を乗法準同型暗号(Multiplicative Homomorphic Encryption)
- 加算、乗算の両方が可能な方式を**完全準同型暗号**(Fully Homomorphic Encryption) 

特に近年注目されているのが、2006年にGentryによって初めて実現が報告された**完全準同型暗号** [1]です。
完全準同型暗号は、乗算と加算が可能なため、任意の処理が実現可能[2]です。
例えば、複雑な前処理（データの結合）や機械学習などといった処理も行うことができます。


このため、下図のようなPPDMを実現することが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/877713/77f5cd71-5cf2-dc2b-d727-c97e973534a9.png)


 準同型暗号のより詳しい説明は下記の文献を参照してください。  
 
- [⑤準同型暗号を用いた秘密計算技術と実用化に向けた活動](https://ipsj.ixsq.nii.ac.jp/ej/?action=pages_view_main&active_action=repository_view_main_item_detail&item_id=191278&item_no=1&page_id=13&block_id=8)  
- [準同型暗号を用いた秘密計算とその応用](https://www.jstage.jst.go.jp/article/isciesci/63/2/63_64/_pdf)


### 秘密分散による秘密計算
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/877713/51517dd8-6f62-d0c5-1aeb-5649c54abc30.png)

秘密分散による秘密計算では、データをシェアと呼ばれる形式のデータに分割し、そのシェアを用いて計算の参加者全員で協力して計算を実行します。
この時、上図のようにA社のデータから作成されたシェアはB社やC社にも配布されますが、シェアからは元のデータを推測できないため、A社のデータは漏洩しません。
また、各社がシェアに対して協調して所定の処理をすることで、目的の計算結果を得るような秘密計算をことができます。

最も代表的な秘密分散法であるShamirの(k,n)-閾値秘密分散法[3]を例に秘密分散による秘密計算について説明します。

#### Shamir（シャミア）の(k,n)-閾値秘密分散法
Shamirの(k,n)-閾値秘密分散法では、1つのデータを$n$個のシェアに分割し、$k$個のシェアから元データが復号できるという手法です。

(2,3)-閾値秘密分散法を例に仕組みを紹介します。
本記事では以下の3つについて説明します。

1. データ $s$ を$n(=3)$個のシェア$x_1,x_2,x_3$へ分割する方法
1. シェアからのデータ$s$の復元方法
1. データ$s_1 + s_2$の秘密計算方法


**1. データ $s$ を$n(=3)$個のシェア$x_1,x_2,x_3$へ分割する方法**
まず、データ$s(=36)$と適当な係数を用いて$k-1$次元の多項式を用意します。
※多項式の係数も秘密情報になります。

ここでは、以下の1次元の多項式を用います。($k -1 = 1$のため）
$$ f(x) = s + 42x  $$

このときシェア$(x_1,x_2,x_3)$は、下記のように計算します。

```math
\begin{align}
(x_1, x_2, x_3) &= (f(1),f(2),f(3))  \\
&= (36 + 42 \cdot 1, 36 + 42 \cdot 2, 36 + 42 \cdot 3) \\
&= (78, 120, 162)
\end{align}
```



**2. データ$s$の復元方法**
$(x_1,x_2,x_3)$を求める方法は非常に単純です。
$(x_1,x_2,x_3)$のうち、$k(=2)$個のシェア（点と表現した方がわかりやすいですが）を用いて、$f(0)$（つまりy切片）を求めれば良いです。（$f(0) = s$であるため）

例えば、$x_1=78,x_2=120$のシェアを用いる場合は以下の連立方程式を解くことで$s$を求めることができます。
※$a$は多項式の係数（今回の例だと、$a = 42$）

```math
\left\{
\begin{array}{ll}
78 &= s + a \cdot 1  \\
120 &= s + a \cdot 2
\end{array}
\right.
```

$k-1$次元の多項式は$k$個の点によって一意に決まります。
一般的な$k$次多項式のy切片(定数項)を求める際には、[ラグランジュの多項式補間](https://manabitimes.jp/math/726)がよく用いられます。

**3. データ$s_1 + s_2$の秘密計算**

今、$s_{1} = 36 \rightarrow (x_{1,1},x_{1,2}x_{1,3}) =(78, 120,162), s_{2} = 4 \rightarrow (x_{2,1},x_{2,2}x_{2,3})=(46,88,130)$にシェアが分割されているとします。

それぞれを3つの会社、A社、B社、C社がそれぞれシェアを持っている状況を想定します。
シェアの所有状態は以下の通りとします。

| 社名| $s_1$と$s_2$のシェア　　　　　　　|
|:-----:|:---------------------:|
|A社|$x_{1,1}, x_{2,1} = 78, 46$|
|B社|$x_{1,2}, x_{2,2} = 120, 88$|
|C社|$x_{1,3}, x_{2,3} = 162, 130$|

加算の秘密計算は、各社が自社の所有するシェア同士を独立に加算することで実現できます。
以下で本当にそんなことができるのか？を確認していきます。（※乗算についてもほぼ同様です）

まず、$s_1$と$s_2$のシェアを各社で独立に加算した結果は以下になります。

| 社名|$s_1$と$s_2$のシェア　　　　　　　|$s_1 + s_2$の計算結果シェア　　　|
|:-:|:-:|:-:|
|A社|$x_{1,1}, x_{2,1} = 78, 46$| $x_{1,1}+ x_{2,1}  = 124$|
|B社|$x_{1,2}, x_{2,2} = 120, 88$| $x_{1,2}+ x_{2,2} = 208$|
|C社|$x_{1,3}, x_{2,3} = 162, 130$| $x_{1,2}+ x_{2,2} = 292$ |

「2. データ$s$の復元方法」と同様にA社とB社の「$s_1 + s_2$の計算結果のシェア」から復元を試みると、以下の連立方程式が立てられます。

```math
\left\{
\begin{array}{ll}
124 &= s + a \cdot 1  \\
208 &= s + a \cdot 2
\end{array}
\right.
```

この連立方程式を解くと、$s = 40$となります。
上述のように$s_1 = 36, s_2 = 4$であることを踏まえると、上記の手順によって$s_1 + s_2$が計算できていることがわかります。



#### 【中級者向け】Shamir（シャミア）の(k,n)-閾値秘密分散法の一般的な解説
秘密情報$s$の秘密分散は一般的には以下の手順で行います。

**1.**秘密情報$s$を含めたk-1次元多項式$f(x)$を生成する。

```math
 f(x) = s + a_1\cdot x + a_2\cdot x^2 + \dots + a_{k-1} x^{k-1} 
```

**2.**シェア$v_i=(i,f(i))$とし、シェア$v_i$をそれぞれ参加者に送り、秘密情報を分散（秘密分散と呼ばれる所以）します。
ただし、$i=1,2,...,n$であり、$a_1,a_2,\cdots,a_{k-1}$は整数とします。$a_1,a_2,\cdots,a_{k-1}$は秘密情報とする必要があります。

また、秘密分散した秘密情報の復元は以下の手順で行います。
**1.**シェア$v_i$をk個以上集めます。
**2.** $v_i$は多項式を通る点の1つなので、[ラグランジュの多項式補間](https://manabitimes.jp/math/726)で多項式$f(x)$を復元できます。これは $(k-1)$次関数上のk個の点が決まれば、多項式が一意に定まる性質を利用しています。
**3.**最後に$f(0)$を出力すると秘密情報$s$が得られます。


<!-- ## 連合学習 -->
## 連合学習
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/877713/2793bf41-d296-4987-53a0-e1c05a1a2193.png)

連合学習は、上図に示すように各社がそれぞれ自社が持つデータを用いてモデルを学習し、学習されたモデルの重みを集約し、集約された重みから学習済みモデルを構築する技術です。

この時、会社Aと会社Bが持つ特徴量によって、2つの異なる学習方法になります。

1. 会社Aと会社Bが**同じ**特徴量を持つ場合
1. 会社Aと会社Bが**異なる**特徴量を持つ場合

#### 会社Aと会社Bが同じ特徴量を持つ場合
<!-- 図 -->
同じ特徴量を持つ場合というのは、例えば「年齢」を特徴量とする場合に会社Aも会社Bも「年齢」のデータを所有しているようなケースです。
こうしたケースは、データ数が足りず、会社Aと会社Bのデータを合わせて大規模な（多量な）データとして学習したい場合などに発生します。

このケースは、学習データが会社Aと会社Bで水平分割（行方向に分割）されていると見なすことができます。
そのため、上図に示すように会社Aと会社Bそれぞれで学習し、学習したモデルの重みを集約するという単純な手続きで実施できます。
集約について、単純な方法として、学習済みモデル同士の重みの平均を取る等があります。

#### 会社Aと会社Bが異なる特徴量を持つ場合
異なる特徴量を持つ場合というのは、会社Aと会社Bが異業種であり、全く異なる特徴を持つデータを所有しているケースです。
例えば、会社Aは小売分野、会社Bは飲食分野のような場合、会社Aは個人の購買情報からの特徴量、会社Bは個人の外食情報からの特徴量を持つような場合です。
こうしたケースは、自社データだけでは足りない特徴を会社Aと会社Bのデータで補い合ったデータとして学習したい場合などに発生します。

このケースは、学習データが会社Aと会社Bで垂直分割（列方向に分割）されていると見なすことができます。
そのため、下図に示すように会社Aと会社Bはモデルの一部を計算し、学習データに対する一部のモデルの出力を集約します。
集約された出力と正解データから誤差を算出し、会社Aと会社Bに提供し、会社Aと会社Bは誤差逆伝播法を用いて重みを更新します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/877713/c9c36151-d449-d07d-7a4a-48d2df62c614.png)


## Trusted Execution Environment
Trusted Execution Environment（TEE）は、ソフトウェアだけではなく、ハードウェアによる保護によって、アプリケーションの安全な実行環境を実現し、改ざんや不正アクセスを防ぐ技術のことです。

TEEは、隔離実行環境と"隔離"を担保するための仕組みによって構成されます。
隔離実行環境は、MEE(Memory Encryption Engine)が提供します。
Intelのチップに提供されたTEE機能であるIntel SGXを例に挙げると、MEEによって、データを暗号化した上でメモリ上に展開するなどがなされ、OSからもアクセスできないEnclaveという領域がメモリ上で構築されます。

”隔離”を担保するための仕組みは、外部の信頼できるシステムから隔離実行環境の信頼性を検証するRemote Attestationと呼ばれる技術を用います。チップ上にハードウェアとして実装された[Root of Trust](https://www.cybertrust.co.jp/blog/iot/techinfo/root-of-trust.html)から信頼性を検証するために必要な情報を遠隔の信頼できるシステムに送信し、信頼できるシステムがそれを検証することで実現されます。

TEEの実例として、チップベンダが提供しているIntel SGXやArm TrustZoneが挙げられます。
また、クラウド事業者がTEEを実現可能なSaaSサービスを提供しています。現在は以下のようなサービスがあります。

- [AWS Nitro Enclaves](https://aws.amazon.com/jp/ec2/nitro/nitro-enclaves/)
- [Azure Confidential Computing](https://azure.microsoft.com/ja-jp/solutions/confidential-compute/#overview)
- [GCP Confidential VMs](https://cloud.google.com/confidential-computing)
- [IBM Secure Execution for Linux](https://www.ibm.com/blogs/systems/jp-ja/secure-z-linuxone/)
- [Alibaba Container Service for Kubernetes](https://www.alibabacloud.com/help/ja/doc-detail/164536.htm)

ただし、TEEに対する攻撃の研究も多数行われており、サイドチャネル攻撃（装置の物理的な特性の変化を外部から観測・解析する攻撃）も報告されています。

TEEの詳しい説明は下記の論文を参照してください。
[Trusted Execution Enviromentの実装とそれを支える技術](https://www.jstage.jst.go.jp/article/essfr/14/2/14_107/_pdf/-char/ja)

## PPDM関連技術の社会実装の状況（NTTグループ）
NTTテクノクロス株式会社では、匿名加工情報作成ソフトウェア「tasokarena(タソカレナ)」を提供しています。NTT研究所の匿名加工技術を活用したソフトウェアです。tasokarenaを適切に利用することで、個人情報を[匿名加工情報](https://www.ppc.go.jp/personalinfo/tokumeikakouInfo/)へ加工する際に、データの有用性や匿名性のバランスを評価できるなど、加工の支援が可能です。

日本電信電話株式会社では、秘密計算技術にも取り組んでおり、秘密計算を使いやすくシステム化した「[秘密計算システム算師®️](https://www.ntt.co.jp/news2018/1808/180808a.html)」を提供しています。
 
NTTコミュニケーションズ株式会社では、大規模なシステム構築や複雑なコマンド入力を必要とせず、Webブラウザー上で秘密計算が利用できるクラウドサービス「[析秘（せきひ）](https://www.ntt.com/about-us/press-releases/news/article/2021/0819.html)」の提供を開始しています。
データを秘匿したまま回帰分析やデータ集計など多様な統計分析を行うことができます。
さらに、和歌山県と自治体で日本初となる秘密計算を用いた[実証実験](https://www.ntt.com/about-us/press-releases/news/article/2019/0909.html)も実施しています。

# さいごに
本記事では、プライバシーを保護しつつ、別々の組織が持つデータを統合的に分析することを可能にする技術、PPDMを紹介しました。
冒頭でも述べたように上述の技術の中には法的に未整理であり、社会実装の際には注意が必要な技術もあります。
また、本記事では各技術が持つ課題にはあまり言及していませんが、各技術が抱える課題によってまだ現実的には社会実装が難しい技術もあります。
筆者としても、今後もPPDM関連技術の進化を追いつつ、他方でこの分野に貢献できる活動をしていきたいと考えています。

本記事は、株式会社NTTドコモの片山と野澤が共同で執筆しました。


# 参考
[1]Craig Gentry. Fully homomorphic encryption using ideal lattices. In Proceedings of the Forty-first Annual ACM Symposium on Theory of Computing
[2] [Shafi Goldwasser, Yael Kalai, Raluca Ada Popa, et al. How to Run Turing Machines on Encrypted Data](https://eprint.iacr.org/2013/229)
[3] A. Shamir, “How to share a secret,” Communications of the ACM, Volume 22, Number 11, pp. 612–13, November 1979.


- [⑤準同型暗号を用いた秘密計算技術と実用化に向けた活動](https://ipsj.ixsq.nii.ac.jp/ej/?action=pages_view_main&active_action=repository_view_main_item_detail&item_id=191278&item_no=1&page_id=13&block_id=8)
- [準同型暗号を用いた秘密計算とその応用](https://www.jstage.jst.go.jp/article/isciesci/63/2/63_64/_pdf)
- [AESの計算](https://www.devglan.com/online-tools/aes-encryption-decryption)
- [高橋 克巳，プライバシー保護データマイニング，システム/制御/情報,Vol.63,No2,pp.43-50,2019.](https://www.jstage.jst.go.jp/article/isciesci/63/2/63_43/_pdf/-char/ja)
- [Trusted Execution Enviromentの実装とそれを支える技術](https://www.jstage.jst.go.jp/article/essfr/14/2/14_107/_pdf/-char/ja)
- [TEE (Trusted Execution Environment)は第⼆の仮想化技術になるか︖](http://www.ipsj.or.jp/sig/os/index.php?plugin=attach&pcmd=open&file=ComSys2020-Suzaki.pdf&refer=ComSys2020)
- [NTT Com、クラウド上で秘密計算が利用可能なサービス「析秘」を提供](https://cloud.watch.impress.co.jp/docs/news/1344876.html)
- [プライバシー強化技術の概説と動向](https://www.jri.co.jp/page.jsp?id=101511)