【文献】
ZAHUR, Samee et al.,Revisiting Square-Root ORAM: Efficient Random Access in Multi-Party Computation,Proceedings of 2016 IEEE Symposium on Security and Privacy (SP 2016),IEEE,2016年,pp. 218-234
【文献】
濱田 浩気,劣線形通信量で定数ラウンドの秘密計算配列アクセスアルゴリズム,コンピュータセキュリティシンポジウム2017 論文集,日本,情報処理学会,2017年10月16日,pp. 757-764
(58)【調査した分野】(Int.Cl.,DB名)
大きさnの秘匿文の配列[a]=([a[0]], [a[1]], …,[a[n-1]])とアクセス位置xの秘匿文[x]とを含む読み込み命令、もしくは、上記秘匿文の配列[a]と上記秘匿文[x]と書き込む値dの秘匿文[d]とを含む書き込み命令を入力とし、上記読み込み命令が入力されたときは上記秘匿文の配列[a]のx番目の要素である秘匿文[a[x]]を出力し、上記書き込み命令が入力されたときは上記秘匿文の配列[a]のx番目の要素である秘匿文[a[x]]を値a[x]と値dとの和の秘匿文[a[x]+d]に更新する秘密読み書き装置であって、
2個の秘匿文のベクトル[b0], [b1]からなる書き込みバッファ[b]=([b0], [b1])を記憶するバッファ記憶部と、
上記書き込み命令が入力されたとき、上記秘匿文のベクトル[b0]の末尾へ上記秘匿文[x]を新しい要素として追加し、上記秘匿文のベクトル[b1]の末尾へ上記秘匿文[d]を新しい要素として追加し、上記秘匿文のベクトル[b0]の要素数mが所定の値を超えたか否かを判定するバッファ追加部と、
上記秘匿文のベクトル[b0]の要素数mが上記所定の値を超えたとき、0以上m-1以下の各整数iについて、上記秘匿文の配列[a]のうち上記秘匿文のベクトル[b0]のi番目の要素である秘匿文[b0[i]]に対応する値b0[i]をインデックスとする要素である秘匿文[a[b0[i]]]を、上記秘匿文[a[b0[i]]]に対応する値a[b0[i]]と上記秘匿文のベクトル[b1]のi番目の要素である秘匿文[b1[i]]に対応する値b1[i]との和の秘匿文[a[b0[i]]+b1[i]]に更新する秘密書き込み部と、
上記読み込み命令が入力されたとき、上記秘匿文の配列[a]からx番目の要素である秘匿文[a[x]]を読み込む秘密読み込み部と、
上記秘密読み込み部が上記秘匿文[a[x]]を読みこんだ後、上記秘密読み込み部が読み込んだ秘匿文[a[x]]を、未反映値cの秘匿文[c]を用いて値a[x]と未反映値cとの和の秘匿文[a[x]+c]に更新するバッファ加算部と、
を含み、
上記未反映値cは、0以上m-1以下の各整数iについて、上記秘匿文のベクトル[b1]の要素のうち上記秘匿文のベクトル[b0]のi番目の要素である秘匿文[b0[i]]に対応する値b0[i]が上記秘匿文[x]に対応する値xと等しい要素である秘匿文[b1[i]]に対応する値b1[i]を総和した値である、
秘密読み書き装置。
大きさnの秘匿文の配列[a]=([a[0]], [a[1]], …,[a[n-1]])とアクセス位置xの秘匿文[x]とを含む読み込み命令、もしくは、上記秘匿文の配列[a]と上記秘匿文[x]と書き込む値dの秘匿文[d]とを含む書き込み命令を入力とし、上記読み込み命令が入力されたときは上記秘匿文の配列[a]のx番目の要素である秘匿文[a[x]]を出力し、上記書き込み命令が入力されたときは上記秘匿文の配列[a]のx番目の要素である秘匿文[a[x]]を値a[x]と値dとの和の秘匿文[a[x]+d]に更新する秘密読み書き装置が実行する秘密読み書き方法であって、
バッファ記憶部に、2個の秘匿文のベクトル[b0], [b1]からなる書き込みバッファ[b]=([b0], [b1])が記憶されており、
バッファ追加部が、上記書き込み命令が入力されたとき、上記秘匿文のベクトル[b0]の末尾へ上記秘匿文[x]を新しい要素として追加し、上記秘匿文のベクトル[b1]の末尾へ上記秘匿文[d]を新しい要素として追加し、上記秘匿文のベクトル[b0]の要素数mが所定の値を超えたか否かを判定し、
秘密書き込み部が、上記秘匿文のベクトル[b0]の要素数mが上記所定の値を超えたとき、0以上m-1以下の各整数iについて、上記秘匿文の配列[a]のうち上記秘匿文のベクトル[b0]のi番目の要素である秘匿文[b0[i]]に対応する値b0[i]をインデックスとする要素である秘匿文[a[b0[i]]]を、上記秘匿文[a[b0[i]]]に対応する値a[b0[i]]と上記秘匿文のベクトル[b1]のi番目の要素である秘匿文[b1[i]]に対応する値b1[i]との和の秘匿文[a[b0[i]]+b1[i]]に更新し、
秘密読み込み部が、上記読み込み命令が入力されたとき、上記秘匿文の配列[a]からx番目の要素である秘匿文[a[x]]を読み込み、
バッファ加算部が、上記秘密読み込み部が上記秘匿文[a[x]]を読みこんだ後、上記秘密読み込み部が読み込んだ秘匿文[a[x]]を、未反映値cの秘匿文[c]を用いて値a[x]と未反映値cの和の秘匿文[a[x]+c]に更新し、
上記未反映値cは、0以上m-1以下の各整数iについて、上記秘匿文のベクトル[b1]の要素のうち上記秘匿文のベクトル[b0]のi番目の要素である秘匿文[b0[i]]に対応する値b0[i]が上記秘匿文[x]に対応する値xと等しい要素である秘匿文[b1[i]]に対応する値b1[i]を総和した値である、
秘密読み書き方法。
【発明を実施するための形態】
【0010】
実施形態の説明に先立ち、この明細書における表記方法および用語の定義について説明する。
【0011】
<表記方法>
ある値aを暗号化や秘密分散などにより秘匿化した値をaの秘匿文と呼び、[a]と表記する。また、aを[a]の平文と呼ぶ。秘匿化が秘密分散である場合は、[a]により各秘密計算装置が持つ秘密分散の断片の集合を参照する。ベクトルa=(a
0, a
1, …)のi番目の要素をa[i]により参照する。ベクトルaとベクトルbの結合をa||bと表記する。ベクトルaの要素の数を|a|と表記する。実数xの絶対値を|x|と表記する。
【0013】
は床関数であり、実数x以下の最大の整数を表す。
【0015】
は天井関数であり、実数x以上の最小の整数を表す。
【0016】
<加算、減算、乗算>
秘匿文に対する加算、減算、乗算の各演算は、2つの値a, bの秘匿文[a], [b]を入力とし、それぞれa+b, a-b, abの計算結果c
1, c
2, c
3の秘匿文[c
1], [c
2], [c
3]を計算する。これらの演算の実行をそれぞれ次式のように記述する。
【0018】
誤解を招く恐れのない場合は、Add([a], [b]), Sub([a], [b]), Mul([a], [b])をそれぞれ[a]+[b], [a]-[b], [a][b]と略記する。
【0019】
<等号判定>
2つの値a, bの秘匿文[a], [b]を入力とし、a=bならばc=1、a≠bならばc=0となる秘匿文[c]を計算する処理を次式のように記述する。
【0021】
以下、この発明の実施の形態について詳細に説明する。なお、図面中において同じ機能を有する構成部には同じ番号を付し、重複説明を省略する。
【0022】
実施形態の秘密読み書き装置1は、
図1に例示するように、バッファ記憶部10、命令判断部11、秘密読み込み部12、バッファ加算部13、バッファ追加部14、および秘密書き込み部15を含む。この秘密読み書き装置1が、
図2に例示する各ステップの処理を行うことにより実施形態の秘密読み書き方法が実現される。
【0023】
秘密読み書き装置1は、例えば、中央演算処理装置(CPU: Central Processing Unit)、主記憶装置(RAM: Random Access Memory)などを有する公知又は専用のコンピュータに特別なプログラムが読み込まれて構成された特別な装置である。秘密読み書き装置1は、例えば、中央演算処理装置の制御のもとで各処理を実行する。秘密読み書き装置1に入力されたデータや各処理で得られたデータは、例えば、主記憶装置に格納され、主記憶装置に格納されたデータは必要に応じて中央演算処理装置へ読み出されて他の処理に利用される。秘密読み書き装置1の各処理部は、少なくとも一部が集積回路等のハードウェアによって構成されていてもよい。
【0024】
以下、
図2を参照して、実施形態の秘密読み書き装置1が実行する秘密読み書き方法について説明する。
【0025】
バッファ記憶部10には、入力された書き込み命令を保持しておくための書き込みバッファ[b]=([b
0], [b
1])が記憶されている。[b
0]はアクセス位置の秘匿文のベクトル[b
0]=([b
0[0]], [b
0[1]], …,[b
0[m-1]])である。[b
1]は書き込む値の秘匿文のベクトル[b
1]=([b
1[0]], [b
1[1]], …,[b
1[m-1]])である。ただし、mは書き込みバッファ[b]の要素数であり、m=|[b]|である。
【0026】
ステップS1−1において、命令判断部11は、読み込み命令もしくは書き込み命令を入力として受け取る。読み込み命令は、大きさnの秘匿文の配列[a]=([a[0]], [a[1]], …, [a[n-1]])とアクセス位置xの秘匿文[x]とを含む。書き込み命令は、大きさnの秘匿文の配列[a]=([a[0]], [a[1]], …, [a[n-1]])とアクセス位置xの秘匿文[x]と書き込む値dの秘匿文[d]とを含む。
【0027】
ステップS1−2において、命令判断部11は、入力が読み込み命令であれば、秘匿文の配列[a]とアクセス位置の秘匿文[x]とを秘密読み込み部12へ出力し、ステップS2へ処理を進める。また、入力が書き込み命令であれば、秘匿文の配列[a]とアクセス位置の秘匿文[x]と書き込む値の秘匿文[d]とをバッファ追加部14へ出力し、ステップS4−1へ処理を進める。
【0028】
ステップS2において、秘密読み込み部12は、アクセス位置xを秘匿したまま秘匿文の配列[a]からx番目の要素である秘匿文[a[x]]を読み込む。アクセス位置を秘匿したまま配列から要素を読み込む方法は、例えば、非特許文献2に記載されている方法を用いることができる。また、後述する秘密読み込み方法を用いれば、より効率よく読み込みを行うことができる。秘密読み込み部12は、読み出した配列[a]のx番目の要素である秘匿文[a[x]]をバッファ加算部13へ出力する。
【0029】
ステップS3−1において、バッファ加算部13は、バッファ記憶部10に記憶されている書き込みバッファ[b]を用いて未反映の値cの秘匿文[c]を計算する。具体的には、式(1)により秘匿文[c]を計算する。
【0031】
もしくは、式(2)により未反映の値cの秘匿文[c]を計算する。
【0033】
ステップS3−2において、バッファ加算部13は、秘密読み込み部12が出力した配列[a]のx番目の要素である秘匿文[a[x]]に未反映の値cの秘匿文[c]を加算して、秘匿文[a[x]]+[c]を配列[a]のx番目の要素である秘匿文[a[x]]として秘密読み書き装置1の出力とする。
【0034】
ステップS4−1において、バッファ追加部14は、バッファ記憶部10に記憶されている書き込みバッファ[b]へアクセス位置の秘匿文[x]と書き込む値の秘匿文[d]とを追加する。具体的には、m=|[b]|とし、[b[m]]=([b
0[m]], [b
1[m]])=([x], [d])とする。
【0035】
ステップS4−2において、バッファ追加部14は、書き込みバッファ[b]の要素数|[b]|が√nを超えているか否かを判定する。書き込みバッファ[b]の要素数|[b]|が√nを超えている場合(すなわち、|[b]|>√n)はステップS5へ処理を進める。また、書き込みバッファ[b]の要素数|[b]|が√n以下の場合(すなわち、|[b]|≦√n)は処理を終了する。
【0036】
ステップS5において、秘密書き込み部15は、書き込みバッファ[b]に記憶されているアクセス位置の秘匿文のベクトル[b
0]=([b
0[0]], [b
0[1]], …, [b
0[m-1]])と書き込む値の秘匿文のベクトル[b
1]=([b
1[0]], [b
1[1]], …, [b
1[m-1]])とを用いて、アクセス位置xを秘匿したまま書き込む値の秘匿文[d]を配列のx番目の要素である秘匿文a[x]へ加算する。アクセス位置を秘匿したまま配列へ値を書き込む方法は、例えば、非特許文献2に記載されている方法を用いることができる。また、後述する秘密書き込み方法を用いれば、より効率よく書き込みを行うことができる。
【0037】
以下、
図3を参照して、秘密読み込み部12が効率よく配列からのデータ読み込みを行う方法について説明する。
【0038】
ステップS12−1において、秘密読み込み部12は、大きさnの秘匿文の配列[a]=([a[0]], [a[1]], …, [a[n-1]])とアクセス位置xの秘匿文[x]とを入力として受け取る。
【0039】
ステップS12−2において、秘密読み込み部12は、k個の秘匿文のベクトル[v
j]を作成する。ただし、kは2以上の整数であり、jは1以上k以下の各整数である。具体的には、m
1, m
2, …, m
kをn≦m
1×m
2×…×m
kを満たす自然数とし、各整数jについて、x
jを式(3)で定義される整数とし、(x
jmod m
j)番目の要素が1であり、他の要素が0である、大きさm
jの秘匿文のベクトル[v
j]を作成する。
【0041】
特に、入力される各秘匿文が、(t, s)Shamir秘密分散によるシェアであれば、k, m
i(i=1, 2, …, k)を式(4)とすることができる。なお、(t, s)Shamir秘密分散とは、入力された平文をs個に分割した分散値をs個の秘密計算装置に分散して保持しておき、任意のt個のシェアが揃えば平文を復元でき、t個未満のシェアからは平文に関する一切の情報を得られないような秘密分散である。このとき、tは1以上の整数であり、s≧2t-1である。
【0043】
ステップS12−3−1において、秘密読み込み部12は、jを1に初期化する。
【0044】
ステップS12−3−2において、秘密読み込み部12は、秘匿文の配列[a
j-1]を用いてn
j個の秘匿文のベクトル[b
j,i]を作成する。このとき、秘匿文の配列[a]=([a[0]], [a[1]], …, [a[n-1]])は、秘匿文の配列[a
0]=([a
0[0]], [a
0[1]], …, [a
0[n-1]])として扱う。作成する秘匿文のベクトル[b
j,i]の数n
jは、jの値により異なる。具体的には、n
jを式(5)で定義される整数とし、iを0以上n
j未満の各整数とし、[b
j,i]=([a
j-1[m
ji+0]],[a
j-1[m
ji+1]], …, [a
j-1[m
ji+m
j-1]])(ただし、λ≧|a
j-1|のとき[a
j-1[λ]]=0)として、秘匿文のベクトル[b
j,j]を計算する。
【0046】
ステップS12−3−3において、秘密読み込み部12は、秘匿文のベクトル[b
j,j]と秘匿文のベクトル[v
j]との内積を第i要素とする秘匿文の配列[a
j]を計算する。
【0047】
ステップS12−3−4において、秘密読み込み部12は、j+1がk以下(j+1≦k)であるか否かを判定し、j+1がk以下であれば、jをインクリメント(j←j+1)してステップS12−3−2へ処理を戻し、j+1がkより大きければ(j+1>k)、秘匿文の配列[a
k]を出力する。なお、このとき、秘匿文の配列[a
k]は要素数が1の配列となっている。
【0048】
ステップS12−4において、秘密読み込み部12は、要素数が1の秘匿文の配列[a
k]を秘匿文の配列[a]のx番目の要素である秘匿文[a[x]]として出力する。
【0049】
以下、
図4を参照して、秘密書き込み部15が効率よく配列へデータ書き込みを行う方法について説明する。
【0050】
ステップS15−1において、秘密書き込み部15は、大きさnの秘匿文の配列[a]=([a[0]], [a[1]], …, [a[n-1]])と、アクセス位置の秘匿文のベクトル[b
0]と、書き込む値の秘匿文のベクトル[b
1]とを入力として受け取る。以下、アクセス位置の秘匿文のベクトル[b
0]は秘匿文[x
i]、書き込む値の秘匿文のベクトル[b
1]は秘匿文[y
i]として扱う。ただし、mを書き込みバッファ[b]の要素数|[b]|とし、iは0以上m未満の各整数である。
【0051】
ステップS15−2において、秘密書き込み部15は、各値y
iの書き込
み番地x
iを表現する秘匿文のベクトル[w
i]を作成する。具体的には、n
1, n
2をn
1n
2≧nを満たす自然数とし、p
i[λ
1]q
i[λ
2]が、n
2λ
1+λ
2=x
iのとき[y
i]となり、他のときは0となる秘匿文のベクトル[p
i], [q
i]を作成し、その秘匿文のベクトル[p
i], [q
i]を結合して、秘匿文のベクトル[w
i]=[p
i]||[q
i]を生成する。このとき、秘匿文のベクトル[p
i]は、
【0053】
の要素が1であり、他の要素が0である大きさn
1の秘匿文のベクトルとし、秘匿文のベクトル[q
i]は、
【0055】
の要素が[y
i]であり、他の要素が0である大きさn
2の秘匿文のベクトルとしてもよい。
【0056】
特に、入力される各秘匿文が、(t, s)Shamir秘密分散によるシェアであれば、n
1, n
2は、式(6)とすることができる。なお、(t, s)Shamir秘密分散とは、入力された平文をs個に分割した分散値をs個の秘密計算装置に分散して保持しておき、任意のt個のシェアが揃えば平文を復元でき、t個未満のシェアからは平文に関する一切の情報を得られないような秘密分散である。このとき、tは1以上の整数であり、s≧2t-1である。
【0058】
ステップS15−3において、秘密書き込み部15は、jを0以上n未満の各整数とし、秘匿文のベクトル[w
i]から要素を選択して秘匿文のベクトル[u
j], [v
j]を生成する。具体的には、iを0以上m未満の各整数とし、jを0以上n未満の各整数とし、λ
1, λ
2を式(7)とし、
【0060】
式(8)のようにして秘匿文のベクトル[u
j], [v
j]を生成する。
【0062】
ステップS15−4において、秘密書き込み部15は、jを0以上n未満の各整数とし、秘匿文のベクトル[u
j]と秘匿文のベクトル[v
j]との内積を秘匿文の配列[a]のj番目の要素[a[j]]に加算する。
【0063】
この発明は、バッファからの読み込みはバッファサイズに線形の通信量でできることと、秘密書き込み方法がバッファサイズO(√n)のときはO(n)の通信量でできることを利用することがポイントである。バッファサイズが√nを超えるまで実際の書き込みを保留することで、読み込みは必ずO(√n)の通信量で、書き込みは各回O(√n)に加えて1回だけO(n)の通信量で実現することができる。
【0064】
以上、この発明の実施の形態について説明したが、具体的な構成は、これらの実施の形態に限られるものではなく、この発明の趣旨を逸脱しない範囲で適宜設計の変更等があっても、この発明に含まれることはいうまでもない。実施の形態において説明した各種の処理は、記載の順に従って時系列に実行されるのみならず、処理を実行する装置の処理能力あるいは必要に応じて並列的にあるいは個別に実行されてもよい。
【0065】
[プログラム、記録媒体]
上記実施形態で説明した各装置における各種の処理機能をコンピュータによって実現する場合、各装置が有すべき機能の処理内容はプログラムによって記述される。そして、このプログラムをコンピュータで実行することにより、上記各装置における各種の処理機能がコンピュータ上で実現される。
【0066】
この処理内容を記述したプログラムは、コンピュータで読み取り可能な記録媒体に記録しておくことができる。コンピュータで読み取り可能な記録媒体としては、例えば、磁気記録装置、光ディスク、光磁気記録媒体、半導体メモリ等どのようなものでもよい。
【0067】
また、このプログラムの流通は、例えば、そのプログラムを記録したDVD、CD-ROM等の可搬型記録媒体を販売、譲渡、貸与等することによって行う。さらに、このプログラムをサーバコンピュータの記憶装置に格納しておき、ネットワークを介して、サーバコンピュータから他のコンピュータにそのプログラムを転送することにより、このプログラムを流通させる構成としてもよい。
【0068】
このようなプログラムを実行するコンピュータは、例えば、まず、可搬型記録媒体に記録されたプログラムもしくはサーバコンピュータから転送されたプログラムを、一旦、自己の記憶装置に格納する。そして、処理の実行時、このコンピュータは、自己の記憶装置に格納されたプログラムを読み取り、読み取ったプログラムに従った処理を実行する。また、このプログラムの別の実行形態として、コンピュータが可搬型記録媒体から直接プログラムを読み取り、そのプログラムに従った処理を実行することとしてもよく、さらに、このコンピュータにサーバコンピュータからプログラムが転送されるたびに、逐次、受け取ったプログラムに従った処理を実行することとしてもよい。また、サーバコンピュータから、このコンピュータへのプログラムの転送は行わず、その実行指示と結果取得のみによって処理機能を実現する、いわゆるASP(Application Service Provider)型のサービスによって、上述の処理を実行する構成としてもよい。なお、本形態におけるプログラムには、電子計算機による処理の用に供する情報であってプログラムに準ずるもの(コンピュータに対する直接の指令ではないがコンピュータの処理を規定する性質を有するデータ等)を含むものとする。
【0069】
また、この形態では、コンピュータ上で所定のプログラムを実行させることにより、本装置を構成することとしたが、これらの処理内容の少なくとも一部をハードウェア的に実現することとしてもよい。