以下、本発明の実施の形態を、図面を参照しながら説明する。
(実施の形態1)
図1(a)〜(c)は、本発明による分散データの生成方法の一例を示す図である。ここでは、元データから、分散(A)、分散(B)、分散(C)の3個の分散データを生成(秘密分散)する方法を説明する。
図に示したように、秘密にすべきデータ(秘密データ、以下単に「元データ」と称す。)を、同じデータサイズの14のブロック(列)からなる、複数の分割データに分割する。これらの分割データは乱数を含まない。1ブロック分の分割データは、分割ブロックに相当し、ブロック(列)を意味する。
これ以降、他の図も含めて、元データの1番目のブロック(列)を列1と呼び、順に、列2、列3・・・と呼び識別する。このブロック(列)のデータサイズは、1ビット単位で、任意のサイズに設定可能である。なお、ここでは元データを14のブロック(列)に分割しているが、実際は2個以上であれば、いくつのブロック(列)に分割してもよい。
一方、元データから生成される分散(A)、分散(B)、分散(C)の各分散データは、これ以降、他の図も含めて、1番目のブロック(列)を列aと呼び、順に、列b、列c・・・と呼び識別する。また「分散(X)の列y」は、[分散(X)y]と表記する。例えば、「分散(A)の列a」は、[分散(A)a]と記す。
はじめに、分散(A)の生成方法について説明する。[分散(A)a]は、列1と列2とをXOR処理した値である。同様に、[分散(A)b]は、列3と列4とをXOR処理した値である。[分散(A)c]以下も、図に示したように、同様の処理によって計算する。このように、分散(A)は、元データを2段(行)に畳み込んでいる。従って、分散(A)のブロック(列)数は、元データのブロック(列)数の1/2になる。
ここで、分散(A)の分散データについて、分割グループを用いて説明する。上記の説明で、元データがブロック(列)に分割された分割データを示したが、ここで、分割データをDとし、分割グループは、分割データD(1)、分割データD(2)、・・・、分割データD(n)、・・・(nは2以上の整数)からなるものとする。奇数の分割データ、1、3、5、7、9、11を、D(1)=1、D(2)=3、D(3)=5、D(4)=7、D(5)=9、D(6)=11を含む、分割グループをDG1とする。偶数の分割データ、2、4、6、8、10、12を、D(7)=2、D(8)=4、D(9)=6、D(11)=8、D(11)=10、D(12)=14を含む、分割グループをDG2とする。この場合、分散(A)の分散データは、図1に示すように、分割データDを分割グループDG1、DG2同士で排他的論理和を行われ、分割データDの排他的論理和の組み合わせは、D(1) XOR D(7)、D(2) XOR D(8)、D(3) XOR D(9)、D(4) XOR D(10)、D(5) XOR D(11)、D(6) XOR D(12)となる。
次に、分散(B)の生成方法について説明する。[分散(B)a]は、元データの列1そのものである。一方、[分散(B)b]は、列3と列2とをXOR処理した値である。[分散(B)c]以下も、図に示したように、[分散(B)b]と同様の処理によって計算する。このように、分散(B)は、元データを2段(行)に畳み込んでいる。従って、分散(B)のブロック(列)数は、元データのブロック(列)数の1/2になる。
但し、この図を見てわかるように、分散(B)は、分散(A)の下段に図示したブロック、つまり元データの偶数列2、4、6・・・を、右に1個ずらしてXOR処理した値になっている。従って、分散(B)では元データの列14は計算に利用しない。
ここで、分散(B)の分散データについて、分散(A)と同様に、分割グループを用いて説明すると、分散(B)の分散データは、図1に示すように、分割データDを分割グループDG1、DG2同士で排他的論理和を行われ、分割データDの排他的論理和の組み合わせは、D(2) XOR D(7)、D(3) XOR D(8)、D(4) XOR D(9)、D(5) XOR D(10)、D(6) XOR D(11)となる。
分散(A)の分散データと分散(B)の分散データを対比した場合、分散(A)の分散データは、分散(B)の分散データが有する分割グループDG1、DG2と比較して、排他的論理和が行われている分割データDの組み合わせが、番号1、2、3、・・・nに沿って、一列分シフトしている。
次に、分散(C)の生成方法について説明する。[分散(C)a]は、元データの列2そのものである。一方、[分散(C)b]は、列1と列4とをXOR処理した値である。[分散(C)c]以下も、図に示したように、[分散(C)b]と同様の処理によって計算する。このように、分散(C)は、元データを2段(行)に畳み込んでいる。従って、分散(C)のブロック(列)数は、元データのブロック(列)数の1/2になる。
但し、この図を見てわかるように、分散(C)は、分散(A)の上段に図示したブロック、つまり元データの奇数列1、3、5・・・を右に1個ずらしてXOR処理した値になっている。従って、分散(C)では元データの列13は計算に利用しない。
ここで、分散(C)の分散データについて、分散(A)(B)と同様に、分割グループを用いて説明すると、分散(C)の分散データは、図1に示すように、分割データDを分割グループDG1、DG2同士で排他的論理和を行われ、分割データDの排他的論理和の組み合わせは、D(1) XOR D(8)、D(2) XOR D(9)、D(3) XOR D(10)、D(4) XOR D(11)、D(5) XOR D(12)となる。
分散(C)の分散データを分散(A)の分散データと対比した場合、分散(C)の分散データは、分散(A)の分散データが有する分割グループDG1、DG2と比較して、排他的論理和が行われている分割データDの組み合わせが、番号1、2、3、・・・nに沿って、一列分シフトしている。
さらに、分散(C)の分散データを分散(B)の分散データと対比した場合、分散(C)の分散データは、分散(B)の分散データが有する分割グループDG1、DG2と比較して、排他的論理和が行われている分割データDの組み合わせが、番号1、2、3、・・・nに沿って、二列分シフトしている。
すなわち、3つの分散データのうち、任意の分散データが有する少なくとも2つの分割グループは、他の任意の分散データが有する少なくとも2つの分割グループと比較して、排他的論理和が行われる分割データの組み合わせが、番号1、2、…、nに沿ってシフトしている。
このように、元データを2段(行)に畳み込む操作を行えば、元データの情報を欠落させることができる。これにより、1個の分散データから元データを復元されることを阻止できるようになる。つまり秘密分散を行うことが可能となる。
例えば、“Let them bet his room.”を、ACIIコード(American Standard Code for Information Interchange)で示すと、図1(b)の上段のようになる。なお、値は16進数表示である。この分散(A)は、図1(b)の下段のようになる。XOR算は、上下方向に配置される分割データ(例えば、22と4C)同士で行われる。
次に、“Lap them in this room.”を、ACIIコードで示すと、図1(c)の上段のようになる。この分散(A)は、図1(b)の下段のようになる。
これを見てわかるように、元データと分散データの関係は多対1であり、異なる文章から同じ分散(A)が生成できる。逆に言えば、分散(A)から複数の文章が生成可能である。
なお、ここでは元データはACIIコードとした説明したが、これに限られない。文字データは限られるため、分散データから元データを復元するも可能である。
ブロック(列)サイズが文字コードサイズ、すなわち、1バイトである場合、分散データの1ブロック(列)から推測できる元データの組み合せは256×256個(00H XOR 00H、00H XOR 01H、・・・、FFH XOR FFH)である。しかし、元データがACIIコードの場合は、20H〜7EH以外は除外できるので、解読しやすくなる。しかも単語や文として意味をなさないものも除外できるので、さらに、解読しやすいものとなる。
これを避けるためには、元データがASCIIコードなど、解読されやすいコードであれば、何らかのデータ処理を施した加工データを生成し、その加工データから分散データを生成した方がよい。
そして、どのようなデータ処理を施したかの情報(データ)も秘密分散処理を行い、分散データと共に保存するのが望ましい。
なお、この後の図の説明では、説明が煩雑になるのを避けるため、元データに対するデータ処理の説明は割愛しているが、元データを図示したすべての図において、元データとは本当の元データか、または本当の元データに何らかのデータ処理を施した加工データを指すものとする。
このような元データで元データを打ち消す操作によって、各分散データの情報エントロピーは増大させられているため、閾値未満の分散データから元データを復元することは容易ではない。従って、この秘密分散法は、多項式補間の秘密分散法と同等の安全性がある。
一方、XOR処理だけで分散データを生成するこの秘密分散法は、多項式補間の秘密分散法に比べ、処理速度が圧倒的に速い。しかも各分散データのデータ量は1/2で済む。
図2(a)及び(b)は、本発明による元データの復元方法の一例を示す図である。ここでは、図の上側に示した分散(A)、分散(B)の2個の分散データから、図の下側に示した元データを復元する方法を、フローチャートを使って説明する。
(1)[分散(B)a]より、元データの列1を取得する。(2)[分散(A)a] XOR 列1を計算し、その結果より、列2を取得する。(3)[分散(B)b] XOR 列2を計算し、その結果より、列3を取得する。(4)[分散(A)b] XOR 列3を計算し、その結果より、列4を取得する。(5)[分散(B)c] XOR 列4を計算し、その結果より、列5を取得する。(6)[分散(A)c] XOR 列5を計算し、その結果より、列6を取得する。(7)[分散(B)d] XOR 列6を計算し、その結果より、列7を取得する。(8)[分散(A)d] XOR 列7を計算し、その結果より、列8を取得する。(9)[分散(B)e] XOR 列8を計算し、その結果より、列9を取得する。(10)[分散(A)e] XOR 列9を計算し、その結果より、列10を取得する。(11)[分散(B)f] XOR 列10を計算し、その結果より、列11を取得する。(12)[分散(A)f] XOR 列11を計算し、その結果より、列12を取得する。(13)[分散(B)g] XOR 列12を計算し、その結果より、列13を取得する。(14)[分散(A)g] XOR 列13を計算し、その結果より、列14を取得する。
これにより、元データの列1、列2、列3・・・、列14が復元できる。なお、この計算処理方法はこれに限られるものではない。例えば、分散(A)と分散(B)の各列でそれぞれXOR処理すると、元データの奇数列が消えて、図2(b)に示す値が求められる。
こうして次は、以下のように、隣り合う列で順番にXOR処理を行うと、偶数列の値を求めることができる。列a(2) XOR 列b → 列 4、4 XOR 列c → 列 6、6 XOR 列c → 列 8、8 XOR 列c → 列10、10 XOR
列c → 列12、12 XOR 列c → 列14
そしてこれらの値と分散(A)の各列でそれぞれXOR処理すると、元データの奇数列が求められる。このように、元データを復元するための計算処理方法には、複数の計算処理方法が存在する。
図3は、本発明による元データの復元方法の一例を示す図である。ここでは、図の上側に示した分散(A)、分散(C)の2個の分散データから、図の下側に示した元データを復元する方法を、フローチャートを使って説明する。(1)[分散(C)a]より、元データの列2を取得する。(2)[分散(A)a] XOR 列2を計算し、その結果より、列1を取得する。(3)[分散(C)b] XOR 列1を計算し、その結果より、列4を取得する。(4)[分散(A)b] XOR 列4を計算し、その結果より、列3を取得する。(5)[分散(C)c] XOR 列3を計算し、その結果より、列6を取得する。(6)[分散(A)c] XOR 列6を計算し、その結果より、列5を取得する。(7)[分散(C)d] XOR 列5を計算し、その結果より、列8を取得する。(8)[分散(A)d] XOR 列8を計算し、その結果より、列7を取得する。(9)[分散(C)e] XOR 列7を計算し、その結果より、列10を取得する。(10)[分散(A)e] XOR 列10を計算し、その結果より、列9を取得する。(11)[分散(C)f] XOR 列9を計算し、その結果より、列12を取得する。(12)[分散(A)f] XOR 列12を計算し、その結果より、列11を取得する。(13)[分散(C)g] XOR 列11を計算し、その結果より、列14を取得する。(14)[分散(A)g] XOR 列14を計算し、その結果より、列13を取得する。
これにより、元データの列1、列2、列3・・・、列14が復元できる。なお、図2と同様に、この計算処理方法もこれに限られるものではない。例えば、分散(A)と分散(B)の各ブロックでそれぞれXOR処理し、列1の情報から、次々に奇数ブロックの値を求め、次に偶数ブロックの値を求めることも可能である。
図4は、本発明による元データの復元方法の一例を示す図である。ここでは、図の上側に示した分散(B)、分散(C)の2個の分散データから、図の下側に示した元データを復元する方法を、フローチャートを使って説明する。(1)[分散(B)a]より、元データの列1を取得する。(2)[分散(C)a]より、元データの列2を取得する。(3)[分散(B)b] XOR 列2を計算し、その結果より、列3を取得する。(4)[分散(C)b] XOR 列1を計算し、その結果より、列4を取得する。(5)[分散(B)c] XOR 列4を計算し、その結果より、列5を取得する。(6)[分散(C)c] XOR 列3を計算し、その結果より、列6を取得する。(7)[分散(B)d] XOR 列6を計算し、その結果より、列7を取得する。(8)[分散(C)d] XOR 列5を計算し、その結果より、列8を取得する。(9)[分散(B)e] XOR 列8を計算し、その結果より、列9を取得する。(10)[分散(C)e] XOR
列7を計算し、その結果より、列10を取得する。(11)[分散(B)f] XOR
列10を計算し、その結果より、列11を取得する。(12)[分散(C)f] XOR 列9を計算し、その結果より、列12を取得する。(13)[分散(B)g] XOR 列12を計算し、その結果より、列13を取得する。(14)[分散(C)g] XOR 列11を計算し、その結果より、列14を取得する。
これにより、元データの列1、列2、列3・・・、列14が復元できる。なお、図2、図3と同様に、この計算処理方法もこれに限られるものではない。この図4以降の各図で説明する復元方法も一例を示しているだけで、計算方法は1個に限られるものではない。
以上、図2、図3、図4の説明を見てわかるように、この秘密分散は閾値2の秘密分散になっている。後で再度説明を行うが、元データを2段(行)に畳み込む操作を行うと、閾値2の秘密分散となる。従って、本発明による秘密分散は閾値秘密分散を実現できる。
図5は、本発明による分散データのフォーマットの一例を示す図である。
図2、図3、図4の説明からわかるように、復元に用いる分散データによって、計算処理方法を変えなくてはならない。ここでは、適切な計算処理方法を選択するためのしかけを説明する。
分散データを生成する際、分散(A)、分散(B)、分散(C)の各分散データのヘッダ部には、分散情報を付加する。ここで分散情報とは、どのような処理で分散データを生成したか、または逆にどのような方法で復元を行うかを示す情報である。分散情報は、属性情報の一例であり、属性情報は、分散データの属性を示す。属性の例としては、識別情報(後述)、段数(分割グループの組み合わせ数)、復元方法などがある。
例えば、図1で説明したように、[分散(A)a]の生成には列1と列2を使い、元データを2段(行)に畳み込む操作を行っているので、分散情報には、2段(行)、つまり閾値2で、列1・列2スタートと記す。同様に、分散(B)の分散情報には、2段(行)、つまり閾値2で、列1スタートと記し、分散(C)の分散情報には、2段(行)、つまり閾値2で、列2スタートと記す。
このような分散情報を付加すれば、復元に際して、どのような計算処理方法を選択すればよいかがわかる。
さらに、この分散情報には、識別情報であるID(identification)を付加している。この情報は必須ではないが、誤った復元を防止する上で便利である。
同じ元データから作成された分散データに対して、同じIDを付与するものとすれば、復元に際して、IDを調べることで、元データが復元可能かを復元前に知ることができる。IDが異なれば、その復元は誤っているので、無駄に復元処理を行う必要がなくなる。また、IDを用いれば、復元した結果が、正しい元データなのかも保証できる。
なお、IDの生成方法には様々な方法があるが、通し番号とするか、乱数で生成するものとすれば簡単である。
なお、同じ元データから作成された分散データに対して、同じIDを付与すると説明したが、同じ元データから生成された分散データであることを示す方法は、これに限られるものではない。例えば、ある直線に並ぶ点をIDとすることで、同じ元データから生成された分散データであることを示すこともできる。
ここでは、分散データに付けたIDで元データが復元可能か否かを判断しているが、元データに付けた付加情報(マーク)が、復元の結果現れるかによって、正しい復元か否かを判断することも可能である。
なおここでは、分散情報をヘッダ部に記述すると説明しているが、分散情報は分散データのどの箇所(例えば末端)に記述してもよいし、分散情報を分散データとは別に保存するとすることも可能である。また、加工データから元データを生成するための情報(データ)、すなわち、元データに施したデータ処理法など情報(データ)は、これも分散情報(データ)の一部として保存してもよい。なおこのような分散情報(データ)は、これも秘密分散処理して保存するが望ましい。
なおここでは、分散情報は、「ID、2段(閾値2)、Xスタート」と記述するとしているが、その記述方法は様々にあり、1個に限られるものではない。例えば、ASCII文字列で記述してもよいし、特殊なコマンドや識別子などで記述してもよい。
図6は、本発明による元データの復元方法の一例を示す図である。ここでは、分散(A)、分散(B)、分散(C)というように複数の分散データの中から、2個の分散データを選択し、その選択した2個の分散データから元データを復元する方法を説明する。なお、各分散データには、図5で説明した分散情報が付与されているものとする。
(1)選択した2個の分散データのIDを比較する。IDが等しくなければ、同じ元データから生成された分散データではないので、エラーとし、復元処理を中断する。なお、元データに付与した付加情報が現れるかによって、復元結果が正しいか否かを判断するようにしている場合には、ここでのID判定はなく、次の処理に進む。
(2)閾値の数、つまり段(行)の数をチェックする。閾値2の場合は次の処理に進む。閾値3以上の場合は、この後で説明を行う、別の復元処理を施す。
(3)1・2スタートと1スタートの組み合せかチェックする。1・2スタートと1スタートの組み合せであれば、図2で説明した計算処理方法で元データを復元する。
(4)1・2スタートと2スタートの組み合せかチェックする。1・2スタートと2スタートの組み合せであれば、図3で説明した計算処理方法で元データを復元する。
(5)1スタートと2スタートの組み合せかチェックする。1スタートと2スタートの組み合せであれば、図4で説明した計算処理方法で元データを復元する。
ここで、(3)、(4)、(5)は、いずれを先にチェックしてもよい。なお、(3)、(4)、(5)に記述した分散データ以外にも、元データを復元可能な分散データがあるので、(3)、(4)、(5)に該当しない場合は、別の復元処理を施す。その内容はこの後で説明を行う。
図5および図6の説明でわかるように、複数の分散データから閾値以上の分散データを選択すれば、元データが復元できる。従って、nを分散数、mを閾値とすれば、本発明は(n、m)型の閾値秘密分散になっている。
図7は、本発明による秘密分散法の一例を示すブロック図の一例である。図7では、図1、図2、図3、図4、図5、図6の処理方法を装置として実現する場合の説明を行う。
ここでは、分散データの生成および元データの復元は、秘密分散モジュール2によって行われ、アプリケーションプログラム1が、秘密分散モジュール2に対して、分散データの生成および元データの復元をリクエストするものとして説明を行う。このアプリケーションプログラム1と秘密分散モジュール2が動作するコンピュータは、同じものでも異なるものでもよい。
また、元データおよび分散データは、記憶装置3に格納されるが、この記憶装置3もアプリケーションプログラム1と秘密分散モジュール2が動作するコンピュータと同じものでも異なるものでもよい。
ここでは、アプリケーションプログラム1、秘密分散モジュール2および記憶装置3が異なるコンピュータ上で動作していたとしても、説明を煩雑にしないために、コンピュータ間の通信方法に関する説明は割愛する。
なお、上側に図示したアプリケーションプログラム1と記憶装置3は、分散データの生成方法を説明するもので、下側に図示したアプリケーションプログラム1と記憶装置3は、元データの復元方法を説明するものであるが、上側と下側のアプリケーションプログラム1と記憶装置3は、同じアプリケーションプログラム、記憶装置であってもよいし、異なるアプリケーションプログラム、記憶装置であってもよい。
はじめに、分散データの生成方法から説明を行う。アプリケーションプログラム1は、秘密分散させたい元データを記憶装置3に格納する。そして分散処理依頼部100は、分散条件を示す分散条件情報、および、元データを格納したアドレスを示すアドレス情報A1、および、生成した分散データの格納先アドレスを示す、アドレス情報A2、A3、A4を、分散処理部300に渡す。
ここで、分散条件情報とは、秘密分散を行う上で必要となる情報のことで、分散数や閾値などの情報がこれに当たる。ここでは、図1のように、元データを3個に分散する場合の例で説明を行うので、分散数=3と指示したものとする。なお、この例では分散数=3なので、3個の格納先アドレス情報を用意しているが、さらに多数の分散データを生成するのであれば、分散処理依頼部100は、その分の格納先アドレス情報も用意しなければならない。
分散処理部300は、アドレス情報A1に示された記憶装置3のアドレスから元データを読出し、分散条件情報に従って、図1と同様の手段によって分散データを生成する。この時、図5のように、各分散データのヘッダに分散情報を付加する。また、分散処理部300は、乱数生成部400にIDとして利用する乱数を生成させ、この乱数をIDとして、これも図5のように、分散情報に付加する。そして、分散処理部300は、この生成した分散データ(A)、(B)、(C)を、分散処理依頼部100が指定したアドレス情報A2、A3、A4のアドレス先に格納する。
次に、元データの復元方法の説明を行う。アプリケーションプログラム1は、復元に用いる分散データを記憶装置3に格納する。そして、復元処理依頼部200は、復元した元データの格納先アドレスを示すアドレス情報B1および分散データを格納した先のアドレスを示すアドレス情報B2、B3、B4を分散処理部300に渡す。なお、ここでは、閾値が2の場合で説明を行っているので、アプリケーションプログラム1は最低2個の分散データを用意すれば良く、アドレス情報B4は提示しなくてもよい。
復元処理部500は、アドレス情報B2、B3、B4に示された記憶装置3のアドレスから分散データを読出し、分散情報に従って、図6と同様の手段によって元データを復元する。なお、閾値=2なので、先に記したように、復元処理部500は、IDが同じ分散データを2個見つけた時点で、アドレス情報B4を読まずに、直ちに元データの復元を行ってもよい。しかし、復元データが正しいか否かをチェックするために、アドレス情報B4に示されたアドレス先の分散データも利用して復元を行い、先に復元した元データと比較してもよい。そして、復元処理部500は、この復元した元データを、復元処理依頼部200が指定したアドレス情報B1のアドレス先に格納する。
図8は、本発明による秘密分散法のハードウェア構成図の一例である。ここでは、図7のアプリケーションプログラム1、秘密分散モジュール2および記憶装置3が、同じコンピュータ上で動作している場合で説明を行う。このコンピュータは、プログラム処理を実行するCPU10、一時的な記憶メモリであるRAM20、書き換え可能な不揮発性メモリであるHDD(ハードディスク)30で構成されている。
図7に示した各処理部は、CPU10およびRAM20で実行される。また、元データおよび分散(A)、分散(B)、分散(C)の格納先はHDD30である。従って、図7で説明したアドレス情報A1、A2、A3、A4およびB1、B2、B3、B4は、フォルダ・ファイル名とすることができる。
なお、ここでは、書き換え可能な不揮発性メモリであるHDD30に、元データおよび分散(A)、分散(B)、分散(C)を格納するようにしているが、これはフラッシュメモリなど他の不揮発性メモリでもRAM20のような揮発メモリであっても構わない。また分散処理を行う元データ、および、復元を行う分散データは、リードオンリーのメモリに格納することもできる。
なお、HDD30をUSBのフラッシュメモリなど外部記憶装置として、この外部記憶装置を、このコンピュータに接続して利用するものとすれば、簡単に使えて便利である。
この図示していないが、図7に図示したIDは一時的に使用するものなので、RAM20に格納して利用するとよい。
図9は、本発明による秘密分散法のハードウェア構成図の一例である。ここでは、図7のアプリケーションプログラム1および秘密分散モジュール2が動作するコンピュータと、記憶装置3の一部である分散データを格納するコンピュータが異なる場合で説明を行う。なお元データは、秘密分散モジュール2が動作するコンピュータ内の記憶装置3に格納するものとする。
秘密分散モジュール2が動作するコンピュータと分散データを格納するコンピュータとはネットワークによって接続されている。また、各分散データはそれぞれ異なるコンピュータ上に格納するものとする。
このように、各分散データを異なるコンピュータ上に格納する目的は、不正な元データの復元を防止するためである。各コンピュータの管理者が別人であれば、1人の管理者の権限だけでは元データを復元できなくなり安全である。例えば、コンピュータがクラウドコンピュータの場合、1社のクラウドコンピュータに分散データを集めてしまうと、その会社の管理者に元データを復元される危険性があるが、図9のような構成を用いれば、その危険性を大きく緩和できる。
現在、クラウドコンピュータはその利用料金の安さや手軽さが評価されているが、データの中身を盗み見される危険性があり、セキュリティが要求される業務では利用が進まない状況にある。図9のような構成を用いれば、安全にクラウドコンピュータを利用できるようになる。
秘密分散モジュール2が動作するコンピュータは、プログラム処理を実行するCPU10、一時的な記憶メモリであるRAM20、書き換え可能な不揮発性メモリであるHDD(ハードディスク)30とネットワークのデータ送受信を実行するMAC/PHY50で構成されている。
図7に示した各処理部は、CPU10およびRAM20で実行される。また、元データの格納先はHDD30である。従って、図7で説明したアドレス情報A1およびB1は、フォルダ・ファイル名とすることができる。
なおここでは、書き換え可能な不揮発性メモリであるHDD30に、元データを格納するようにしているが、これはフラッシュメモリなど他の不揮発性メモリでもRAM20のような揮発メモリであっても構わない。また分散処理を行う元データは、リードオンリーのメモリに格納することもできる。
HDD30をUSBのフラッシュメモリなど外部記憶装置として、この外部記憶装置を、このコンピュータに接続して利用するものとすれば簡単に使えて便利である。
図示していないが、図7に図示したIDは一時的に使用するものなので、RAM20に格納して利用するとよい。
MAC(Media Access Control)/PHY50は、ネットワーク通信を制御するハードウェアである。実際の通信は、CPU10およびRAM20によって制御される。
次に分散データを格納するコンピュータに関して説明を行う。ここでは分散(A)、分散(B)、分散(C)と3個に分散させ、それぞれ異なるコンピュータに格納するものとする。
なお、閾値未満の分散データであれば、同じコンピュータに格納しても危険ではないので、実際は用途に合わせて、どのコンピュータにいくつの分散データを格納するかを決めることができる。
分散(A)を格納するコンピュータは、通信制御や記憶装置へのアクセスを行うCPU11とRAM21、および、ネットワーク通信を制御するハードウェアであるMAC(Media Access Control)/PHY51および分散(A)を格納する記憶装置であるHDD31で構成されている。
同様に、分散(B)を格納するコンピュータは、通信制御や記憶装置へのアクセスを行うCPU12とRAM22、および、ネットワーク通信を制御するハードウェアであるMAC(Media Access Control)/PHY52および分散(A)を格納する記憶装置であるHDD32で構成され、分散(C)を格納するコンピュータは、通信制御や記憶装置へのアクセスを行うCPU13とRAM23およびネットワーク通信を制御するハードウェアであるMAC(Media Access Control)/PHY53、および、分散(A)を格納する記憶装置であるHDD33で構成されている。
このように分散データの格納先は、秘密分散モジュール2が動作するコンピュータとは異なるコンピュータのHDD30であるので、図7で説明したアドレス情報A2、A3、A4およびB2、B3、B4は、ネットワーク上のフォルダ・ファイル名やURL(Uniform Resource Locator)とすることができる。
なおここでは、書き換え可能な不揮発性メモリであるHDD30に、分散データを格納するようにしているが、これはフラッシュメモリなど他の不揮発性メモリでもRAM20のような揮発メモリであっても構わない。また復元を行う分散データは、リードオンリーのメモリに格納することもできる。
以上のように、実施の形態1では、分割データ同士で排他的論理和を行うので、分散データを秘密データより少ないデータ量にすることができ、復元処理の速度を向上させることができる。また、分散データを生成する場合に、分割グループ同士を番号(列)に沿ってシフトさせているので、任意の2つの分散データ同士で、分割データの排他的論理和の組み合わせに規則性を持たせることができる、乱数を含まないデータ同士で容易に秘密分散方法を実現することができる。
(実施の形態2)
実施の形態2は、実施の形態1と異なり、元データに乱数を付加した場合である。
図10は、本発明による分散データの生成方法の一例を示す図である。ここでは、図1とは異なる方法で分散データを生成している。図1と比較するために、ここでも、分散(1)、分散(2)、分散(3)の3個の分散データを生成する場合で説明を行う。
図10の分散(1)は、図1の分散(A)と同じである。また、分散(2)も分散(B)と同じである。異なるのは3番目の分散データである。図1の分散(C)は、分散(A)の上段を1個ずらしたものになっているが、図10の分散(3)は、分散(1)、すなわち、分散(A)の下段を2個ずらしたものになっている。
このように、分散(A)の下段を2個ずらしたものも分散データとして利用できる。また、同様に分散(A)の上段をN(N=1、2、3・・・)個ずらしたものも分散データとして利用できる。
なおこれ以降の図でも、分散データを生成するのに、下段をずらした方法で説明を行うが、どの図でも、同じように上段をずらした分散データの生成も可能である。
但し、図10の分散(3)のような複数個ずらした分散データを利用する場合には注意が必要である。例えば、分散(2)および分散(3)には、元データの列14の情報がないので、分散(2)と分散(3)から元データを復元した場合、列14は復元できない。
この課題に対処するには、図10のように、元データに対して、列14を乱数とした修正データを作成し、これから分散データを生成すればよい。つまり、元データを図1より1個少ない、13個のブロック(列)に分け、列13の最後に、乱数で構成された1個のダミーブロック(列)を加え、これから分散データを生成すればよい。そして元データを復元する際は、乱数で構成された最後のダミーブロック(列)、すなわち列14は削除、または復元しなければよい。
なおこうすると、列14のダミーブロック(列)は、[分散(1)g]にある列13を暗号化する効果も生む。
図6でも説明したが、この図の説明からわかるように、閾値2の分散データを生成する方法は、図1の方法に限られるものではなく、図10のような方法も存在する。
図11は、本発明による分散データのフォーマットの一例を示す図である。ここでは、図5の分散情報に、元データのブロック(列)数であるLEN長の情報を付加している。これにより、元データを復元した場合に、どこからがダミーブロック(列)がわかるので、正しく元データを復元できるようになる。なお、ダミーブロック(列)を識別する方法はこれに限られるものではなく、例えば、ダミーブロック(列)の番号を記述してもよい。
図12は、本発明による元データの復元方法の一例を示す図である。ここでは、図の上側に示した分散(1)、分散(3)の2個の分散データから、図の下側に示した元データを復元する方法を、フローチャートを使って説明する。
(1)[分散(3)a]より、元データの列1を取得する。(2)[分散(1)a] XOR 列1を計算し、その結果より、列2を取得する。(3)[分散(3)b]より、元データの列3を取得する。(4)[分散(1)b] XOR 列3を計算し、その結果より、列 4を取得する。(5)[分散(3)c] XOR 列2を計算し、その結果より、列 5を取得する。(6)[分散(1)c] XOR 列5を計算し、その結果より、列 6を取得する。(7)[分散(3)d] XOR 列4を計算し、その結果より、列 7を取得する。(8)[分散(1)d] XOR 列7を計算し、その結果より、列
8を取得する。(9)[分散(3)e] XOR 列6を計算し、その結果より、列 9を取得する。(10)[分散(1)e] XOR 列9を計算し、その結果より、列10を取得する。(11)[分散(3)f] XOR 列8を計算し、その結果より、列11を取得する。(12)[分散(1)f] XOR 列11を計算し、その結果より、列12を取得する。(13)[分散(3)g] XOR 列10を計算し、その結果より、列13を取得する。(14)[分散(1)g] XOR 列13を計算し、その結果より、列14を取得する。(15)分散情報のLEN長よりブロック(列)数を読み出す。ブロック(列)数は13とわかるので、列14を削除する。
このように、図1の分散(A)の上段、または下段を複数個ずらした分散データを利用しても、元データを復元できることがわかる。なおここでは、列14を復元した後に削除しているが、最初に分散情報のLEN長を見て、それ以上のブロック(列)は復元しないとする方法もある。なお、復元の計算処理方法はこれに限られるものではない。
図13は、本発明による元データの復元方法の一例を示す図である。ここでは、図1の分散(A)の上段を1個ずらした分散(C)と、分散(A)の下段を2個ずらした分散(3)でも、元データを復元できることを示す。
(1)[分散(3)a]より、元データの列1を取得する。(2)[分散(3)a]より、元データの列3を取得する。(3)[分散(C)b]より、元データの列2を取得する。(4)[分散(C)b] XOR 列3を計算し、その結果より、列4を取得する。(5)[分散(C)c] XOR 列2を計算し、その結果より、列6を取得する。(6)[分散(3)c] XOR 列5を計算し、その結果より、列5を取得する。(7)[分散(3)d] XOR 列4を計算し、その結果より、列7を取得する。(8)[分散(C)d] XOR 列7を計算し、その結果より、列8を取得する。(9)[分散(C)e] XOR 列6を計算し、その結果より、列10を取得する。(10)[分散(3)e] XOR 列9を計算し、その結果より、列9を取得する。(11)[分散(3)f] XOR 列8を計算し、その結果より、列11を取得する。(12)[分散(C)f] XOR 列11を計算し、その結果より、列12を取得する。(13)[分散(C)g] XOR 列10を計算し、その結果より、列14を取得する。(14)[分散(3)g] XOR 列13を計算し、その結果より、列13を取得する。
このように、図1の分散(A)の上段、下段を複数個ずらした分散データを組み合わせて利用しても、元データを復元できることがわかる。なおここでは、ブロック(列)14は乱数とする必要がない。ブロック(列)14を乱数、すなわちダミーブロック(列)としなければならないのは、下段を1個ずらした分散データと下段を2個ずらした分散データの両方を用いる場合である。同様に、上段を1個ずらした分散データと上段を2個ずらした分散データの両方を用いる場合は、ブロック(列)13を乱数、すなわちダミーブロック(列)としなければならない。なお復元の計算処理方法はこれに限られるものではない。
図14は、本発明による分散データの生成方法の一例を示す図である。ここでは、図10に、分散(4)を追加している。図を見てわかるように、分散(4)は下段を3個ずらしたものになっている。
このように、分散(A)の下段を3個、4個、・・・とずらしたものも分散データとして利用できる。また、同様に分散(A)の上段を3個、4個、・・・とずらしたものも分散データとして利用できる。
但し、図10の分散(3)と同様、分散(4)のような複数個ずらした分散データを利用する場合には注意が必要である。例えば、分散(3)、および、分散(4)には、元データの列12と列14の情報がないので、分散(3)と分散(4)から元データを復元した場合、列12と列14は復元できない。
この課題に対処するには、図10と同様に、復元で欠落する列を乱数、すなわちダミーブロック(列)とすればよい。ここでは列12と列14を乱数とすればよい。つまり、図に示したように、元データを、図1より2個少ない12個のブロック(列)に分け、欠落する2個分のダミーブロック(列)を付加した修正データを作成し、これから分散データを生成すればよい。
なお、そのダミーブロック(列)を付加する位置は、図に示したように、欠落するブロック(列)である列12と列14である。そして元データを復元する際は、乱数で構成されたダミーブロック(列)は削除または復元しなければよい。
同様に、分散(1)の上下段をX個ずらす場合は、(X−1)個のダミーブロック(列)を用意し、欠落する部分を埋め合わせれば済む。
このように、ダミーブロック(列)を利用すれば、いくつもの分散データを生成することが可能である。ここからわかるように、本発明を用いれば、分散数を自由に設定可能である。つまり、容易に(N、2)の閾値分散(分散数N=2、3、4・・・、閾値2)をつくり出すことが可能である。
なお、こうすると、列12および列14のダミーブロック(列)は、[分散(1)f]の列11、[分散(1)g]の列13および[分散(2)g]の列13を暗号化する効果も生む。
なお、図の元データの列11と列13との間の斜線は、データが存在しないことを意味している。つまり、列11の直後のデータは列13であることを示している。これ以降、すべての図で、斜線は、データが存在しないことを示すものとする。
図15は、本発明による分散データのフォーマットの一例を示す図である。ここでは、図5の分散情報に、ダミーブロック(列)の位置情報を付加している。これにより、元データを復元した場合に、どこがダミーブロック(列)であるかがわかるので、正しく元データを復元できるようになる。
なお、ダミーブロック(列)を識別する方法はこれに限られるものではなく、例えば、ダミーブロック(列)に識別情報を付加し、この識別情報が出現するかでダミーブロック(列)か否かを判断するものとしてもよい。
なお、この分散(4)を利用した元データの復元方法は、図2、図3、図4、図12、図13を参照すれば容易にわかるので、詳細の説明は割愛する。同じく、これ以降、閾値2の場合における、元データの復元方法の詳細説明は割愛する。
図16は、本発明による分散データの生成方法の一例を示す図である。ここでは、図10とは異なり、分散データの列gを見てわかるように、上段のブロック(列)が1個多い構成になっている。この場合、図を見てわかるように、図10と同じ要領で、3個の分散データを生成しても欠落するブロック(列)がない。図10では分散(2)と分散(3)とで元データを復元した場合、列14が欠落したが、図16では、上段が下段よりブロック(列)が1個多いため、分散(2)と分散(3)とで元データを復元した場合でも、欠落するブロック(列)がない。
図14では、分散(1)の上下段をX個ずらす場合は、(X−1)個のダミーブロック(列)を用意するように説明したが、これは分散(1)の上下段のブロック(列)数が等しい場合の話である。図16のように、分散(1)の上下段のブロック(列)数が他方より1個多い場合(但し、少ないブロック(列)の段をずらす)は、(X−2)個のダミーブロック(列)を用意すればよい。同様に、分散(1)の上下段のブロック(列)数が他方よりM個多い場合は、(X−1−M)個のダミーブロック(列)を用意すればよい。但し、X≧1+Mである。
なお、この図16と図10とを比較してみるとわかるが、図10の修正データは、図16の元データの最後に、意味のない乱数を付加した形である。従って、本質的には、図10と図16の分散データの生成方法は同じである。但し、図16の[分散(1)g]が裸で見えているのに対し、図10の[分散(1)g]は乱数でXOR処理され(暗号化され)ている。
図17は、本発明による分散データの生成方法の一例を示す図である。図17は、図16より1個多く、分散データ、すなわち、分散(4)を生成している。図を見てわかるように、分散(3)と分散(4)とで復元を行うと、列12が欠落する。
この課題に対処するために、ここでは、図に示したように、元データを、図16より1個少ない12個のブロック(列)に分け、欠落する1個分のダミーブロック(列)を付加した修正データを作成し、これから分散データを生成している。そのダミーブロック(列)を付加する位置は、図に示したように、欠落するブロック(列)である列12である。そして元データを復元する際は、乱数で構成されたダミーブロック(列)は削除、または復元しないようにすればよい。
この図17と図14とを比較してみるとわかるが、図14の修正データは、図17の修正データの最後に意味のない乱数を付加した形である。従って、本質的には、図14と図17の分散データの生成方法は同じである。但し、図17の[分散(1)g]が裸で見えているのに対し、図14の[分散(1)g]は乱数でXOR処理され(暗号化され)ている。
図18は、本発明による分散データの生成方法の一例を示す図である。図18は、図17よりさらに1個多く、分散データ、すなわち、分散(5)を生成している。今までの説明でわかるように、ここでは欠落する2個分のダミーブロック(列)が必要となる。
図17と比較しやすくするためには、図18の元データの列番号を、1、2、3・・・、9、11、13とし、修正データのブロック(列)数を、図17と同じ13個にするのがよいが、ここでは図14と比較しやすくするために、図17の元データの列番号を、1、2、3・・・、11、13、15とし、修正データのブロック(列)数を図17より2個多くなるように図示している。
この図18と図14とを比較してみるとわかるが、図18の修正データは、図14の修正データの最後に意味あるデータを付加した形になっている。こうすると、ダミーブロック(列)の数は同じままなのに、分散数は1個増加する。
図16のように、分散データの上段、若しくは下段を1個ずらせば、分散数を3にでき、図10のように、元データに最後に意味のない乱数を付加した修正データを秘密分散処理すれば、最後のブロック(列)を暗号化できる。また、図17のように、その乱数の次に、意味あるデータを付加すれば、分散数を1個多い4にでき、図14のように、元データに最後に意味のない乱数を付加した修正データを秘密分散処理すれば、最後のブロック(列)を暗号化できる。さらに、図18のように、その乱数の次に、意味あるデータを付加すれば、分散数を1個多い5にでき、・・・というように、分散数は自由に設定できる。
図19は、本発明による分散データの生成方法の一例を示す図である。図19は、図18の分散データの上段と下段を入れ替えたものになっている。これは、図18の上段をずらして分散データを生成しているのと等価である。これは図10で説明したように、上段・下段のいずれか一方をずらせば分散データが生成できることを意味している。なお、分散データを生成するのは、上段・下段のいずれか一方をずらすだけでなく、図1のように上段・下段の両方をずらすことでも生成できる。
この図19からはもう1個の知見を得られる。これまでの図の説明では、元データの列1、2から[分散(1)a]が生成され、同様に以下、元データの列3、4から[分散(1)b]、元データの列5、6から[分散(1)c]、・・・と生成されているが、この列1、列2、列3・・・の番号は、図19のように、通し番号で連続していなければならないというものではない。
図20は、本発明による分散データの生成方法の一例を示す図である。図20では、図19で説明した、「この列1、列2、列3・・・の番号は、通し番号で連続していなければならないというものではない」ということを簡潔に説明したものである。
元データの本当の並びは、図20に図示したように、列10、列3、列16・・・と並んでいたとする。これに、並びを変える、図1で説明したデータ処理を施して、列1、列2、列3・・・と配置を変えた修正(加工)データを生成する。なお、欠落するブロック(列)を乱数のダミーブロック(列)にする処理も同時に施す。このような操作を行うと、後は図18と全く同じになる。
なお、図1でも説明したが、このようなデータ処理は、分散データから元データを推測させにくくするので好ましい。
このように、分散データの各ブロック(列)に元データのどのブロック(列)を配置するかは自由である。これは、図19以外のどの図でも同じである。従って、本発明は、元データの奇数ブロック(列)、偶数ブロック(列)を、分散データの上段・下段の2段(行)に分けて配置するというものではなく、元データの各ブロック(列)を、任意に2個のグループに分け、分散データの上段・下段に配置したものであることがわかる。また分散データの上段・下段でのブロック(列)を並べる順番も任意である。
なお、これ以降の図で説明するが、閾値=3の場合は3段(行)に、閾値=4の場合は4段(行)に、閾値=N(N=3、4、5・・・)の場合はN段(行)に元データを分割するが、2段(行)と同様に、分散データのどの段(行)のグループに、元データのどのブロックを配置するかは任意である。また、その段(行)でのブロック(列)を並べる順番も任意である。
図21は、本発明による分散データの生成方法の一例を示す図である。この図21は、図10から元データの列1と列3を除去したものである。今までの図では、分散(1)の下段のブロック(列)数は分散データの上段のブロック(列)数以下であったが、図21では分散(1)の下段のブロック(列)数が上段のブロック(列)数より多い配置となっている。このように配置する利点は、図27の説明で改めて行う。
閾値=N(N=3、4、5・・・)の場合も同様であるが、このように、各段にいくつのブロック(列)を配置するかは任意である。
図22は、本発明による分散データの生成方法の一例を示す図である。この図22は、図17から元データの列10を除去し、図17のようなダミーブロック(列)を挿入しないものである。
図22では、分散(1)の上段のブロック(列)数が、下段のブロック(列)数より3個多い。一方、図17は、ダミーブロック(列)を挿入しているため、分散(1)の上段のブロック(列)数が、下段のブロック(列)数より1個多いように見えているが、ダミーブロック(列)は元データにはない単なる乱数なので、これを除去すればわかるように、実際は、分散(1)の上段のブロック(列)数が、下段のブロック(列)数より2個多いケースの説明になっている。つまり、図22は図17より、分散(1)の上段のブロック(列)数と下段のブロック(列)数の差が1個多い形になっている。
分散(1)の上段のブロック(列)数と下段のブロック(列)数の差が1個より多くしたことで、図22では、図17より、分散数をさらに1個多い5個にすることができている。
実は、ここの説明は、図16や図18の説明の繰り返しになっている。図22が図16や図18の説明と異なるところは、ダミーブロック(列)の扱いだけである。図16や図18では、欠落するブロック(列)をダミーブロック(列)で補うとしたが、図22が図18からダミーブロック(列)を剥ぎ取った形になっているのを見てわかるように、ダミーブロック(列)は必ずしも必須でない。
図23は、本発明による分散データの生成方法の一例を示す図である。今までの図では分散(1)の下段を左にずらして他の分散データを生成していたが、ここでは、分散(1)の下段を右にずらして他の分散データを生成している。なお、下段ではなく、上段を右にずらしても同様に分散データを生成できる。
このように、左にずらしても右にずらしても本質は全く同じであり、他の図で説明している方法は、この右にずらす場合にも適用できる。なお、欠落するブロック(列)がある場合、右にずらす場合は、左にずらす場合に比べて、欠落するブロック(列)の位置が異なる。図23の例では、列2が欠落する。図23では、この列2を乱数とするダミーブロック(列)で補っているが、図22で説明したように、このダミーブロック(列)はなくてもよい。
以上のように、実施の形態2では、分割データと乱数データとを組み合わせて排他的論理和を行うので、分割データを乱数データで暗号化することができ、分割データが推測し易い場合(例えば、同じ値、0、0、0、・・・が続く場合や、値に規則性を有する場合)であっても、分割データを難読化させることで、セキュリティを向上させることができる。
(実施の形態3)
実施の形態3は、実施の形態1、2と異なり、元データに付加する乱数を共有する場合である。
図24は、本発明による分散データの生成方法の一例を示す図である。図24は、裸で見えている、図14の[分散(2)a]、[分散(3)a]と[分散(3)b]、[分散(4)a]と[分散(4)b]と[分散(4)c]を、乱数でXOR処理(暗号化)したものである。つまり、分散データの中に元データが出現しないようにするものである。そのため、乱数12や乱数14のように、欠落するブロックもダミーブロック(列)で埋めている。これにより、閾値未満の分散データで元データを復元することは、より困難となる。
ここでは図示したように、[分散(2)a]を乱数AでXOR処理し、以下同様に、[分散(3)a]を乱数Bで、[分散(3)b]を乱数Cで、[分散(4)a]を乱数Dで、[分散(4)b]を乱数Eで、[分散(4)c]を乱数FでXOR処理している。
なお、ここではすべて違う乱数としているが、すべて同じ乱数AでXOR処理するとしてもよいし、同じ列は同じ乱数でXOR処理するとしてもよい。また、分散データ毎に同じ乱数を使用しても良く、乱数をどのように使うかは自由である。
なお、この乱数の共有方法には様々な方法がある。まず乱数そのものを本発明による秘密分散法や多項式補間による秘密分散法で処理(乱数から分散データを生成)してもよいし、乱数生成器のシード(初期値)など、この乱数を生成できる条件(データ)を、本発明による秘密分散法や多項式補間による秘密分散法で処理してもよい。また秘密分散処理を行わずに、分散(3)に乱数Aを、分散(4)に乱数B、Cを、分散(2)に乱数D、E、Fを配布するなど、互いの乱数を持ち合うことも可能である。
図25にその乱数の共有方法の一例を示す。ここでは、図23で利用しない乱数G、H、・・・Nも秘密分散処理しているが、利用する乱数だけを秘密分散処理することも可能である。また、ここでは図23で利用する乱数を分散データの上段にしているが、これを下段に配置することも可能であり、その乱数の配置は自由である。
なお、元データのどの列とどの乱数がXOR処理されているかなど、これら乱数の利用方法に関する情報は分散情報に記憶するとよい。
図26は、本発明による分散データの生成方法の一例を示す図である。図26は、図24と同様に、裸で見えている、図14の[分散(2)a]、[分散(3)a]と[分散(3)b]、[分散(4)a]と[分散(4)b]と[分散(4)c]を、乱数でXOR処理(暗号化)したものである。つまり、これも分散データの中に元データの値が出現しないようにするものである。そのため、乱数12や乱数14のように、欠落するブロックもダミーブロック(列)で埋めている。
この図26と図14とを比較してみるとわかるが、図26の修正データは、図14の修正データの最初に乱数列を付加した形になっている。これによって、分散(2)、分散(3)、分散(4)を生成した場合に、図14の[分散(2)a]、[分散(3)a]と[分散(3)b]、[分散(4)a]と[分散(4)b]と[分散(4)c]が元データのまま出現することを防いでいる。
このように、乱数をデータの一部として配置しているので、図25では図23とは異なり、乱数列を再度分散して配付する必要がない。なお、元データの先頭にいくつ乱数を付加したかなど、乱数に関する情報は分散情報に記憶するとよい。
(実施の形態4)
実施の形態4は、実施の形態1〜3と異なり、元データの欠落するブロックに乱数を付加する場合である。
図27は、本発明による分散データの生成方法の一例を示す図である。図27も、図24や図26と同様に、分散データの中に元データが出現しないようにするものである。そのため、乱数18や乱数20のように、欠落するブロックもダミーブロック(列)で埋めている。
これは、図21の応用になっている。図21では、分散(1)下段のブロック(列)数を、上段のブロック(列)数より数を多くしているが、この多いブロック(列)を乱数とすることで、他の分散データを生成する際に、上段のブロックが裸のまま出現するのを防いでいる。図21の利点はここにある。なお、分散数=N(N=2、3、4・・・)の場合、この余計なブロック(列)は、N−1個用意すればよい。
このようにすると、図26と同様に、乱数列を再度分散して配付する必要がなくなる。しかも図26より、簡単に処理でき、処理時間も短くなる。
図28は、本発明による分散データの生成方法の一例を示す図である。図28も、図24、図26、図27と同様に、分散データの中に元データが出現しないようにするものである。そのため、乱数14のように、欠落するブロックもダミーブロック(列)で埋めている。
図27では分散データの下段に乱数のダミーブロック(列)を配置したが、ここでは、上段にダミーブロック(列)を配置することで同じ効果を生み出している。
また図28では、今までの図の説明にない、乱数15のダミーブロック(列)を配置している。これは分散数を1個増加させる場合に、分散(1)の最後の列が裸で見えるのを防止している。この方法は、他の図24、図26、図27でも利用できる。例えば図24では、列13を乱数とすれば、乱数14がなくても、分散データの中に元データの値が出現せず、かつ分散数を同じものにすることが可能である。
図29は、本発明による分散データの生成方法の一例を示す図である。図29では、図28の乱数14も無くしている。このように欠落するブロック(ここでは列14、列16)の分散(1)での相手側ブロック(ここでは列13、列15)を、乱数のダミーブロック(列)とすることでも、分散データの最後の列が裸で見えるのを防止できる。
同じように、図22の列9、列11、列13も乱数のダミーブロック(列)とするのがよい。
(実施の形態5)
実施の形態5は、実施の形態1〜4と異なり、元データをさらに分割する修正データを用いる場合である。
図30は、本発明による分散データの生成方法の一例を示す図である。これは図10と比べて見ればわかるように、分散データを生成するのに、元データ、または修正データの列1、列2、列3・・・を、2個を1組にして図のように配置したものである。
もっと正確に言えば、元データ、または修正データの各列(列1、列2、列3・・・)を、列1であれば、サブ分割データとして列の丸1と列の丸3、列2であれば、サブ分割データとして列の丸2と列の丸4というように、2個のブロックに分割し、列の丸1、列の丸3、列の丸2、列の丸4・・・の複数のサブ分割データからなる、新たな列として、図10の要領で、分散データを生成したものである。
図10との違いは、各分散データを生成するのに、下段のブロックを、元データ、または修正データの1ブロック(列)サイズ分ではなく、半分(1/2)のブロック(列)サイズでずらしているところである。このようにずらすサイズを変更することも可能である。但しこの場合、1ブロック(列)サイズは2ビット以上でなければならない。
このような操作を行うと、図10と比べて見てわかるように、ダミーブロック(列)を挿入しなくても、より多くの分散データが生成できる。なお、このような操作は、他の図でも利用できる。
図31は、本発明による分散データの生成方法の一例を示す図である。これは図30より分散数を1個多くしたものである。この場合、1個のダミーブロック(列)が挿入されるが、これを見てわかるように、乱数としないといけない部分は、元データ、または修正データの半分のブロック(列)サイズ分で済む。
図32は、本発明による分散データの生成方法の一例を示す図である。これは図10と比べて見ればわかるように、分散データを生成するのに、元データ、または修正データの列1、列2、列3・・・を、3個を1組にして図のように配置したものである。
もっと正確に言えば、元データ、または修正データの各列(列1、列2、列3・・・)を、列1であれば、サブ分割データとして列の丸1と列の丸3と列の丸5、列2であれば、サブ分割データとして列2と列4と列6というように、3個のブロックに分割し、列の丸1、列の丸3、列の丸5、列の丸2、列の丸4、列の丸6・・・の複数のサブ分割データからなる新たな列として、図10の要領で、分散データを生成したものである。
図10との違いは、各分散データを生成するのに、下段のブロックを、元データ、または修正データの1ブロック(列)サイズ分ではなく、1/3分のブロック(列)サイズでずらしているところである。このように、ずらすサイズを1/N(N=2、3、4・・・)のブロック(列)サイズで変更できる。但しこの場合、1ブロック(列)サイズはNビット以上でなければならない。
このような操作を行うと、図10や図30と比べて見てわかるように、ダミーブロック(列)を挿入しなくても、より多くの分散データが生成できる。なお、このような操作は、他の図でも利用できる。
以上のように、実施の形態5では、元データを細かく分割するので、分散データをより多く生成することで、セキュリティを向上させることができる。
(実施の形態6)
実施の形態6は、乱数を用いた他の例を示している。
図33は、本発明による分散データの生成方法の一例を示す図である。これは図10の上段をすべて乱数、すなわち、ダミーブロック(列)としたものである。このような配置にするには、図示しているように、元データの各列の間にダミーブロック(列)を挿入すればよい。
このような操作を行うと、各分散データのデータ量は元データと等価になるものの、各分散データは元データをストリーミング暗号したのと等価になり、閾値未満の分散データから元データを推測するのが困難になる。しかも普通のストリーミング暗号と異なり、復元には、暗号器やシード(初期値)が必要ではないので、乱数として自然(物理)乱数も利用できる。自然(物理)乱数を利用した場合、これはバーナム暗号(Vernam cipher、またはVernam's One−time Pad)と等価になり、完全に安全な分散データとなる。つまり閾値未満の分散データからは絶対に元データを復元されることはなくなる。
図34は、本発明による分散データのフォーマットの一例を示す図である。ここでは、図33で利用した乱数の位置情報を、分散情報に付加している。これにより、元データを復元した場合に、どれが乱数、すなわちダミーブロック(列)がわかるので、正しく元データを復元できるようになる。なお、ダミーブロック(列)を識別する方法はこれに限られるものではなく、例えば、ダミーブロック(列)の番号を記述してもよい。
図35は、本発明による分散データの生成方法の一例を示す図である。これは図33の乱数(乱数A)を、別の乱数(乱数B)でXOR処理している。この乱数Bは、乱数Aの乱数生成器と同じ乱数生成器で生成してもよいが、異なる乱数生成器で生成すれば、セキュリティレベルが向上するので望ましい。
図33で説明したように、各分散データは元データをストリーミング暗号したのと等価であるものの、復元には、暗号器やシード(初期値)が必要ないので、いくらでも複雑な乱数を生成して用いることが可能である。
通常のストリーミング暗号でもこのように2重の乱数で暗号化することは可能であるが、復号時にも同じように2重の乱数で復号化しなくてはならず、時間を要する。本発明の方式であれば、2重、3重といくつの乱数で暗号化しても、復元時の処理は一度で済むため、処理時間が短くて済む。
図36は、本発明による分散データの生成方法の一例を示す図である。これは図33の乱数(乱数A)を、別の乱数(乱数B)でXOR処理している。図35と比べると、乱数Bが飛び飛びの値になっていることがわかる。
図33で説明したように、各分散データは元データをストリーミング暗号したのと等価であるものの、復元には、暗号器やシード(初期値)が必要ないので、自然(物理)乱数などの再現性のない乱数を用いることが可能である。図33で説明したようにすべての乱数を自然(物理)乱数とするのがよいが、組込み機器で、大量の自然(物理)乱数を迅速に生成できるものは多くはない。従って、図36のように乱数生成器で生成した乱数Aを、飛び飛びに発生させた自然(物理)乱数である乱数BでXOR処理するとよい。このような操作を行えば、乱数列が解読されることがなくなり、図32と同様、安全になる。
なお、ここでは乱数列Aの一部のデータも飛ばしているように、取得した自然(物理)乱数の値によって、乱数生成器で生成した一部のデータも飛ばすような処理を行えば安全になるので望ましい。
図37は、本発明による分散データの生成方法の一例を示す図である。これは、乱数、すなわちダミーブロック(列)を適当に元データに挿入した修正データを生成し、これから分散データを生成しているものである。取得した自然(物理)乱数の値によって、元データに挿入する乱数、すなわちダミーブロック(列)の位置を決めるとすると、図32と同様、安全になる。なお、挿入する乱数は、自然(物理)乱数が望ましいが、乱数生成器で生成した乱数であっても安全性は損なわれない。このような乱数、すなわちダミーブロック(列)の配置方法は、分散データのデータ量も削減できてよい。
図38は、本発明による分散データの生成方法の一例を示す図である。これは、乱数を元データから生成している。ここでは列2と列4から乱数1を、列6と列8から乱数3というように、乱数を生成しているが、どのような列、若しくは列の組み合せで乱数を生成するかは任意である。規則的に行ってもよいが、例えば、乱数生成器で生成した乱数や自然(物理)乱数の値によって、乱数1、3、5・・・を生成する列、若しくは、列の組み合せを決めるとよい。
このように、元データから乱数列を生成すれば、乱数列を解読することが不可能となり、閾値未満の分散データから元データを推測できなくなる。繰り返しになるが、これは復元に、暗号器やシード(初期値)が必要ない特徴ゆえにできることである。なお、この生成した乱数を、ここでは図33と同様の方法で利用しているが、図35や図36や図37のような利用の仕方であってもよい。
図39は、本発明による分散データの生成方法の一例を示す図である。これは、図38で乱数を生成する組みが、元データ1個、または2個であったものを、元データ3個まで拡張したものである。このように1つの乱数を生成する元データの数はいくつであってもよい。限度はあるものの、1つの乱数を生成するのに、より多くの元データを利用すれば複雑になり、より安全になる。なお、この生成した乱数を、ここでは図33と同様の方法で利用しているが、図35や図36や図37のような利用の仕方であってもよい。
図40は、本発明による分散データの生成方法の一例を示す図である。これは、図38や図39とは異なり、修正データに用いる乱数Bを生成するのに、元データだけでなく、乱数生成器により生成された乱数A、若しくは自然(物理)乱数Aも活用している。
なお、乱数Aをどの位置で利用するかは、元データと同様に、規則的に行ってもよいが、例えば、乱数生成器で生成した乱数や自然(物理)乱数の値によって決めるとすれば、より安全になるので望ましい。また、乱数も、元データと同様に2重にXOR処理したものを利用してもよい。なお、この生成した乱数を、ここでは図33と同様の方法で利用しているが、図35や図36や図37のような利用の仕方であってもよい。
図41は、本発明による分散データの生成方法の一例を示す図である。これは、図33とは異なる方法で分散データを生成したものである。図33では乱数、すなわちダミーブロック(列)と元データを組み合わせてXOR処理したデータを分散データとしているが、ここでは、乱数、すなわちダミーブロック(列)だけを分散データとしている。そして、この乱数、すなわちダミーブロック(列)でXOR処理されたデータを共有データとして、各分散データ保有者に配布するものである。なお、この共有データは図33の分散(1)と等価である。
なお、元データの復元には、まず乱数列(乱数1、2、3・・・)を求める。閾値以上の分散データが集まれば、今まで説明してきた方法によって、乱数列がわかる。次に、共有データとこの乱数列でXOR処理すれば、元データが復元できる。また、乱数列による分散データの生成方法は、この図41に図示した方法だけでなく、他の図で示す分散データの生成方法も利用可能である。
図42は、本発明による分散データの生成方法の一例を示す図である。ここでは、図41と異なり、乱数列による分散データを生成するのに、乱数Aと乱数Bを利用している。乱数Aと乱数Bは同じ乱数生成器でも異なる乱数生成器から生成してもよい。またどちらか一方、またはどこか一部、またはすべてが自然(物理)乱数であってもよい。
さらに、図33から説明してきた一連の要領も利用可能で、例えば一部の乱数を欠けたものにすることも、一部の乱数を2重、3重の乱数のXOR処理されたデータとすることなども可能である。また、図38や図39のように、乱数の少なくとも一部に元データを関与させれば、乱数が自然(物理)乱数に近いものになり、安全上好ましい。
図43は、本発明による分散データの生成方法の一例を示す図である。ここでは、図41とは異なり、図41の共有データも分散処理して、各分散データ保有者に配布するものである。こうすると、閾値未満の分散データから元データを推測することはより困難になる。
なお、このような構成をとる場合には、配付する分散データの組み合せに注意を要する。例えば、[分散(2)a]と[分散(3)e]や、[分散(3)a]と[分散(1)e]などのような組み合せで、分散データを配布してはならない。[分散(2)a]と[分散(3)e]をXOR処理すれば列1が、同様に、[分散(3)a]と[分散(1)e]をXOR処理すれば列2が復元できてしまう。また、この乱数の生成方法に関しては、図33から説明してきた一連の要領が利用可能である。
図44は、本発明による分散データの生成方法の一例を示す図である。ここでは、図41とは異なり、図41の共有データすべてを共有するのではなく、分散させて共有するようにしている。つまり、閾値以上の分散データが集結すると共有データを生成できるようにしている。例えば、分散(1)と分散(2)が集結すれば、A、B、C、D、E、F、G、Hすべてが揃うので、元データを復元できる。このようにすれば、閾値未満の分散データでは、すべての元データの情報が完全に揃わないので、閾値未満の分散データからは完全に元データを推測できなくなる。
なおこのような構成をとる場合には、配付する分散データの組み合せに注意を要する。例えば、[分散(2)a]とAや、[分散(3)a]とBなどのような組み合せで、分散データを配布してはならない。[分散(2)a]とAをXOR処理すれば列1が、同様に、[分散(3)a]とBをXOR処理すれば列2が復元できてしまう。
なおこの乱数の生成方法に関しては、図33から説明してきた一連の要領が利用可能である。また、図41の共有データの分散方法は、図44の方法に限られるものではなく、いろいろな方法がある。
(実施の形態7)
実施の形態7は、3段の畳み込みの場合を示している。
図45は、本発明による分散データの生成方法の一例を示す図である。今までの図では、分散データを生成するのに、2段(行)に畳み込む操作を行ってきたが、ここでは3段(行)に畳み込む操作を行っている。
はじめに分散(1)の生成方法について説明する。[分散(1)a]は、列1と列2と列3とをXOR処理した値である。同様に、[分散(1)b]は、列4と列5と列6をXOR処理した値である。[分散(1)c]以下も、図に示したように、同様の処理によって計算する。このように、分散(1)は、元データを3段(行)に畳み込んでいる。従って、分散(1)のブロック(列)数は、元データのブロック(列)数の1/3になる。
次に分散(2)の生成方法について説明する。[分散(2)a]は、列1と列3とをXOR処理した値である。一方、[分散(2)b]は、列4と列2と列6とをXOR処理した値である。[分散(2)c]以下も、図に示したように、[分散(2)b]と同様の処理によって計算する。このように、分散(2)は、元データを3段(行)に畳み込んでいる。従って、分散(2)のブロック(列)数は、元データのブロック(列)数の1/3になる。
但し、この図を見てわかるように、分散(2)は、分散(1)の中段に図示したブロック、つまり元データの列2、5、8・・・を、右に1個ずらしてXOR処理した値になっている。従って、分散(2)では元データの列14は計算に利用しない。
次に分散(3)の生成方法について説明する。[分散(3)a]は、列1と列2とをXOR処理した値である。一方、[分散(3)b]は、列4と列5と列3とをXOR処理した値である。[分散(3)c]以下も、図に示したように、[分散(3)b]と同様の処理によって計算する。このように、分散(3)は、元データを3段(行)に畳み込んでいる。従って、分散(3)のブロック(列)数は、元データのブロック(列)数の1/3になる。
但し、この図を見てわかるように、分散(3)は、分散(1)の下段に図示したブロック、つまり元データの列3、6、9・・・を右に1個ずらしてXOR処理した値になっている。従って、分散(C)では元データの列15は計算に利用しない。
次に、分散(4)の生成方法について説明する。[分散(4)a]は、元データの列1そのものである。一方、[分散(4)b]は、列4と列2と列3とをXOR処理した値である。[分散(4)c]以下も、図に示したように、[分散(4)b]と同様の処理によって計算する。このように、分散(4)は、元データを3段(行)に畳み込んでいる。従って、分散(4)のブロック(列)数は、元データのブロック(列)数の1/3になる。
但し、この図を見てわかるように、分散(4)は、分散(1)の中段・下段に図示したブロック、つまり元データの列2、5、8・・・と列3、6、9・・・を右に1個ずらしてXOR処理した値になっている。従って、分散(4)では元データの列14と列15は計算に利用しない。
このように、元データを3段(行)に畳み込む操作を行えば、元データの情報を欠落させることができる。これにより、1個の分散データから元データを復元されることを阻止できるようになる。つまり秘密分散を行うことが可能となる。
しかも、3段(行)に畳み込む場合は、2段(行)に畳み込む場合より、より複雑になるので、セキュリティレベルが向上し、かつ各分散データのデータ量は1/3で済む。
なおここでは、元データを15のブロック(列)に分割しているが、実際は3個以上であれば、いくつのブロック(列)に分割してもよい。また、このブロック(列)のデータサイズは、1ビット単位で、任意のサイズに設定可能である。
なお、すべての列を3段(行)の畳み込むには、ブロック(列)数は3の倍数にする必要があるが、必ずしも元データを3の倍数に分割する必要はない。2段(行)の場合で説明したのと同様であるが、3段(行)に畳み込めないところは、データのない空ブロック(列)とするか、乱数のダミーブロック(列)とすればよい。これはN段(行)(N=2、3、4・・・)の場合でも同様である。
図46は、本発明による元データの復元方法の一例を示す図である。ここでは、図45の4個の分散データのうち、分散(1)、分散(2)、分散(3)を利用して復元を行う場合の一例を示す。つまり図の上側に示した分散(1)、分散(2)、分散(3)の3個の分散データから、図の下側に示した元データを復元する方法を、フローチャートを使って説明する。
(1)[分散(1)a] XOR [分散(2)a]を計算し、その結果より、列2を取得する。(2)[分散(1)a] XOR [分散(3)a]を計算し、その結果より、列3を取得する。(3)[分散(1)a] XOR 列2 XOR 列 3を計算し、その結果より、列1を取得する。(4)[分散(1)b] XOR [分散(2)b] XOR 列 2を計算し、その結果より、列5を取得する。(5)[分散(1)b] XOR [分散(3)b] XOR 列 3を計算し、その結果より、列6を取得する(6)[分散(1)b] XOR 列5 XOR 列 6を計算し、その結果より、列4を取得する。(7)[分散(1)c] XOR [分散(2)c] XOR 列 5を計算し、その結果より、列8を取得する。(8)[分散(1)c] XOR [分散(3)c]
XOR 列 6を計算し、その結果より、列9を取得する。(9)[分散(1)c] XOR 列8 XOR 列 9を計算し、その結果より、列7を取得する。(10)[分散(1)d] XOR [分散(2)d] XOR 列 8を計算し、その結果より、列11を取得する。(11)[分散(1)d] XOR [分散(3)d] XOR 列 9を計算し、その結果より、列12を取得する。(12)[分散(1)d] XOR 列11 XOR 列12を計算し、その結果より、列10を取得する。(13)[分散(1)e] XOR [分散(2)e] XOR 列11を計算し、その結果より、列14を取得する。(14)[分散(1)e] XOR [分散(3)e] XOR 列12を計算し、その結果より、列15を取得する。(15)[分散(1)e] XOR 列14 XOR 列15を計算し、その結果より、列13を取得する。
これにより、元データの列1、列2、列3・・・、列15が復元できる。この説明を見てわかるように、この秘密分散は閾値3の秘密分散になっている。このように、分散データを2段(行)で生成すれば、閾値は2となり、分散データを3段(行)で生成すれば、閾値は3となる。また図45で示したように、分散数は閾値以上に設定できる。
図47は、本発明による分散データの生成方法の一例を示す図である。ここでは図45とは異なる方法で、3段(行)による分散データを生成している。
分散(2´)は、図45の分散(2)の中段を1個右にずらしたものである。すなわち、図45の分散(1)の中段を2個右にずらしたものである。同様に、分散(3´)は、図45の分散(3)の下段を1個右にずらしたものである。すなわち、図45の分散(1)の下段を右に2個右にずらしたものである。同様に、分散(4´)は、図45の分散(4)の中段・下段それぞれを1個右にずらしたものである。すなわち、図45の分散(1)の中段・下段それぞれを右に2個右にずらしたものである。このように、2段(行)による分散データの生成と同様に、各段を、N(N=1、2、3・・・)個ずらしたものも分散データとして使用できる。なお、各段をそれぞれ1個、2個ずらした組み合せも可能である。
図48は、本発明による分散データの生成方法の一例を示す図である。ここでは図45とは異なる方法で、3段(行)による分散データを生成している。
分散(5)は、分散(1)の上段を1個右にずらしたものである。分散(6)は、分散(1)の下段を1個右にずらしたものである。分散(7)は、分散(1)の上段・下段それぞれを1個右にずらしたものである。
このように分散数は自由に設定できる。従って、nを分散数、mを閾値とすれば、本発明は(n、m)型の閾値秘密分散になっている。なお、図45、図47、図48で示した分散データは、閾値3の分散データの一部にすぎない。2段(行)による分散データの生成方法は、この3段(行)による分散データの生成方法にも適用可能なので、様々な分散データを生成できる。例えば、ここではブロック(列)を右にずらしているが、2段(行)による分散データの生成方法で説明したように左にずらすことも可能である。
図49は、本発明による分散データの生成方法の一例を示す図である。これは図45と比べて見ればわかるように、分散データを生成するのに、元データ、または修正データの列1、列2、列3・・・を、2個を1組にして図のように配置したものである。もっと正確に言えば、元データ、または修正データの各列(列1、列2、列3・・・)を、列1であれば列の丸1と列の丸4、列2であれば列の丸2と列の丸5というように、2個のブロックに分割し、列の丸1、列の丸4、列の丸2、列の丸5・・・を新たな列として、図45の要領で、分散データを生成したものである。
図45との違いは、各分散データを生成するのに、中段・下段のブロックを、元データ、または修正データの1ブロック(列)サイズ分ではなく、1/2のブロック(列)サイズでずらしているところである。このように、2段(行)による分散データだけでなく、3段(行)による分散データにおいても、ずらすサイズを変更することも可能である。2段(行)による分散データと同様に、3段(行)による分散データにおいても、1/N(N=2、3、4・・・)でブロック(列)をずらすことが可能である。
このように2段(行)による分散データの生成方法した様々な手法は、この3段(行)による分散データの生成方法にも適用可能である。
図50は、本発明による分散データの生成方法の一例を示す図である。2段(行)による分散データの生成方法の説明で、乱数、すなわちダミーブロック(列)を用いて、閾値未満の分散データから元データを推測することを困難にする、若しくは不可能にする手法を説明したが、これは3段(行)による分散データの生成にも適用できる。図50はその一例である。この図50は、図33の手法を、3段(行)による分散データに適用したものである。
このように2段(行)による分散データの様々な生成方法は、この3段(行)による分散データの生成方法にも適用可能である。
なおこの図からは、もう1つ知見が得られる。各分散データに配置された元データに着目すると理解できるように、各分散データにおける元データの配置方法は、2段(行)による分散データの生成方法そのものである。つまり、2段(行)、すなわち、閾値=2の分散データに、ダミーブロック(列)からなる段(行)を1段(行)付加すれば、閾値=3の分散データが生成できることを意味している。同様に、2段(行)、すなわち、閾値=2の分散データに、ダミーブロック(列)からなる段(行)をN(N=1、2、3・・・)段(行)付加すれば、閾値=2+Nの分散データが生成できる。同様に、M(M=1、2、3・・・)段(行)、すなわち、閾値=Mの分散データに、ダミーブロック(列)からなる段(行)をN(N=1、2、3・・・)段(行)付加すれば、閾値=M+Nの分散データが生成できる。
図51は、本発明による分散データの生成方法の一例を示す図である。これは、図37の手法を、3段(行)による分散データに適用したものである。このように2段(行)による分散データの様々な生成方法は、この3段(行)による分散データの生成方法にも適用可能である。
図52は、本発明による分散データの生成方法の一例を示す図である。これは分散データの3段(行)のうち、2段(行)までが、乱数、すなわち、ダミーブロック(列)になっている。乱数Aと乱数Bは同じ乱数生成器で発生させた乱数とすることも、異なる乱数生成器で発生させた乱数とすることも可能である。また、その一部、若しくはすべてを自然(物理)乱数とすることも可能である。このように段数が増加すると、複数の段で乱数、すなわちダミーブロック(列)を利用することができ、さらに複雑な分散データを生成することが可能となる。
(実施の形態8)
実施の形態8は、4段の畳み込みの場合を示している。
図53は、本発明による分散データの生成方法の一例を示す図である。ここでは4段(行)に畳み込む操作を行っている。
はじめに、分散(1)の生成方法について説明する。[分散(1)a]は、列1と列2と列3と列4とをXOR処理した値である。同様に、[分散(1)b]は、列5と列6と列7と列8とをXOR処理した値である。[分散(1)c]以下も、図に示したように、同様の処理によって計算する。このように、分散(1)は、元データを4段(行)に畳み込んでいる。従って、分散(1)のブロック(列)数は、元データのブロック(列)数の1/4になる。
次に分散(2)の生成方法について説明する。[分散(2)a]は、列1と列3と列4とをXOR処理した値である。一方、[分散(2)b]は、列5と列2と列7と列8とをXOR処理した値である。[分散(2)c]以下も、図に示したように、[分散(2)b]と同様の処理によって計算する。このように、分散(2)は、元データを4段(行)に畳み込んでいる。従って、分散(2)のブロック(列)数は、元データのブロック(列)数の1/4になる。
但し、この図を見てわかるように、分散(2)は、分散(1)の上から2段目に図示したブロック、つまり元データの列2、6、10・・・を、右に1個ずらしてXOR処理した値になっている。従って、分散(2)では元データの列14は計算に利用しない。
次に、分散(3)の生成方法について説明する。[分散(3)a]は、列1と列2と列4とをXOR処理した値である。一方、[分散(3)b]は、列5と列6と列3と列8とをXOR処理した値である。[分散(3)c]以下も、図に示したように、[分散(3)b]と同様の処理によって計算する。このように、分散(3)は、元データを4段(行)に畳み込んでいる。従って、分散(3)のブロック(列)数は、元データのブロック(列)数の1/4になる。
但し、この図を見てわかるように、分散(3)は、分散(1)の上から3段目に図示したブロック、つまり元データの列3、7、11・・・を右に1個ずらしてXOR処理した値になっている。従って、分散(C)では元データの列15は計算に利用しない。
次に分散(4)の生成方法について説明する。[分散(4)a]は、列1と列2と列3とをXOR処理した値である。一方、[分散(4)b]は、列5と列6と列7と列4とをXOR処理した値である。[分散(4)c]以下も、図に示したように、[分散(3)b]と同様の処理によって計算する。このように、分散(4)は、元データを4段(行)に畳み込んでいる。従って、分散(4)のブロック(列)数は、元データのブロック(列)数の1/4になる。
但し、この図を見てわかるように、分散(4)は、分散(1)の上から4段目に図示したブロック、つまり元データの列3、7、11・・・を右に1個ずらしてXOR処理した値になっている。従って、分散(4)では元データの列16は計算に利用しない。
次に分散(5)の生成方法について説明する。[分散(5)a]は、列1と列4とをXOR処理した値である。一方、[分散(5)b]は、列5と列2と列3と列8とをXOR処理した値である。[分散(5)c]以下も、図に示したように、[分散(5)b]と同様の処理によって計算する。このように、分散(5)は、元データを4段(行)に畳み込んでいる。従って、分散(5)のブロック(列)数は、元データのブロック(列)数の1/4になる。
但し、この図を見てわかるように、分散(5)は、分散(1)の上から2段目、および3段目に図示したブロック、つまり元データの列2、6、10・・・、および、列3、7、11・・・を右に1個ずらしてXOR処理した値になっている。従って、分散(5)では元データの列14、および、列15は計算に利用しない。
次に、分散(6)の生成方法について説明する。[分散(6)a]は、列1と列2とをXOR処理した値である。一方、[分散(6)b]は、列5と列6と列3と列4とをXOR処理した値である。[分散(6)c]以下も、図に示したように、[分散(6)b]と同様の処理によって計算する。このように、分散(6)は、元データを4段(行)に畳み込んでいる。従って、分散(6)のブロック(列)数は、元データのブロック(列)数の1/4になる。
但し、この図を見てわかるように、分散(6)は、分散(1)の上から3段目、および4段目に図示したブロック、つまり元データの列3、7、11・・・、および、列4、8、12・・・を右に1個ずらしてXOR処理した値になっている。従って、分散(6)では元データの列15、および、列16は計算に利用しない。
このように、元データを4段(行)に畳み込む操作を行えば、元データの情報を欠落させることができる。これにより、1個の分散データから元データを復元されることを阻止できるようになる。つまり秘密分散を行うことが可能となる。
しかも、4段(行)に畳み込む場合は、2段(行)や3段(行)に畳み込む場合より、より複雑になるので、セキュリティレベルが向上し、かつ各分散データのデータ量は1/4で済む。つまりN(N=1、2、3・・・)段(行)に畳み込めば、データ量は1/Nになる。
なおここでは、元データを16のブロック(列)に分割しているが、実際は4個以上であれば、いくつのブロック(列)に分割してもよい。また、このブロック(列)のデータサイズは、1ビット単位で、任意のサイズに設定可能である。
なお、すべての列を4段(行)の畳み込むには、ブロック(列)数は4の倍数にする必要があるが、必ずしも元データを4の倍数に分割する必要はない。2段(行)や3段(行)の場合で説明したのと同様であるが、4段(行)に畳み込めないところは、データのない空ブロック(列)とするか、乱数のダミーブロック(列)とすればよい。これはN段(行)(N=2、3、4・・・)の場合でも同様である。
図54は、本発明による元データの復元方法の一例を示す図である。ここでは、図53の6個の分散データのうち、分散(1)、分散(2)、分散(3)、分散(4)を利用して復元を行う場合の一例を示す。つまり図の上側に示した分散(1)、分散(2)、分散(3)、分散(4)の4個の分散データから、図の下側に示した元データを復元する方法を、フローチャートを使って説明する。
(1)[分散(1)a] XOR [分散(2)a]を計算し、その結果より、列2を取得する。(2)[分散(1)a] XOR [分散(3)a]を計算し、その結果より、列3を取得する。(3)[分散(1)a] XOR [分散(4)a]を計算し、その結果より、列4を取得する。(4)[分散(1)a] XOR 列2 XOR 列3 XOR 列4を計算し、その結果より、列1を取得する。(5)[分散(1)b] XOR [分散(2)b] XOR 列2を計算し、その結果より、列6を取得する。(6)[分散(1)b] XOR [分散(3)b] XOR 列3を計算し、その結果より、列7を取得する。(7)[分散(1)b] XOR [分散(4)b] XOR 列4を計算し、その結果より、列8を取得する。(8)[分散(1)b] XOR 列6 XOR 列7 XOR 列8を計算し、その結果より、列5を取得する。(9)[分散(1)c] XOR [分散(2)c] XOR 列6を計算し、その結果より、列10を取得する。(10)[分散(1)c] XOR [分散(3)c] XOR 列7を計算し、その結果より、列11を取得する。(11)[分散(1)c] XOR [分散(4)c] XOR 列8を計算し、その結果より、列12を取得する。(12)[分散(1)c] XOR 列10 XOR 列11 XOR 列12を計算し、その結果より、列5を取得する。(13)[分散(1)d] XOR [分散(2)d] XOR 列10を計算し、その結果より、列14を取得する。(14)[分散(1)d] XOR [分散(3)d] XOR 列11を計算し、その結果より、列15を取得する。(15)[分散(1)d] XOR [分散(4)d] XOR 列12を計算し、その結果より、列16を取得する。(16)[分散(1)d] XOR 列14 XOR 列15 XOR 列16を計算し、その結果より、列13を取得する。
これにより、元データの列1、列2、列3・・・、列16が復元できる。この説明を見てわかるように、この秘密分散は閾値4の秘密分散になっている。このように、分散データを2段(行)で生成すれば、閾値は2となり、分散データを3段(行)で生成すれば、閾値は3となり、分散データを4段(行)で生成すれば、閾値は4となる。つまり、分散データをN(N=2、3、4・・・)段(行)で生成すれば、閾値はNとなる。また図53で示したように、分散数は閾値以上に設定できる。
図55は、本発明による分散データの生成方法の一例を示す図である。ここでは図53とは異なる方法で、4段(行)による分散データを生成している。
分散(2´)は、図53の分散(2)の上から2段目を1個右にずらしたものである。すなわち、図53の分散(1)の上から2段目を2個右にずらしたものである。同様に、分散(3´)は、図53の分散(3)の上から3段目を1個右にずらしたものである。すなわち、図53の分散(1)の上から3段目を右に2個右にずらしたものである。同様に、分散(4´)は、図53の分散(4)の上から4段目を1個右にずらしたものである。すなわち、図53の分散(1)の上から4段目を右に2個右にずらしたものである。このように、2段(行)や3段(行)による分散データの生成と同様に、各段を、N(N=1、2、3・・・)個ずらしたものも分散データとして使用できる。なお、各段をそれぞれ1個、2個、3個ずらした組み合せも可能である。
このように分散数は自由に設定できる。従って、nを分散数、mを閾値とすれば、本発明は(n、m)型の閾値秘密分散になっている。
なお、図53、図55で示した分散データは、閾値4の分散データの一部にすぎない。2段(行)や3段(行)による分散データの様々な生成方法は、この4段(行)による分散データの生成方法にも適用可能なので、様々な分散データを生成できる。例えば、ここではブロック(列)を右にずらしているが、2段(行)による分散データの生成方法で説明したように左にずらすことも可能である。
このように、N(N=2、3・・・)段(行)による分散データの生成方法にも、2段(行)や3段(行)による分散データの生成方法の手法が活用できる。また、ずらすサイズを変更したり、ダミーブロック(列)を利用したりする手法など、それ以外の様々な手法も、2段(行)や3段(行)による分散データの生成方法と同様、N(N=2、3・・・)段(行)による分散データの生成方法に活用できる。
図56は、本発明による分散データの生成方法の一例を示す図である。これは図50を再度説明するものである。各分散データに配置された元データに着目すると理解できるように、各分散データにおける元データの配置方法は、2段(行)による分散データの生成方法そのものである。つまり、2段(行)、すなわち閾値=2の分散データに、ダミーブロック(列)からなる段(行)を2段(行)付加すれば、閾値=4の分散データが生成できることを意味している。
(実施の形態9)
実施の形態9は、7以上の分散データを生成した場合を示している。
図57から図61は、本発明による分散データの生成方法の一例を示す図である。図57は閾値2における分散データの生成方法の一例を示す図、図58は閾値3における分散データの生成方法の一例を示す図、図59は閾値4における分散データの生成方法の一例を示す図、図60は閾値5における分散データの生成方法の一例を示す図、図61は閾値6における分散データの生成方法の一例を示す図の分散データの作成方法の一例を示している。
ここで灰色の部分、つまり、列aから列tは、列に並ぶすべてのデータをXOR処理したデータである。例えば、図57の分散(1)の列aは、元データ13と元データ2をXOR処理したデータであり、以下、同様に、列bは、元データ15と元データ4をXOR処理したデータ、列cは、元データ17と元データ6をXOR処理したデータである。図58以降も同様で、例えば、図58の分散(1)の列aは、元データ19、2、3をXOR処理したデータであり、以下、同様に、列bは、元データ22、5、6をXOR処理したデータ、列cは、元データ25、8、9をXOR処理したデータである。
また灰色でない部分、つまり列a以前に記述している値は、その分散データが保持する元データそのものであり、この値はXOR処理さていない。なおこのXOR処理されない元データは、本当のオリジナルデータの頭に追加した乱数列とするのが望ましい。つまり、本当のオリジナルデータに、必要な分(裸で見える元データの数分)だけ、頭に乱数列を加え、これを元データとすればよい。復元する際は、復元後に、この追加した乱数列を削除すればよい。どの程度の乱数列を加えたかは、各分散データのヘッダ情報に格納すればわかる。
図57から図61を見てわかるように、閾値2の分散データを生成するには、2段(2行)に分けてXOR処理すればよく、同様に、閾値3、閾値4、閾値5・・・の分散データを生成するには、3段、4段、5段に分けてXOR処理すればよい。
但し、各分散データの各列の数字の組み合わせに同じものが生じないように配置する必要がある。図57では1段目(上段)を右に1個ずつずらしてこれを実現している。これはあくまで一例であり、1段目(上段)を右に2、3・・・とずらしても、また左に1、2、3・・・とずらしてもよい。また逆に2段目(下段)を上段のようにずらしてもよいし、また上段を右に、下段を左にずらしてもよい。
なお、図57では分散(1)の1段目を2段目に比べ、左に6個ずらした位置をスタート地点としているが、この1段目のスタート地点は任意である。また他の図でも同様であるが、元データは1、2、3・・・と並んでいるように図示しているが、この並びも任意である。
図58では1段目(上段)を右に1個ずつずらし、3段目(下段)を左に1個ずつずらすことで、各分散データの各列の数字の組み合わせに同じものが生じないように配置している。これも前の説明と同様で、このような組み合わせ方法はいくらでも存在する。例えば図62のように、1段目(上段)を左に2個ずつ、2段目を左に1個ずつずらしてもよい。なお、図57と同様に、分散(1)の1段目を2、3段目に比べ、左に6個ずらした位置をスタート地点としているが、この1段目のスタート地点は任意である。
図59では1段目(上段)を右に2個ずつ、2段目を右に1個ずつらし、4段目(下段)を左に1個ずつずらすことで、各分散データの各列の数字の組み合わせに同じものが生じないように配置している。これも前の説明と同様で、このような組み合わせ方法はいくらでも存在する。例えば図63のように、1段目(上段)を左に3個ずつ、2段目を左に2個ずつ、3段目を左に1個ずつずらしてもよい。
なお、図57、図58と同様に、分散(1)の1段目を3、4段目下段に比べ、左に12個ずらした位置をスタート地点としているが、この1段目のスタート地点は任意である。同様に2、3、4段目のスタート地点も任意である。これは閾値5以降の場合も同様である。
図60、図61も図57から図59と同様で、格段のずらし方を変えることで、各分散データの各列の数字の組み合わせに同じものが生じないように配置している。これも前の説明と同様で、このような組み合わせ方法はいくらでも存在する。
重要なのは、格段でずらす個数を変えることである。同じ個数でずらすものがあると、復元できなくなる。但し、ずらす方向は右と左の2つがあるので、右方向と左方向で同じ個数ずらした段(行)は共存できる。例えば左方向にN(N=1、2、3・・・)個ずらした段と右方向にN個ずらした段の組み合わせは可能である。
なお各分散データで、ずらさない段を1個だけなら配置できる。但し、これは必ず配置しなければならないというものではない。
図64は、本発明による分散データの生成方法の一例を示す図である。図57から図61は分散数が7の場合の効果的な分散データの作成方法を図示しているが、ここでは、閾値4のケースで、分散数が8の場合の効果的な分散データの作成方法を図示している。
図64を同じ閾値4である図59と見比べるとわかるように、1段目(上段)の元データの数(灰色でない部分)が、分散数7の図59では、6の倍数になっているのに対し、分散数8の図64では、7の倍数になっている。図57から図61のようなデータ配置をとり、分散数をN(N=1、2、3・・・)とした場合、このように、1段目(上段)の元データの数をN−1の倍数にすればよいことがわかる。
図65は、本発明による分散データの生成方法の一例を示す図である。ここでは元データ2をシード値としてこれを乱数生成器に挿入し、この乱数生成が発生した乱数列A、BC・・・を各列a、b、c・・・のそれぞれとXOR処理している。こうすることで、元データ列に特徴的なデータが連続して現れる場合に、これを隠匿できるようになる。
なおここでは元データ2の少なくとも一部(元データ2に何らかのデータ処理を施した値を含む)をシード値としているが、シード値は、どの元データ、あるいは複数の分割データであってもよい。またシード値は複数の元データから生成されるとすることも可能である。少なくともシードにする元データは、各分散データの灰色でない部分に存在する元データでなければ、安全である。ここでは元データ2をシードとしているので、元データ2がある列以降(ここでは列a以降)の列に乱数列とのXOR処理を行うことが可能である。
このような分散データから元データを復元する場合は、まずシード値となっている元データを復元する。そして、分散処理の場合と同様に、その元データをシード値として乱数生成器に乱数列を発生させ、その乱数列と各分散データの各列(シードとなった元データがある列より後の列)のデータとをXOR処理し、それから復元を行えばよい。
このように、複数の分割データから少なくとも1つの分割データを用いて乱数データを算出するので、乱数のシードを予め準備する必要がないので、簡易に乱数を発生させることができる。
図66は、本発明による分散データの生成方法の一例を示す図である。今までの説明では、元データのデータ数に関して説明を行っていない。閾値2では2段(行)、閾値3では3段(行)というようにデータを配置するので、元データのデータ数はそれぞれ2の倍数、3の倍数というように、閾値の倍数になっていなければならない。しかし本当のオリジナルデータのデータ数は、このように、閾値の倍数になっているとは限らない。
そこで、オリジナルデータのデータ数が閾値の倍数になっていない場合には、オリジナルデータの最後にダミーデータを加えて元データを作り、元データのデータ数を閾値の倍数にする処理が必要である。復元の際は、このダミーデータを除去しなくてはならないので、従って、その数が把握できなくてはならない。この情報を各分散データのヘッダ情報に格納し、復元の際はこの情報を読み取って、ダミーデータを除去するとすることも可能であるが、図66のように「*A」と記した部分にその数を記述し、復元の際に、このデータを見て、ダミーデータを除去するとした方が、プログラムが簡単になりよい。
なお、ここでは、「*A」の部分にダミーデータのデータ数情報を格納するとして説明しているが、これは元データのどの部分に挿入されても構わない。
(実施の形態10)
図67は、分散データの生成方法を効果的に行う一例の概略図である。斜線部分は、図57〜図65で灰色でない部分に相当し、分散データが保持する元データを格納する部分である。その斜線部分の右側部分が、図57〜図65の灰色部分に相当し、各データをXOR処理した値を格納する部分である。なお、灰色になっているところは、行の中段を現している。但し、偶数行の場合は、上段を下段より1段多くとり、中段を定めるものとする。従って、2行の場合は、上段・中段だけで構成され、下段はない。
分散データを作成するにあたっては、閾値2では2行、閾値3では3行と言うように、閾値の数と同じ数の行(段)を用意する。この分散データを更にストリーミング暗号するなど、閾値を超える行(段)に擬似乱数をセットするなどして利用することも可能であるが、これは本質的な話ではないので、説明を簡略化するために割愛する。
はじめに分散データを生成する際に、移動しない行(段)を決める。ここでは、この移動しない行(段)を灰色で示した中段とする。閾値2の分散データを生成する場合は、この中段の上に、1行(段)追加する。次に、閾値3の分散データを生成する場合は、閾値2の行(段)、即ち上段・中段の下に、1行(段)追加する。同様に、閾値4の分散データを生成する場合には、閾値3の行(段)の最上段の上に更に1行(段)追加し、閾値5の分散データを生成する場合には、閾値4の行(段)の最下段の下に更に1行(段)追加する。以降も同様に、閾値が偶数であれば、1つ前の閾値の行(段)の最上段の上に更に1行(段)追加し、閾値が奇数であれば、1つ前の閾値の行(段)の最下段の下に更に1行(段)追加する。このように、中段を基点に上、下、上、下の順に行(段)を追加し、利用する行を用意する。
そして、図57〜図65で説明したように、異なる分散データを作成する度に、上段はデータを右側に、下段はデータを左側に、また、中段に隣接する上・下段は1列ずれ、それに隣接する次の上・下段は2列ずれるというように、中段からの距離(行数)の数だけ列をずらすものとする。
なおここでは、以上のような分散データ作成方法を示しているが、実際は、閾値の数の増加に対して行(段)をどのように追加しても良いし、各々の行(段)がどちらに、どれだけずれても構わない。図48に示したように、異なる分散データで、同じ方向に同じ列数ずれる行(段)が複数あっても良いし、移動しない(ずれない)行(段)が複数あっても良い。しかし、そのように、同じ方向に、同じ列数ずれる行(段)が存在する分散データ作成方法では、任意に分散数を決めるのが難しい上、閾値未満の分散データを入手できた場合に、いくつかの行(段)が復元されてしまうセキュリティ上の問題が発生する。例えば、閾値3である図48で、分散(1)と分散(2)の2つの分散データが入手できれば、上段に配置された元データ1、4、7、・・・、13は容易に復元されてしまう。
従って、各行(段)で、同じ方向なら異なる数だけ列をずらす方が、分散数も任意に設定でき、かつセキュリティも向上する。また、ここで説明した分散データ作成方法のように、ずらす列数をなるだけ少なくすれば、斜線部分のデータ数が減り良い。図29で説明したように、XOR処理しないデータは、セキュリティ上、乱数を配置する。そのため、斜線部分のデータ数をできるだけ減らした方が、分散データの生成・復元も速く、記憶容量も小さくて済み、効率的である。
図68は、図67の補足である。図68では、図67で説明したような方法で分散データを作成した場合、斜線部分の列数がいくつになるかを示している。新たな分散データを作成する度に、中段に隣接する上・下段は1列ずれるので、中段に隣接する上・下段に対しては、斜線部分で、式(1)の数の列が少なくとも必要になる。
実際の分散数−1・・・(1)
この列数は最低の数であり、これ以上の列数を用意することには問題はない。例えば分散数が6であれば、中段に隣接する上・下段に対しては、斜線部分で最低5列必要であるが、6列以上であっても分散データは作成可能である。次の図69では、そのような分散データ作成方法を示している。
以上のことを逆に言えば、中段に隣接する上・下段に対して用意する斜線部分の列数は、式(2)であり、実際の分散数は、この最大分散可能数の範囲内で決定すれば良い。
最大分散可能数(MAXの分散数)−1・・・(2)
なお、中段に隣接する上・下段が利用する斜線部分の列をここではエリアと呼ぶ。つまり、中段に隣接する上・下段(閾値2、3のケース)は1エリア分(1は、上段の行数に等しい)の列数を利用する。
閾値が4以上になった場合は、異なる分散データを作成する度に、2、3・・・と移動する行(段)が現れるが、この場合も閾値2、3と同様に、斜線部分には上段の行数に等しいエリア数を用意すれば良い。例えば閾値4、5であれば、2エリア、閾値6、7であれば3エリアを用意すれば良い。従って実際に必要となる斜線部分の列数は式(3)のようになる。
上段の行数×(最大分散可能数−1)・・・(3)
なお、斜線の列数がいくつ必要かは、データの配置方法によっても異なるものなので、ここで説明した列数の求め方はあくまで一例である。
図69は、閾値5、分散数6のケースでの分散データ作成方法の一例を詳細、かつ具体的に示した図である。図67、68と同様に、斜線部分は、図57〜図65で灰色でない部分に相当し、分散データが保持する元データを格納する部分(元データがそのままの値で見えてしまう原データ部)である。その斜線部分の右側部分が、図57〜図65の灰色部分に相当し、各データをXOR処理した値を格納する部分である。
また説明を分かりやすくするために、ここでは、元データを125個のブロック(領域)に分けるものとする。このように、実際のブロック数は、閾値の倍数であるのが好ましいが、必ずしもこれに限定されるものではない。足りないブロックは空白データとするかダミーデータで埋めることも可能であり、元データをいくつのブロックに分割するかは、本質的な議論ではない。
元データを1,2,3・・・125のブロックに分割したら、ブロック番号の若い順に、最上段から最下段へと各ブロックを配置して各分散データを生成していく。つまり、ブロック1は最上段に、ブロック2は次の上段に、ブロック3は中段に、ブロック4は次の下段に、そしてブロック5は最下段に配置する。全行(段)に配置し終えたら、次はその右隣の列に、同様に、ブロック番号の若い順に、最上段から最下段へと各ブロックを配置していく。つまり、ブロック6はブロック1と同じ行(最上段)の1列右隣に、ブロック7はブロック2と同じ行(段)の1列右隣に、ブロック8はブロック3と同じ行(中段)の1列右隣に、ブロック9はブロック4と同じ行(段)の1列右隣に、そしてブロック10はブロック5と同じ行(最下段)の1列右隣に配置する。同様の操作を続け、ブロック125までを配置していく。
なお、中段を除いて、各分散データで、一番はじめのブロックを配置する各行(段)の列の位置は異なる。1番目の分散データである分散データ(1)の最上段においては、はじめのブロックを配置する列の位置は、斜線部分の一番左側、つまり、XOR処理を行う一番左側の列(列a)から2エリア左側に配置するものとする。なおここでは、最大分散数を7としているので、1エリアは6列で構成されている。また、分散データ(1)の次の上段においては、はじめのブロックを配置する列の位置は、XOR処理を行う一番左側の列から1エリア左側に配置するものとし、中断から最下段においては、はじめのブロックを配置する列の位置は、XOR処理を行う一番左側の列とする。
このような配置をする理由は、なるだけ原データ部に配置されるデータ数を少なくするためであり、実際は、はじめの列の位置をどこにしても構わない。
次に、2番目の分散データである分散データ(2)であるが、最上段においては、はじめのブロックを配置する列の位置は、分散データ(1)の同じ行(最上段)の右2列横に配置する。また、分散データ(2)の次の上段においては、はじめのブロックを配置する列の位置は、分散データ(1)の同じ行(段)の右1列横に配置する。続く中段のはじめのブロックを配置する列の位置は、分散データ(1)と同様、XOR処理を行う一番左側の列とする。続く下段における配置位置は、上段と向きが逆になる。つまり、分散データ(2)の最下段においては、はじめのブロックを配置する列の位置は、分散データ(1)の同じ行(最下段)の左2列横に配置する。また、分散データ(2)の次の下段においては、はじめのブロックを配置する列の位置は、分散データ(1)の同じ行(段)の左1列横に配置する。
この操作を同様に行い、分散データ(3),(4),(5),(6)を生成する。なおここでは先に記したように、最大分散数を7としているので、分散データ(6)において、各上段のはじめのブロックは、XOR処理を行う一番左側の列に並ばない。また、下段・最下段はXOR処理を行う一番左側の列から1エリア先、2エリア先に到達しない。もし最大分散数を6としていれば、分散データ(6)において、各上段のはじめのブロックは、XOR処理を行う一番左側の列に並び、下段・最下段はXOR処理を行う一番左側の列から1エリア先、2エリア先に到達して、各段のはじめのブロックの配置位置は、分散データ(1)と逆になる。
ここで分散数6の分散データを作成するのに、わざわざ最大分散数を7としているのは、XOR処理を簡略化するためである。分散データ(1)〜(6)を見て分かるように、各上段・各下段のブロック数は、中段のブロック数より必ず大きい。従って、各列で、XOR処理するブロック数を割り出す方法は共通化でき簡単である。一方、ここで分散データ(7)を作成すれば、分散データ(7)の最上段・上段のブロック数は、中段より小さな値となるため、XOR処理するブロック数を割り出すのに、これだけ別処理しなければならない。従って、本当に分散させたい数に1を加えた数を最大分散数とするのが好ましい。
なおここでは、分散データ(1)〜(6)の順に、順々に各行(段)のブロックを、右・左方向に、図67の要領で列をずらして配置しているが、図67で説明したように、実際は、各々の行(段)がどちらに、どれだけずれても構わない。しかし、ここで説明したように、すべての列でブロックの組合せが異なるような配置をとれば、分散数を容易に増加させることが可能でセキュリティ上も好ましい。また、原データ部のデータ数を削減できて良い。
以上のように配置すると、分散データ(1)は、原データ部に、ブロック1,6・・・56と、ブロック2,7,・・・27が配置されることになる。なお、このブロックの並び順には意味はない。
また、分散データ(1)のXOR部の列aには、式(4)の計算結果が配置される。
“61” XOR “32” XOR “3” XOR “4” XOR “5”・・・(4)
ここでアンダーバーが付いた数字は、ブロックのインデックスを意味する。例えば、“61”はブロック61を意味する。以下の説明でも同じ表記を用いる。同様に列bには、式(5)の計算結果が配置される。
“66” XOR “37” XOR “8” XOR “9” XOR “10”・・・(5)
以下、列c,列d・・・列yで同様にXOR処理が行われ、その計算結果が各々の列に配置される。
つまり、分散データ(1)は、ブロック1,6・・・56とブロック2,7,・・・27のそのままの値と、各列でXOR処理された、列a,列b・・・列yの値で構成される。この各値の並び順には意味はないが、図69に示した順で各値を配置しておくと復元処理を簡単に行えるので好ましい。
なお、分散データ(1)を見ればわかるように、ブロック1,6・・・56とブロック2,7,・・・27はそのままの値が見えている。また、列n〜列yまでは5未満のブロックでXOR処理しているため、他の列に比べ、値を推測する組み合わせが減少しており、セキュリティ度が低くなっている。
従って、元データのブロック1〜ブロック60、及びブロック66〜ブロック125は乱数とするのが好ましい。正確に言えば、ブロック3やブロック66などのように、この乱数とするブロックの中にも、乱数にしなくても安全なブロックは存在するが、その安全なブロックの位置を計算するのが面倒であるので、このようにざっくりと処理するのが簡単で良い。
つまり、5ブロック分の本当に秘匿したいデータ(元データ)をブロック61〜65に配置し、ブロック1〜125のその他のブロックに乱数を配置することで元データを生成し、その元データから分散データを生成させれば、セキュリティ度が向上し、かつ簡単に処理できて良い。復元においては、元データから乱数のブロックを取り除き、5ブロック分の本当に秘匿したいデータを取り出せば良い。なお、本当に秘匿したいデータのブロックへの配置は、必ずしも本当に秘匿したいそのデータの並び通りに行う必要はない。
本当に秘匿したいデータが5ブロック分より多い場合は、ブロック61〜65以降にその本当に秘匿したいデータのブロックを追加するだけで良く、乱数のブロックはこれ以上必要ない。
なお、1ブロックのデータサイズであるが、そのサイズは1ビットでも1バイトでも4バイトでも良く、データサイズは任意である。但し、1度で大量にXOR処理すれば、処理速度が向上するので、利用するCPUにおいて、XOR処理できる最大のデータサイズを、1ブロックのデータサイズとするのが好ましい。
なお、本当に秘匿したいデータをブロックで分割した際に、1ブロック未満になる場合には、1ブロックになるように、ダミーデータを追加し、復元した際に除去するようにすれば良い。その追加したダミーデータの位置やサイズなどの情報はどこかのブロックか、またはヘッダ情報に記述しておくなどすれば良い。
同じく本当に秘匿したいデータが5ブロック分に足りない場合にも、同様にダミーデータを追加して、つまりダミーブロックを追加して5ブロックにすれば良い。本当に秘匿したいデータが6ブロック以上で、同様に5ブロック刻みにならない場合も同様である。なおここでは、閾値が5なので5ブロック刻みとしているが、閾値N(N=1,2・・・)であればNブロック刻みとなる。なお、閾値Nにおける本当に秘匿したいデータは必ずしもこのようにNブロック刻みにする必要はなく、1ブロック刻みとしても問題はない。例えば、ブロック61〜65の内、1ブロックのみが本当に秘匿したいデータで、あとの残りすべてがダミーデータであっても構わない。
図70は、分散データの復元方法を効果的に行う一例の概略図である。ここでは図69の分散データ(1)〜(5)を利用する場合を例にとり説明を行う。なお、復元方法はこれに限られるものではないが、ここで説明する方法を用いれば、復元のプログラム処理を簡便にできる。
はじめに復元に用いられる分散データを通し番号の若い順に並びかえる。ここで通し番号とは、図69で分散データに付与した(1)〜(6)の番号のことで、通し番号の若い分散データほど、ブロック1が左側に位置する。ここでは、例として図69の分散データ(1)〜(5)を利用するので、そのまま分散データ(1)〜(5)の順で上から並べる。
復元処理は、通し番号の一番若い分散データを用いて、一番目の行(最上段)を復元する。そして、次に若い分散データを用いて、次の行(段)を復元する。同様に、その次に若い分散データを用いて、次の行(段)を復元するというように、分散データの通し番号順に、上から復元する行(段)を決定する。従ってここでは、分散データ(1)で最上段を、分散データ(2)で上段を、分散データ(3)で中段を、分散データ(4)で下段を、分散データ(5)で最下段の復元を行う。
図71は、図70を更に詳細に示した図である。ここでは復元の実際の順番を特に詳しく説明する。
はじめに中段を復元する分散データ(3)に注目する。分散データ(3)では、はじめにブロック3を復元しないといけないが、これを復元するには、ブロック14、25、22、41の値が必要になる。これらブロックは、分散データ(1)〜(5)のいずれかの斜線部分に存在するので、そのままの値を利用する。従ってブロック3は、式(6)を計算することによって求められる。
《分散データ(3)列a》 XOR “14” XOR “25” XOR “22” XOR “41”・・・(6)
なおここで、《分散データ(3)列a》とは、分散データ(3)の列aの値を意味する。以降の説明でも同様の表記を用いる。
次も同じく、中段を復元する分散データ(3)に注目する。分散データ(3)では、次にブロック8を復元しないといけないが、これを復元するには、ブロック19、30、27、46の値が必要になる。これらブロックは、分散データ(1)〜(5)のいずれかの斜線部分に存在するので、そのままの値を利用する。従ってブロック8は、式(7)を計算することによって求められる。
《分散データ(3)列b》 XOR “19” XOR “30” XOR “27” XOR “46”・・・(7)
次も同じく、中段を復元する分散データ(3)に注目する。分散データ(3)では、次にブロック13を復元しないといけないが、これを復元するには、ブロック24、35、32、51の値が必要になる。ブロック35、51は、分散データ(1)〜(5)のいずれかの斜線部分に存在するので、そのままの値を利用する。一方、ブロック24、32は分散データ(1)〜(5)のいずれの斜線部分にも存在しないので復元して値を求めなくてはならない。
まずブロック32の復元方法を説明する。この復元は図70で説明したように、上段を復元する分散データ(2)を用いて行う。分散データ(2)で、ブロック32を復元するには、ブロック8、14、20、56の値が必要になる。ここでブロック8はすでに復元済みである。また、ブロック14、20、56は、分散データ(1)〜(5)のいずれかの斜線部分に存在するので、そのままの値を利用する。従ってブロック32は、式(8)を計算することによって求められる。
《分散データ(2)列b》 XOR “8” XOR “14” XOR “20” XOR “56”・・・(8)
次にブロック24の復元方法を説明する。この復元は図70で説明したように、下段を復元する分散データ(4)を用いて行う。分散データ(4)で、ブロック24を復元するには、ブロック8、40、22、36の値が必要になる。ここでブロック8はすでに復元済みである。また、ブロック40、22、36は、分散データ(1)〜(5)のいずれかの斜線部分に存在するので、そのままの値を利用する。従ってブロック24は、式(9)を計算することによって求められる。
《分散データ(4)列b》 XOR “8” XOR “40” XOR “22” XOR “36”・・・(9)
従って、分散データ(3)のブロック13を復元するのに必要なブロック24、35、32、51の値はすべて既知となるので、ブロック13は、式(10)を計算することによって求められる。
《分散データ(3)列c》 XOR “24” XOR “35” XOR “32” XOR “51”・・・(10)
次も同じく、中段を復元する分散データ(3)に注目する。分散データ(3)では、次にブロック18を復元しないといけないが、これを復元するには、ブロック29、40、37、56の値が必要になる。ブロック40、56は、分散データ(1)〜(5)のいずれかの斜線部分に存在するので、そのままの値を利用する。一方、ブロック29、37は分散データ(1)〜(5)のいずれの斜線部分にも存在しないので復元して値を求めなくてはならない。
まずブロック37の復元方法を説明する。この復元は図70で説明したように、上段を復元する分散データ(2)を用いて行う。分散データ(2)で、ブロック37を復元するには、ブロック13、19、25、61の値が必要になる。ここでブロック13はすでに復元済みである。また、ブロック19、25は、分散データ(1)〜(5)のいずれかの斜線部分に存在するので、そのままの値を利用する。一方、ブロック61は分散データ(1)〜(5)のいずれの斜線部分にも存在しないので復元して値を求めなくてはならない。
ブロック61の復元は、図70で説明したように、最上段を復元する分散データ(1)を用いて行う。分散データ(1)で、ブロック61を復元するには、ブロック3、4、5、32の値が必要になる。これらのブロックは、すでに復元済みか、あるいは分散データ(1)〜(5)のいずれかの斜線部分に存在するので、ブロック61は、式(11)を計算することによって求められる。
《分散データ(1)列a》 XOR “3” XOR “4” XOR “5” XOR “32”・・・(11)
従って、ブロック37は、式(12)を計算することによって求められる。
《分散データ(2)列c》 XOR “13” XOR “19” XOR “25” XOR “61”・・・(12)
次にブロック29の復元方法を説明する。この復元は図70で説明したように、下段を復元する分散データ(4)を用いて行う。分散データ(4)で、ブロック29を復元するには、ブロック13、45、27、41の値が必要になる。ここでブロック13はすでに復元済みである。また、ブロック27、41は、分散データ(1)〜(5)のいずれかの斜線部分に存在するので、そのままの値を利用する。一方、ブロック45は分散データ(1)〜(5)のいずれの斜線部分にも存在しないので復元して値を求めなくてはならない。
ブロック45の復元は、図70で説明したように、最下段を復元する分散データ(5)を用いて行う。分散データ(5)で、ブロック45を復元するには、ブロック3、24、12、21の値が必要になる。これらのブロックは、すでに復元済みか、あるいは分散データ(1)〜(5)のいずれかの斜線部分に存在するので、ブロック45は、式(13)を計算することによって求められる。
《分散データ(5)列a》 XOR “3” XOR “24” XOR “12” XOR “21”・・・(13)
従って、ブロック29は、式(14)を計算することによって求められる。
《分散データ(4)列c》 XOR “13” XOR “45” XOR “27” XOR “41”・・・(14)
従って、中段のブロック18は、式(15)を計算することによって求められる。
《分散データ(3)列d》 XOR “29” XOR “40” XOR “37” XOR “56”・・・(15)
次も同じく、中段を復元する分散データ(3)に注目する。分散データ(3)では、次にブロック23を復元しないといけないが、これを復元するには、ブロック34、45、42、61の値が必要になる。ブロック45、61は、すでに復元済みである。一方、ブロック34、42は分散データ(1)〜(5)のいずれの斜線部分にも存在しないので復元して値を求めなくてはならない。
まずブロック42の復元方法を説明する。この復元は図70で説明したように、上段を復元する分散データ(2)を用いて行う。分散データ(2)で、ブロック42を復元するには、ブロック18、24、30、66の値が必要になる。ここでブロック18、24、30は、復元済みか、あるいは分散データ(1)〜(5)のいずれかの斜線部分に存在する。一方、ブロック66は分散データ(1)〜(5)のいずれの斜線部分にも存在しないので復元して値を求めなくてはならない。
ブロック66の復元は、図70で説明したように、最上段を復元する分散データ(1)を用いて行う。分散データ(1)で、ブロック66を復元するには、ブロック8、9、10、37の値が必要になる。これらのブロックは、すでに復元済みか、あるいは分散データ(1)〜(5)のいずれかの斜線部分に存在するので、ブロック66は、式(16)を計算することによって求められる。
《分散データ(1)列b》 XOR “8” XOR “9”XOR “10” XOR “37”・・・(16)
従って、ブロック42は、式(17)を計算することによって求められる。
《分散データ(2)列d》 XOR “18” XOR “24” XOR “30” XOR “66”・・・(17)
次にブロック34の復元方法を説明する。この復元は図70で説明したように、下段を復元する分散データ(4)を用いて行う。分散データ(4)で、ブロック34を復元するには、ブロック18、50、32、46の値が必要になる。ここでブロック18、32、46は、復元済みか、あるいは分散データ(1)〜(5)のいずれかの斜線部分に存在する。一方、ブロック50は分散データ(1)〜(5)のいずれの斜線部分にも存在しないので復元して値を求めなくてはならない。
ブロック50の復元は、図70で説明したように、最下段を復元する分散データ(5)を用いて行う。分散データ(5)で、ブロック50を復元するには、ブロック8、29、17、26の値が必要になる。これらのブロックは、すでに復元済みか、あるいは分散データ(1)〜(5)のいずれかの斜線部分に存在するので、ブロック50は、式(18)を計算することによって求められる。
《分散データ(5)列b》 XOR “8” XOR “29” XOR “17” XOR “26”・・・(18)
従って、ブロック34は、式(19)を計算することによって求められる。
《分散データ(4)列d》 XOR “18” XOR “50” XOR “32” XOR “46”・・・(19)
従って、中段のブロック23は、式(20)を計算することによって求められる。
《分散データ(3)列e》 XOR “34” XOR “45” XOR “42” XOR “61”・・・(20)
以上のような手順で、次々と復元を行えば、元データを完全に復元可能である。
この手順は次のように一般化すると、より効率的に復元が行える。復元は、最上段、最下段、上段、下段、中段と言うように、上・下・次の上・下(閾値が偶数の場合、最後の下段はない。また閾値が4以上でなければ、次の上・下はない)、そして最後に中段という手順で復元を行う。従って、ここでは、分散データ(1)、(5)、(2)、(4)、(3)の順で逐次復元を行う。そしてその一連の復元が済めば、同様の手順で次の列、次の列と復元を行っていく。
但し、各行(段)で復元を開始する列の位置は異なる。中段に隣接する上段を復元する分散データは、中段を復元する分散データより、式(21)の分の列だけ、左にずれた位置で復元が開始される。
1列×(中段を復元する分散データの通し番号−上段を復元する分散データの通し番号)・・・(21)
また、同様に、中段に隣接する下段を復元する分散データは、中段を復元する分散データより、式(22)の分の列だけ、左にずれた位置で復元が開始される。
1列×(下段を復元する分散データの通し番号−中段を復元する分散データの通し番号)・・・(22)
同様に先の上段に隣接する次の上段を復元する分散データは、先の上段を復元する分散データより、2列×(先上段を復元する分散データの通し番号−次上段を復元する分散データの通し番号)分の列だけ、左にずれた位置で復元が開始される。また、同様に、先の下段に隣接する次の下段を復元する分散データは、先の上段を復元する分散データより、2列×(次下段を復元する分散データの通し番号−先下段を復元する分散データの通し番号)分の列だけ、左にずれた位置で復元が開始される。以下、同様である。
以上より、ここでは、分散データ2の復元開始位置は、分散データ3より式(23)の列だけ左にずれる。
1列×(3−2)=1列・・・(23)
同様に、分散データ4の復元開始位置は、分散データ3より式(24)の列だけ左にずれる。
1列×(4−3)=1列・・・(24)
また、分散データ1の復元開始位置は、分散データ2より式(25)の列だけ左にずれる。
2列×(2−1)=2列・・・(25)
従って、分散データ1の復元開始位置は、中段を復元する分散データ3より式(26)の列だけ左にずれる。
2列+1列=3列・・・(26)
同様に、分散データ5の復元開始位置は、分散データ4より式(27)の列だけ左にずれる。
2列×(5−4)=2列・・・(27)
従って、分散データ5の復元開始位置は、中段を復元する分散データ3より式(28)の列だけ左にずれる。
2列+1列=3列・・・(28)
中段のはじめの復元開始位置を列aにとるので、処理順番が1番である分散データ(1)の復元開始位置は、最上段で列aより左に3列ずれた位置になる。これはブロック46になる。これは斜線部分に存在するので、ここでは何もしなくて良い。次に処理順番が2番である分散データ(5)の復元開始位置であるが、これは最下段で列aより左に3列ずれた位置になる。これはブロック30になる。これは斜線部分に存在するので、ここでも何もしなくて良い。
次に処理順番が3番である分散データ(2)の復元開始位置であるが、これは上段で列aより左に1列ずれた位置になる。これはブロック22になる。これは斜線部分に存在するので、ここでも何もしなくて良い。次に処理順番が4番である分散データ(4)の復元開始位置であるが、これは、下段で列aより左に1列ずれた位置になる。これはブロック14になる。これは斜線部分に存在するので、ここでも何もしなくて良い。
次に処理順番が5番である分散データ(3)の復元であるが、その復元位置は、ブロック3である。この時点で、ブロック3以外のブロックの値はすでに既知なので、列aとブロック3以外のブロックとをXOR処理することによって、ブロック3を復元できる。
次に処理順番が6番である分散データ(1)の復元を行うが、その復元位置は、ブロック46の右1列隣のブロック51である。これは斜線部分に存在するので、ここでは何もしなくて良い。次に処理順番が7番である分散データ(5)の復元を行うが、その復元位置は、ブロック30の右1列隣のブロック35である。これは斜線部分に存在するので、ここでも何もしなくて良い。
次に処理順番が8番である分散データ(2)の復元を行うが、その復元位置は、ブロック22の右1列隣のブロック27である。この時点で、ブロック27以外のブロックの値はすでに既知なので、列aとブロック27以外のブロックとをXOR処理することによって、ブロック27を復元できる。次に処理順番が9番である分散データ(4)の復元を行うが、その復元位置は、ブロック14の右1列隣のブロック19である。この時点で、ブロック19以外のブロックの値はすでに既知なので、列aとブロック19以外のブロックとをXOR処理することによって、ブロック19を復元できる。
次に処理順番が10番である分散データ(3)の復元であるが、その復元位置は、ブロック8である。この時点で、ブロック8以外のブロックの値はすでに既知なので、列bとブロック8以外のブロックとをXOR処理することによって、ブロック8を復元できる。
次に処理順番が11番である分散データ(1)の復元を行うが、その復元位置は、ブロック56である。これは斜線部分に存在するので、ここでは何もしなくて良い。次に処理順番が12番である分散データ(5)の復元を行うが、その復元位置は、ブロック40である。これは斜線部分に存在するので、ここでも何もしなくて良い。
次に処理順番が13番である分散データ(2)の復元を行うが、その復元位置は、ブロック32である。この時点で、ブロック32以外のブロックの値はすでに既知なので、列bとブロック32以外のブロックとをXOR処理することによって、ブロック32を復元できる。次に処理順番が14番である分散データ(4)の復元を行うが、その復元位置は、ブロック24である。この時点で、ブロック24以外のブロックの値はすでに既知なので、列bとブロック24以外のブロックとをXOR処理することによって、ブロック24を復元できる。
次に処理順番が15番である分散データ(3)の復元であるが、その復元位置は、ブロック13である。この時点で、ブロック13以外のブロックの値はすでに既知なので、列cとブロック13以外のブロックとをXOR処理することによって、ブロック13を復元できる。
次に処理順番が16番である分散データ(1)の復元を行うが、その復元位置は、ブロック61である。この時点で、ブロック61以外のブロックの値はすでに既知なので、列aとブロック61以外のブロックとをXOR処理することによって、ブロック61を復元できる。次に処理順番が17番である分散データ(5)の復元を行うが、その復元位置は、ブロック45である。この時点で、ブロック45以外のブロックの値はすでに既知なので、列aとブロック45以外のブロックとをXOR処理することによって、ブロック45を復元できる。次に処理順番が18番である分散データ(2)の復元を行うが、その復元位置は、ブロック37である。この時点で、ブロック37以外のブロックの値はすでに既知なので、列cとブロック37以外のブロックとをXOR処理することによって、ブロック37を復元できる。次に処理順番が19番である分散データ(4)の復元を行うが、その復元位置は、ブロック29である。この時点で、ブロック29以外のブロックの値はすでに既知なので、列cとブロック29以外のブロックとをXOR処理することによって、ブロック29を復元できる。次に処理順番が20番である分散データ(3)の復元であるが、その復元位置は、ブロック18である。この時点で、ブロック18以外のブロックの値はすでに既知なので、列dとブロック18以外のブロックとをXOR処理することによって、ブロック18を復元できる。
このような手順を繰り返せば、すべてのブロックを復元でき、元データを得ることができる。このように復元は玉突きの手順で行われている。これを理解しやすくするため、図71では、ブロックの数字を丸と三角で囲み、それを傍線でつなげた。復元されるところは丸、それを利用するところは三角で囲んでいる。例えば、分散データ(1)の列aで復元されたブロック61は、分散データ(2)の列cの復元で利用されることを意味している。但し、斜線部分にブロックがある場合は、復元処理は行わず、その値をそのまま利用するだけである。なお、すべての復元と利用の関係を図示すると煩わしくなるので、一部の関係は図示していない。
先にも記述したように、復元方法はこれに限られるものではないが、この手順を用いれば、かなり簡単、かつ高速に復元を行うことが可能になる。
図72〜78では、本発明の閾値秘密分散方式がどの程度の安全性を保持するかを示す。図72は、閾値が2で、真性(物理)乱数[Genuine random number / Physical random number]を十分利用する場合の安全度を示す図である。
(1)本当に秘匿したいデータSは、ブロック1〜8で構成されるものとする。
(2)次に、本当に秘匿したいデータのブロックサイズと同じブロック[1]〜[9]で構成される真性(物理)乱数を用意する。そして、この本当に秘匿したいデータのブロック間に、図のように、真性(物理)乱数のブロックを挟みこみ、元データを生成する。
(3)この元データから、本発明の要領で、2つの分散データW1とW2を図のように生成する。W1,W2とも同じ列のブロックはXOR処理するものとする。この時、W1,W2はいわゆるバーナム暗号になっていることが分かる。従って、片方の分散データを取得しただけでは、復元を行うことは絶対に不可能である。
(4)エントロピーを計算してみる。本当に秘匿したいデータSのエントロピーをH(S)、分散データW1,W2のいずれか一方が明らかになった(分かってしまった)場合のエントロピーを、それぞれH(S|W1),H(S|W2)と表記すると、図72に示したように、式(29)になる。
H(S)=H(S|W1)=H(S|W2)・・・(29)
つまり、これは情報理論的に安全な(k,n)完全閾値秘密分散である。従って、これからも(3)と同様に、片方の分散データを取得しただけでは、復元を行うことが絶対に不可能であることが分かる。なおここで、kは閾値(ここでは2)、nは分散数である。
図73は、閾値が3で、真性(物理)乱数を十分利用する場合の安全度を示す図である。
(1)本当に秘匿したいデータSは、ブロック1〜6で構成されるものとする。
(2)次に、本当に秘匿したいデータのブロックサイズと同じブロック(1)〜(8)、及び(9)〜(16)で構成される真性(物理)乱数を用意する。そして、この本当に秘匿したいデータのブロック間に、図のように、真性(物理)乱数のブロックを挟みこみ、元データを生成する。
(3)この元データから、本発明の要領で、3つの分散データW1,W2,W3を
図のように生成する。W1,W2,W3とも同じ列のブロックはXOR処理するものとする。この時、W1,W2,W3はいわゆるバーナム暗号になっていることが分かる。従って、1つ、または2つの分散データを取得しただけでは、復元を行うことは絶対に不可能である。
(4)エントロピーを計算してみる。本当に秘匿したいデータSのエントロピーをH(S)、分散データW1,W2,W3のいずれか2つが明らかになった(分かってしまった)場合のエントロピーを、それぞれH(S|W1,W2),H(S|W1,W3),H(S|W2,W3)と表記すると、図73に示したように、式(30)になる。
H(S)=H(S|W1,W2)=H(S|W1,W3)=H(S|W2,W3)・・・(30)
つまり、これは情報理論的に安全な(k,n)完全閾値秘密分散である。従って、これからも(3)と同様に、1つまたは2つの分散データを取得しただけでは、復元を行うことが絶対に不可能であることが分かる。なおここでkは閾値(ここでは3)、nは分散数である。
図74は、閾値kが任意の値で、真性(物理)乱数を十分利用する場合の安全度を示す図である。図72や図73と同様の計算を行えば、式(31)になることが分かる。
H(S)=H(S|(k−1)個の分散データ)・・・(31)
つまり、これは情報理論的に安全な(k,n)完全閾値秘密分散である。
図75は、閾値が2で、真性(物理)乱数を一切利用しない場合の安全度を示す図である。
(1)本当に秘匿したいデータSは、ブロック1〜8で構成されるものとする。
(2)この本当に秘匿したいデータから、本発明の要領で、2つの分散データW1とW2を図のように生成する。W1,W2とも同じ列のブロックはXOR処理するものとする。
(3)エントロピーを計算してみる。本当に秘匿したいデータSのエントロピーをH(S)、分散データW1,W2のいずれか一方が明らかになった(分かってしまった)場合のエントロピーを、それぞれH(S|W1),H(S|W2)と表記すると、図75に示したように、式(32)になる。
1/2×H(S)=H(S|W1)=H(S|W2)・・・(32)
つまり、これはL=k=2の(k,L,n)ランプ型閾値秘密分散である。なお、このように本当に秘匿したいデータだけで分散データを生成する場合には、既知のデータフォーマットなど、本当に秘匿したいデータに用いられる何らかの特徴を推測して復元を試みられる可能性があるので、本当に秘匿したいデータを擬似乱数などで暗号化するなどの対策をとった上で、分散データを生成するのが好ましい。
図76は、閾値が3で、真性(物理)乱数を一切利用しない場合の安全度を示す図である。
(1)本当に秘匿したいデータSは、ブロック1〜6で構成されるものとする。
(2)この本当に秘匿したいデータから、本発明の要領で、3つの分散データW1,W2,W3を図のように生成する。W1,W2,W3とも同じ列のブロックはXOR処理するものとする。
(3)エントロピーを計算してみる。本当に秘匿したいデータSのエントロピーをH(S)、分散データW1,W2,W3のいずれか一方が明らかになった(分かってしまった)場合のエントロピーを、それぞれH(S|W1),H(S|W2),H(S|W3)と表記すると、図76に示したように、2/3×H(S)=H(S|W1)=H(S|W2)=H(S|W3)になる。また、分散データW1,W2,W3のいずれか2つが明らかになった(分かってしまった)場合のエントロピーを、それぞれH(S|W1,W2),H(S|W1,W3),H(S|W2,W3)と表記すると、図76に示したように、式(33)になる。
1/3×H(S)=H(S|W1,W2)=H(S|W1,W3)=H(S|W2,W3)・・・(33)
つまり、これはL=k=3の (k,L,n)ランプ型閾値秘密分散である。なお、このように本当に秘匿したいデータだけで分散データを生成する場合には、既知のデータフォーマットなど、本当に秘匿したいデータに用いられる何らかの特徴を推測して復元を試みられる可能性があるので、本当に秘匿したいデータを擬似乱数などで暗号化するなどの対策をとった上で、分散データを生成するのが好ましい。
図77は、閾値kが任意の値で、真性(物理)乱数を一切利用しない場合の安全度を示す図である。図75や図76と同様の計算を行えば、任意のkに対して、式(34)になることが分かる。
1/k×H(S)=H(S|(k−1)個の分散データ)・・・(34)
つまり、これはL=kの(k,L,n)ランプ型閾値秘密分散である。
図78は、本発明の閾値秘密分散方式がどの程度の安全性を保持するかを一般的に示した図である。真性(物理)乱数を本当に秘匿したいデータに挟み込んで元データを生成し、分散データを作成するものとする。真性(物理)乱数の数が0の場合は、図75〜77で示したように、ランプ型閾値秘密分散では一番セキュリティ度が低いL=kの (k,L,n)ランプ型閾値秘密分散になる。この真性(物理)乱数の数を徐々に増やすと、それに比例して、分散データのエントロピーも増加する。つまり1<L<kの (k,L,n)ランプ型閾値秘密分散になる。そして、真性(物理)乱数の数が本当に秘匿したいデータのサイズ以上になると、情報理論的に完全に安全なL=1の (k,L,n)ランプ型閾値秘密分散、即ち(k,n)完全閾値分散になる。
つまり、真性(物理)乱数の数によって、ランプ型閾値秘密分散の値Lが、最低のセキュリティレベルであるL=kから、最高のセキュリティレベルL=1まで連続的に変化する。言い換えれば、閾値秘密分散法における最低のセキュリティレベルであるL=kの(k,L,n)ランプ型閾値秘密分散から、情報理論的に完全に安全な(k,n)完全閾値分散まで安全度が連続的に変化する。これは他の閾値秘密分散法にはない特徴である。これによりユーザは、データサイズの縮小等による経済メリットとセキュリティレベルを容易にトレードオフできるようになる。
なお、この後、図79で説明を行うが、本発明を用いて、(k,L,n)ランプ型閾値秘密分散より更に低いセキュリティレベルの秘密分散も実現できる。
また、真性(物理)乱数の大量な入手にはかなりのコストを要するが、本発明に従えば、L=kの(k,L,n)ランプ型閾値秘密分散、即ち、真性(物理)乱数を不要とする閾値秘密分散も選択できるので、真性(物理)乱数の入手コストは必須でなくなる。
なお、先に記したように、L=kの(k,L,n)ランプ型閾値秘密分散の場合には、既知のデータフォーマットなど、本当に秘匿したいデータに用いられる何らかの特徴を推測して復元を試みられる危険性はある。しかしこれに対処する簡単な対策は様々有り、これが致命的な欠陥となることはない。例えば、本当に秘匿したいデータを擬似乱数で暗号化したデータを元データとして分散データを作成するとしても良いし、擬似乱数を用いて、本当に秘匿したいデータを並び替えたものを元データとして分散データを作成するとしても良い。また複数の独立した本当に秘匿したいデータを交互に挟み込んだデータを元データとして分散データを作成するのも良い。
なお、データを暗号化し、RAID(Redundant Arrays of Inexpensive Disks)で用いられる分散手法と等価な方法で、データを分割・保存するような方式は、各々分散データのエントロピーはかなり低く(つまり推測しやすい)、セキュリティレベルは極めて低いと言える。
図79は、耐障害性を向上させる方法を示した図である。元データを見れば分かるように、ブロック1〜3の値が重複するように、元データを構成している。このようにデータを重複させるとエントロピーが減少し、セキュリティレベルは低下するものの、一部のデータが欠損しても元データを復元できる可能性が向上する。例えば、分散(A)の列cがデータ欠損したとしても、分散(A)の列b,分散(B)の列c,列dを利用することで、分散(A)の列cのデータは復元できる。このように本発明を用いれば、耐障害性の向上も容易に実現できる。
図80は、分散データから分散データを生成する方法を示した図である。これまでは、分割データから分散データを生成するものとして説明をおこなってきたが、ここで示すように、分散データからも分散データを生成可能である。従って、分割データとは分散データを含む、大きな意味でのデータ分割を意味することが分かる。
はじめに元データから分散データ(A)、及び、分散データ(B)を生成する。これを図に示した修正データのように並び替える。なおここで「*」と表記しているのは「XOR」の略記である。そして次に、その修正データから再び分散データを生成する。それが分散データ(1)、及び、分散データ(2)である。分散データ(1)列bは“「3*2」XOR「3*4」”なので、結局これは「2 XOR 4」になる。このような計算を施した結果を、分散データ(1‘)、及び、分散データ(2‘)に示した。なお、列aの値は交換しておく必要がある。この分散データ(1‘)、及び、分散データ(2‘)を見れば分かるが、本発明によれば、偶数ブロック、奇数ブロックで分けて、分散データを生成することも可能である。
本発明の秘密分散装置は、秘匿したいデータ、若しくは秘匿したいデータと乱数から構成される秘密データから、当該秘密データを復元可能な複数の分散データを生成する秘密分散装置であって、秘密データの分割データ同士で排他的論理和演算を行うことで分散データを生成し、各分割データ間のデータの組合せを変えて排他的論理和演算を行うことで異なる分散データを生成する分散データ生成手段を備えことを特徴とする。
本発明によれば、分割データ同士で排他的論理和を行うので、分散データを秘密データより少ないデータ量にすることができ、分散・復元処理速度を向上させることができる。更に、真性(物理)乱数の量によって、連続的に、ランプ型閾値分散から完全閾値分散までを実現できる。また、任意の閾値、かつ任意の分散数の閾値秘密分散も実現可能である
本発明の実施形態では、秘密データを取り扱う秘密分散方法について、説明したが、取り扱うデータは必ずしも秘密にすべきデータである必要はなく、通常のデータを取り扱ってもよい。通常のデータとしては、通信端末間でやりとりされる、テキストデータや画像データなどの通信データや、制御情報を含む制御データでもよい。本発明は、当該発明を通信に利用することで、効率良く圧縮した上で通信を行うことができる効果を有する。
なお、上述した実施形態では、排他的論理和演算は、2つ又は2つ以上のデータに対して行う演算手段における演算の一機能として記載されている。これにより、演算手段は、以下のような演算を実行可能となる。即ち、演算手段は、共通(同一)の数回分の排他的論理和演算により、所定のデータを元の所定のデータに戻す。