What is Private Set Intersection?
「あるデータセットを持つ二者が個々のデータのプライバシーを放棄することなく、これらのデータセットを比較する事を可能にする。」
PSIプロトコルの設計
-データのサイズ
-攻撃を防ぐこと
-モバイルデバイスのように限られたリソースで計算する
ユースケース
プライベートは連絡先の発見
自分のプライベートな連絡先のうち、特定の通信アプリを持っている人を見つける
DNA検査とパターンマッチング
ユーザーは自分のDNA塩基配列を調べ、データベースに保存されている遺伝性疾患に関連する塩基配列を調べる
遠隔診断
医療診断プログラムはベクトル化された患者の電子カルテにステータスを付与する。患者は自分の病気について知ることが出来る場プログラムは秘密のままであり、プログラム所有者はデータについて知ることはない。
個人記録との連携
2つのデータ所有者が(例:同じ顧客について異なる種類の情報を保持している)データマイニングを可能にするには、保存されている他のプライベートデータを漏らすことなく記録をリンクして利用できるようにする。 「クライアントから暗号化された値とサーバー上の暗号化されていない値を掛け合わせ、クライアントのみが復号できる暗号化された結果を得る」
これは組み合わせによって実現しているわけではなさそう?Yudai.icon
準同型暗号によってこれは実現されている。
RSA-PSIプロトコル
べーズフェーズ
RSA秘密鍵を生成し、公開鍵をクライアントと共有する。クライアントは自分の集合Yの各要素に対して乱数を生成し、その暗号化とモジュラ逆数を保存する(非同期で実行する。) code:RSA-PSI ベースフェーズ
from psi.protocol import rsa
server = rsa.Server(key_size=2048, e=0x10001)
public_key = server.public_key
client = rsa.Client(public_key)
random_factors = client.random_factors(len(Y))
セットアップフェーズ
サーバーは秘密鍵を使用して自分のセットの要素に署名し、それらをクライアントと共有するBloom filterに挿入する。 code:RSA-PSI セットフェーズ
bf = bloom_filter.build_from(signed_server_set)
オンラインフェーズ
クライアントは生成した乱数を暗号化して(自分のセットの要素を見えなくするため)サーバーに送信する。サーバーはそれに署名し送り返す。
クライアントはBloom filterの逆操作を行い各要素の署名を取得し、署名が一致すれば関連する要素を交差点に入れる。 code:RSA-PSI オンラインフェーズ
A = client.blind_set(Y, random_factors)
B = server.sign_set(A)
intersection = []
for y, u in zip(y, unblinded_client_set):
if u in bf:
intersaction.append(y)
print("intersection is {}".format(intersection))