(57)【要約】【課題】Indifferentiabilityな意味で安全であるか否かを証明することが可能なマスク生成関数の演算を行う。【解決手段】各カウント値iに対し、任意値ｘを含むハッシュ入力情報u(i)のハッシュ値y(i)を生成し、各ハッシュ値y(i)及び／又は当該ハッシュ値y(i)の一部のビット列をビット結合し、任意ビット長Ｌのビット列を生成する。少なくとも一部のカウント値iに対応するハッシュ入力情報u(i)は、さらに、カウント値j(i)(j(i)∈{0,...,Max})に対応するハッシュ連鎖値v(j(i))を含む。ハッシュ連鎖値v(j(i))は、カウント値m(i)(m(i)≠j(i))に対応するハッシュ連鎖値v(m(i))を含む情報のハッシュ値又はその一部のビット列であり、カウント値p(i)(p(i)≠i)に対応するハッシュ入力情報u(p(i))は、さらに、ハッシュ連鎖値v(m(i))を含む。【選択図】図１
2010286781.tif 000002
【特許請求の範囲】
【請求項１】
少なくとも任意値ｘが入力される入力部と、
各カウント値i∈{0,...,Max}（iは整数、MAXは１以上の整数）に対し、それぞれ、前記任意値ｘを含むハッシュ入力情報u(i)のハッシュ値y(i)を生成するハッシュ演算部と、
前記ハッシュ値y(i)及び／又は前記ハッシュ値y(i)の一部のビット列をビット結合し、任意ビット長Ｌのビット列を生成するビット結合部と、を有し、
少なくとも一部のカウント値iに対応する前記ハッシュ入力情報u(i)は、さらに、カウント値j(i)(j(i)∈{0,...,Max})に対応するハッシュ連鎖値v(j(i))を含み、
前記ハッシュ連鎖値v(j(i))は、カウント値m(i)(m(i)∈{0,...,Max},m(i)≠j(i))に対応するハッシュ連鎖値v(m(i))を含む情報のハッシュ値又はその一部のビット列であり、
カウント値p(i)(p(i)∈{0,...,Max},p(i)≠i)に対応するハッシュ入力情報u(p(i))は、さらに、前記ハッシュ連鎖値v(m(i))を含む、
ことを特徴とするビット列生成装置。
【請求項２】
請求項１のビット列生成装置であって、
前記ハッシュ演算部は、前記ハッシュ入力情報u(i)を第１ハッシュ関数Hに入力して前記ハッシュ値y(i)を生成し、
前記ハッシュ連鎖値v(m(i))を含む情報は、前記ハッシュ入力情報u(p(i))であり、
前記ハッシュ連鎖値v(j(i))は、前記ハッシュ入力情報u(p(i))を前記第１ハッシュ関数Hに入力して得られたハッシュ値y(p(i))又はその一部のビット列である、
ことを特徴とするビット列生成装置。
【請求項３】
請求項１のビット列生成装置であって、
前記ハッシュ演算部は、前記ハッシュ入力情報u(i)を第１ハッシュ関数Hに入力して前記ハッシュ値y(i)=H(u(i))を生成し、
前記ハッシュ連鎖値v(j(i))は、前記ハッシュ連鎖値v(m(i))を含む情報を第２ハッシュ関数Gに入力して得られたハッシュ値又はその一部のビット列であり、
前記ハッシュ連鎖値v(m(i))を含む情報は、前記任意値ｘに依存しない情報である、
ことを特徴とするビット列生成装置。
【請求項４】
請求項３のビット列生成装置であって、
前記ハッシュ連鎖値v(j)は、前記任意値ｘが前記入力部に入力される前に事前計算された値である、
ことを特徴とするビット列生成装置。
【請求項５】
請求項１から４の何れかのビット列生成装置であって、
一部のカウント値iに対応する前記ハッシュ入力情報u(i)のみが前記ハッシュ連鎖値v(j(i))を含む、
ことを特徴とするビット列生成装置。
【請求項６】
入力部とハッシュ演算部とビット結合部とビット結合部とを有するビット列生成装置が実行するビット列生成方法であって、
前記入力部に、少なくとも任意値ｘが入力されるステップと、
前記ハッシュ演算部が、各カウント値i∈{0,...,Max}（iは整数、MAXは１以上の整数）に対し、それぞれ、前記任意値ｘを含むハッシュ入力情報u(i)のハッシュ値y(i)を生成するステップと、
前記ビット結合部が、前記ハッシュ値y(i)及び／又は前記ハッシュ値y(i)の一部のビット列をビット結合し、任意ビット長Ｌのビット列を生成するステップと、を有し、
少なくとも一部のカウント値iに対応する前記ハッシュ入力情報u(i)は、さらに、カウント値j(i)(j(i)∈{0,...,Max})に対応するハッシュ連鎖値v(j(i))を含み、
前記ハッシュ連鎖値v(j(i))は、カウント値m(i)(m(i)∈{0,...,Max},m(i)≠j(i))に対応するハッシュ連鎖値v(m(i))を含む情報のハッシュ値又はその一部のビット列であり、
カウント値p(i)(p(i)∈{0,...,Max},p(i)≠i)に対応するハッシュ入力情報u(p(i))は、さらに、前記ハッシュ連鎖値v(m(i))を含む、
ことを特徴とするビット列生成方法。
【請求項７】
請求項１から５の何れかのビット列生成装置としてコンピュータを機能させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報セキュリティ技術の応用技術に関し、特に、任意長のランダムなビット列を出力する技術に関する。
【背景技術】
【０００２】
任意長のランダムなビット列であるマスクを生成する従来のマスク生成関数としてMFG1がある（例えば、非特許文献１参照）。以下にMFG1:{0,1}*×N→{0,1}nの構成を示す。なお、{0,1}*は任意長のビット列を示し、{0,1}nはビット長nのビット列を示し、Nは０以上の整数の集合を示し、α→βはαからβへの写像を示し、α||βはαとβとのビット結合（ビット連結）を示し、［α］βは、αから切り出された上位βビットを示し、CEIL(α)は、α以上の最小の整数（αのCeil関数値）を示し、<i>32はiを32ビットでエンコーディングしたビット列を示し、Hはハッシュ関数H:{0,1}*→{0,1}nを示し、x∈{0,1}*, L∈{1,...,n・232}である。
MFG1(x,L)=H(x||<0>32)||...||H(x||<CEIL(L/n)-2>32)
||[H(x||<CEIL(L/n)-1>32)]L-n(CEIL(L/n)-1)  …(1)
【０００３】
また、マスク生成関数の安全性の評価基準のひとつにIndifferentiabilityがある（例えば、非特許文献２参照）。この評価基準では、理想的なマスク生成関数のオラクルΦを利用できるシミュレータが存在すると仮定する。なお、このシミュレータは攻撃者に依存しないで構成される。そして、攻撃者が、理想的なハッシュ関数等のオラクルφを利用できる正規なマスク生成関数にクエリーを与えて得られる値と、クエリーを当該シミュレータに与えて得られる値とを識別できる確率が、無視できる関数以下となる場合、当該マスク生成関数は、オラクルΦに対してIndifferentiable（Indifferentiabilityな意味で安全）であるとする（例えば、非特許文献２参照）。なお、マスク生成関数がIndifferentiabilityな意味で安全であることの証明は、セキュリティパラメータkに依存する多項式によって攻撃者の資源範囲（演算時間の上限、クエリー数の上限、クエリー等の最大ビット数）を仮定し、その仮定のもとで行われる。
【先行技術文献】
【非特許文献】
【０００４】
【非特許文献１】ISO/IEC 9796-3 : Information technology -- Security techniques -- Digital signature schemes giving message recovery -- Part 3: Discrete logarithm based mechanisms
【非特許文献２】Ueli M. Maurer, Renato Renner, and Clements Holenstein, "Indifferentiability, Impossibility Results on Reductions, and Applications to the Random Oracle Methodology,"  In Moni Naor, editor, TCC 2004, Volume 2951 of LNCS, pages 21-39, Heidelberg, 2004. Springer.
【発明の概要】
【発明が解決しようとする課題】
【０００５】
式(1)に示すように、MFG1は、入力値x,Lに対し、ハッシュ値H(x||<0>32),...,H(x||<CEIL(L/n)-2>32)及びハッシュ値H(x||<CEIL(L/n)-1>32)から切り出された値 [H(x||<CEIL(L/n)-1>32)]L-n(CEIL(L/n)-1)のビット結合値H(x||<0>32)||...||H(x||<CEIL(L/n)-2>32)||[H(x||<CEIL(L/n)-1>32)]L-n(CEIL(L/n)-1)を出力する関数である。よって、MFG1を構成する各ブロックH(x||<0>32),...,H(x||<CEIL(L/n)-2>32)及び[H(x||<CEIL(L/n)-1>32)]L-n(CEIL(L/n)-1)は、それぞれ、x||<i>32(i∈{0,...,CEIL(L/n)-1})をクエリーとして理想的なハッシュ関数等のオラクルに与えて得られる値であるといえる。このクエリーx||<i>32は各iの間で互いに独立であり、攻撃者はどんなに大きなiに対応するクエリーx||<i>32であってもほぼ同様に生成できる。
【０００６】
前述のように、マスク生成関数がIndifferentiabilityな意味で安全であることの証明は攻撃者の資源範囲を仮定して行われる。この仮定における安全性の評価は、上述のシミュレータが、与えられたクエリーが攻撃者の資源範囲内あれば正規な処理を実行し、与えられたクエリーが攻撃者の資源を超えるものであった場合には乱数を返答することで実現できる。ここで、上述のシミュレータは、攻撃者についての情報を知らないため、攻撃者から送られたクエリーから当該クエリーが攻撃者の資源範囲内のものであるか否かを判定しなければならない。しかし、上述のように、MFG1に対するクエリーx||<i>32は各iの間で互いに独立であり、上述のシミュレータは、クエリーx||<i>32のみから当該クエリーが攻撃者の資源範囲内のものであるか否かを判定することはできない。よって、従来のMFG1では、マスク生成関数がIndifferentiabilityな意味で安全であることを証明することができなかった。
【０００７】
本発明はこのような点に鑑みてなされたものであり、Indifferentiabilityな意味で安全であるか否かを証明することが可能なマスク生成関数の演算を行う装置、方法、及びそのプログラムを提供することを目的とする。
【課題を解決するための手段】
【０００８】
本発明では、少なくとも任意値ｘが入力され、各カウント値i∈{0,...,Max}（iは整数、MAXは１以上の整数）に対し、それぞれ、任意値ｘを含むハッシュ入力情報u(i)のハッシュ値y(i)を生成し、各ハッシュ値y(i)及び／又は当該ハッシュ値y(i)の一部のビット列をビット結合し、任意ビット長Ｌのビット列を生成する。少なくとも一部のカウント値iに対応するハッシュ入力情報u(i)は、さらに、カウント値j(i)(j(i)∈{0,...,Max})に対応するハッシュ連鎖値v(j(i))を含む。ハッシュ連鎖値v(j(i))は、カウント値m(i)(m(i)∈{0,...,Max},m(i)≠j(i))に対応するハッシュ連鎖値v(m(i))を含む情報のハッシュ値又はその一部のビット列であり、カウント値p(i)(p(i)∈{0,...,Max},p(i)≠i)に対応するハッシュ入力情報u(p(i))は、さらに、ハッシュ連鎖値v(m(i))を含む。
【０００９】
ここで、少なくとも一部のカウント値iに対応するハッシュ入力情報u(i)は、カウント値j(i)(j(i)∈{0,...,Max})に対応するハッシュ連鎖値v(j(i))を含む。この場合、少なくとも一部のカウント値iに対応するハッシュ入力情報u(i)は、他のカウント値j(i)に対応するハッシュ連鎖値v(j(i))を求めた後でなければ生成できない。ハッシュ入力情報u(i)はクエリーに相当するが、攻撃者はハッシュ入力情報u(i)を生成するためにそれに対応するハッシュ連鎖値v(j(i))を得る必要がある。そして、そのために上述のオラクルにさらにクエリーを送る必要があり、その回数はハッシュ連鎖値v(j(i))のハッシュ連鎖回数に依存する。そのため、上述のシミュレータは、攻撃者から送られたハッシュ入力情報u(i)を判定することによって、ハッシュ入力情報u(i)が何回のハッシュ連鎖によって得られたかを知ることができる。このハッシュ連鎖回数は、攻撃者の演算時間やクエリーの数に対応する。よって、上述のシミュレータは、攻撃者から送られたクエリーから当該クエリーが攻撃者の資源範囲内のものであるか否かを知ることができる。その結果、上述のシミュレータは、与えられたクエリーが正しくハッシュ連鎖によって得られたものであれば正規な処理を実行し、与えられたクエリーが正しくハッシュ連鎖によって得られたものでなければ乱数を返答することができる。よって、本発明のマスク生成関数では、Indifferentiabilityな意味で安全であることを証明することができる。
【発明の効果】
【００１０】
以上のように、本発明のマスク生成関数では、Indifferentiabilityな意味で安全であることを証明することができる。
【図面の簡単な説明】
【００１１】
【図１】第１実施形態のビット列生成装置の構成を説明するためのブロック図。
【図２】第１実施形態の処理を説明するためのフローチャート。
【図３】第２実施形態のビット列生成装置の構成を説明するためのブロック図。
【図４】第２実施形態の処理を説明するためのフローチャート。
【図５】第３実施形態の処理を説明するためのフローチャート。
【図６】第３実施形態の処理を説明するためのフローチャート。
【発明を実施するための形態】
【００１２】
以下、図面を参照して本発明の実施形態を説明する。
〔定義〕
まず、以下で共通に使用する用語・記号を定義する。
{0,1}*：任意長のビット列。
{0,1}n：ビット長nのビット列。
N：０以上の整数の集合。
α→β：αからβへの写像。
α||β：αとβとのビット結合（ビット連結）。
［α］β：αから切り出された上位βビット。例えば、[11101001]3=111。
［α］β：αから切り出された下位βビット。例えば、[11101001]5=01001。
CEIL(α)：α以上の最小の整数（αのCeil関数値）。
<i>：iを所定のビットでエンコーディングしたビット列。
k：1以上の整数定数であるセキュリティパラメータ。
H,G：ハッシュ関数。ハッシュ関数の例はSHA-1などである。
【００１３】
〔第１実施形態〕
第１実施形態では、まず、入力部に、少なくとも任意値ｘが入力される。次に、ハッシュ演算部が、各カウント値i∈{0,...,Max}（iは整数、MAXは１以上の整数）に対し、それぞれ、任意値ｘを含むハッシュ入力情報u(i)のハッシュ値y(i)を生成する。本形態のハッシュ演算部は、ハッシュ入力情報u(i)を第１ハッシュ関数Hに入力してハッシュ値y(i)=H(u(i))を生成する。その後、ビット結合部が、ハッシュ値y(i)及び／又はハッシュ値y(i)の一部のビット列をビット結合し、任意ビット長Ｌのビット列を生成する。
【００１４】
ここで、少なくとも一部のカウント値iに対応するハッシュ入力情報u(i)は、さらに、カウント値j(i)(j(i)∈{0,...,Max})に対応するハッシュ連鎖値v(j(i))を含む。当該ハッシュ連鎖値v(j(i))は、カウント値m(i)(m(i)∈{0,...,Max},m(i)≠j(i))に対応するハッシュ連鎖値v(m(i))を含む情報のハッシュ値又はその一部のビット列である。本形態の場合、当該ハッシュ連鎖値v(j(i))は、カウント値p(i)(p(i)∈{0,...,Max},p(i)≠i)に対応するハッシュ入力情報u(p(i))（ハッシュ連鎖値v(m(i))を含む）を第１ハッシュ関数Hに入力して得られたハッシュ値y(p(i))=H(u(p(i)))又はその一部のビット列である。
【００１５】
以下では、一例として、Max=t-1, t=CEIL(L/(n-k)), i∈{0,...,t-1}, j(i)=i-1, p(i)=i-1, m(i)=i-2, u(i)=v(i-1)||x||<i>, y(i)=H(v(i-1)||x||<i>), z(i)=[y(i)]n-k, v(i-1)=[y(i-1)]k=[H(v(i-2)||x||<i-1>)]k（i≧1の場合）, v(i-1)=v(-1)=0k∈{0,1}k（i=0の場合）とし、入力(x,L)∈{0,1}*×N(N≧1)に対して任意ビット長Ｌのビット列F(x,L)=z(0)||...||z(t-2)||[z(t-1)]r(r=L-(n-k)(t-1))を出力する場合を例示する。なお、本形態では、nはkを変数とする多項式でありn>kを満たす。また、第１ハッシュ関数HはH:{0,1}*→{0,1}nである。
【００１６】
＜構成＞
図１は、第１実施形態のビット列生成装置１００の構成を説明するためのブロック図である。
図１に例示するように、本形態のビット列生成装置１００は、制御部１０１と、メモリ１０２ａと、初期値メモリ１０２ｂと、入力部１０３と、パラメータ算出部１０４と、カウンタ１０５と、ハッシュ演算部１０６と、ビット切出し部１０７と、ビット結合部１０８とを有する。
【００１７】
本形態のビット列生成装置１００は、例えば、CPU(central processing unit)、RAM(random-access memory)、ROM(read-only memory)等を備えた公知のコンピュータに所定のプログラムが読み込まれ、CPUがこのプログラムを実行することで構築されるものである。制御部１０１、パラメータ算出部１０４、カウンタ１０５、ハッシュ演算部１０６、ビット切出し部１０７及びビット結合部１０８は、例えば、CPUが所定のプログラムを実行することで構築される処理部である。なお、これらの処理部の少なくとも一部が集積回路によって構成されてもよい。また、メモリ１０２ａや初期値メモリ１０２ｂは、補助記憶装置、RAM、キャッシュメモリ、レジスタ、集積回路の素子、又は、それらの少なくとも一部を結合した記憶領域である。また、入力部１０３は、例えば、マウス、キーボード、入力ポート、データ受信装置、記憶装置からのデータ読み出し装置などである。
【００１８】
なお、図１では、複数のハッシュ演算部１０６やビット切出し部１０７が図示されているが、これは表記の便宜上からであり、必ずしも複数のハッシュ演算部１０６やビット切出し部１０７が存在しなくてもよい。また、ビット列生成装置１００は、制御部１０１の制御のもと各処理を実行する。また、以下では説明を簡略化するが、各処理部から出力されたデータは、逐一、メモリ１０２ａに格納される。メモリ１０２ａに格納されたデータは、必要に応じて各処理部に入力されてその処理に利用される。
【００１９】
＜処理＞
図２は、第１実施形態の処理を説明するためのフローチャートである。以下、この図を用いて、本形態の処理を説明する。なお、以下の処理の前提として、k,nの値が設定され、初期値メモリ１０２ｂにハッシュ連鎖値の初期値v(-1)=0kが格納されているものとする。
【００２０】
まず、入力部１０３に(x,L)∈{0,1}*×Nが入力される（ステップＳ１０１）。Lはパラメータ算出部１０４に入力され、パラメータ算出部１０４は、
t=CEIL(L/(n-k))      …(2)
の演算を行い、その演算結果tを出力する（ステップＳ１０２）。
【００２１】
また、パラメータ算出部１０４は、
r=L-(n-k)(t-1)      …(3)
の演算を行い、その演算結果rを出力する（ステップＳ１０３）。パラメータ算出部１０４から出力された演算結果tは制御部１０１に入力され、演算結果rはビット切出し部１０７に入力される。
【００２２】
次に、カウンタ１０５がカウント値iを0に設定する（ステップＳ１０４）。
次に、ハッシュ演算部１０６に、初期値メモリ１０２ｂ又はビット切出し部１０７から出力されたハッシュ連鎖値v(i-1)と、入力部１０３に入力されたxと、カウンタ１０５から出力されたカウント値iとが入力される。ハッシュ演算部１０６は、
y(i)=H(v(i-1)||x||<i>)      …(4)
の演算を行い、そのハッシュ値y(i)を出力する（ステップＳ１０５）。
【００２３】
ハッシュ値y(i)は、ビット切出し部１０７に入力される。ビット切出し部１０７は、
z(i)=[y(i)]n-k      …(5)
v(i)=[y(i)]k      …(6)
の演算によってハッシュ値y(i)から一部のビット列を切り出し、それによって得られたビット列z(i)とハッシュ連鎖値v(i)とを出力する（ステップＳ１０６、Ｓ１０７）。
【００２４】
次に、制御部１０１が、カウンタ１０５から出力されたカウント値iがt-2であるか否かを判定する（ステップＳ１０８）。ここで、i=t-2でないと判定されたならば、カウンタ１０５がi+1を新たなiとしてカウントアップを行い（ステップＳ１０９）、処理がステップＳ１０５に戻される。一方、i=t-2であると判定されたならば、ハッシュ演算部１０６に、ビット切出し部１０７から出力されたハッシュ連鎖値v(t-2)と、入力部１０３に入力されたxと、カウンタ１０５から出力されたカウントアップされたカウント値i=t-1とが入力される。ハッシュ演算部１０６は、カウント値i=t-1に対応する
y(t-1)=H(v(t-2)||x||<t-1>)      …(7)
の演算を行い、そのハッシュ値y(t-1)を出力する（ステップＳ１１０）。
【００２５】
ハッシュ演算部１０６から出力されたハッシュ値y(t-1)は、ビット切出し部１０７に入力される。ビット切出し部１０７は、カウント値i=t-1に対応する
z(t-1)=[y(t-1)]r      …(8)
の演算を行い、ハッシュ値y(t-1)から一部のビット列を切り出し、それによって得られたビット列z(t-1)を出力する（ステップＳ１１１）。
【００２６】
ビット切出し部１０７から出力された各ビット列z(i)(i∈{0,...,t-1})は、ビット結合部１０８に入力される。ビット結合部１０８は、
F(x,L)=z(0)||...||z(t-2)||z(t-1)      …(9)
の演算によって各ビット列z(i)のビット結合し、ビット長Ｌのビット列F(x,L)を生成して出力する（ステップＳ１１２）。
【００２７】
＜第１実施形態の変形例＞
本発明は第１実施形態に限定されない。
例えば、本形態のハッシュ入力情報u(i)は、ハッシュ連鎖値v(i-1)と、任意値xと、カウント値iのエンコーディングビット列<i>とのビット結合であった。しかし、少なくとも一部にカウント値iに対応するハッシュ入力情報u(i)が、カウント値iのエンコーディングビット列<i>を含まない構成でもよい。また、少なくとも一部にカウント値iに対応するハッシュ入力情報u(i)が、ハッシュ連鎖値v(i-1)と、任意値xと、その他の情報（例えば、乱数や装置の固有情報など）とのビット結合であってもよいし、ハッシュ連鎖値v(i-1)と、任意値xと、エンコーディングビット列<i>と、当該その他の情報とのビット結合であってもよい。
【００２８】
また、各ビット列z(i)(i∈{0,...,t-1})が、式(9)以外の順序でビット結合されてもよい。また、本形態では、各カウント値iに対するハッシュ入力情報u(i),u(p(i))(i≠p(i))とハッシュ連鎖値v(j(i)),v(m(i))とが、j(i)=i-1, p(i)=i-1, m(i)=i-2の関係を満たすこととしたが、例えば、j(i)=i+1, p(i)=i+1, m(i)=i+2など、j(i),p(i)(i≠p(i)),m(i)がカウント値iに対するその他の関数であってもよい。この場合、それに応じてカウント値の更新方法が異なる。本形態では、j(i)=i-1, p(i)=i-1, m(i)=i-2としたため、カウント値iを0からt-1まで1ずつ増加させながら繰り返し処理を実行したが、例えば、j(i)=i+1, p(i)=i+1, m(i)=i+2の場合には、カウント値iをt-1から0まで1ずつ減少させながら繰り返し処理を実行すればよい。
【００２９】
また、本形態では、ハッシュ連鎖値の初期値がv(-1)=0kであったが、ハッシュ連鎖値の初期値が任意の定数、または任意値xの関数値であるなど、その他の値をハッシュ連鎖値の初期値v(-1)としてもよい。また、本形態では、j(i)=i-1, p(i)=i-1, m(i)=i-2としたため、ハッシュ連鎖値v(-1)に初期値を設定したが、j(i),p(i)(i≠p(i)),m(i)がその他の関数である場合には、それに応じて初期値が設定されるハッシュ連鎖値が異なる。例えば、j(i)=i+1, p(i)=i+1, m(i)=i+2の場合には、v(t+1)に初期値を設定する。
【００３０】
また、本形態では、ハッシュ値y(i)の上位n-kビット又はrビットをビット列z(i)=[y(i)]n-kとしたが、ハッシュ値y(i)のその他のビット位置（例えば、下位n-kビット又はrビット、離散的に切出したn-kビット又はrビット）をビット列z(i)としてもよい。また、ハッシュ値y(i)(i≠t-1)そのものをビット列z(i)(i≠t-1)とし、ハッシュ値y(i)(i=t-1)から切出したrビットをビット列z(i)(i=t-1)としてもよい。この場合、t=CEIL(L/n),r=L-n(t-1)となる。また、本形態では、z(t-1)=[y(t-1)]rと演算したが、[y(t-1)]n-kを計算した後にz(t-1)=[[y(t-1)]n-k]rを計算してもよい。また、本形態では、nがkを変数とする多項式であったがnが定数でもよい。
【００３１】
また、本形態では、入力部１０３にｘとＬとが入力されることとしたが、Ｌを固定とし、入力部１０３にｘのみが入力される構成でもよい。
【００３２】
〔第２実施形態〕
第２実施形態は、第１実施形態の変形例であり、第１ハッシュ関数Hのハッシュ値からハッシュ連鎖値を生成するのではなく、別途計算される第２ハッシュ関数Gのハッシュ値からハッシュ連鎖値を生成する。
【００３３】
第２実施形態でも、まず、入力部に、少なくとも任意値ｘが入力される。次に、ハッシュ演算部が、各カウント値i∈{0,...,Max}（iは整数、MAXは１以上の整数）に対し、それぞれ、任意値ｘを含むハッシュ入力情報u(i)のハッシュ値y(i)を生成する。本形態のハッシュ演算部は、ハッシュ入力情報u(i)を第１ハッシュ関数Hに入力してハッシュ値y(i)=H(u(i))を生成する。その後、ビット結合部が、ハッシュ値y(i)及び／又はハッシュ値y(i)の一部のビット列をビット結合し、任意ビット長Ｌのビット列を生成する。
【００３４】
ここで、少なくとも一部のカウント値iに対応するハッシュ入力情報u(i)は、さらに、カウント値j(i)(j(i)∈{0,...,Max})に対応するハッシュ連鎖値v(j(i))を含む。当該ハッシュ連鎖値v(j(i))は、カウント値m(i)(m(i)∈{0,...,Max},m(i)≠j(i))に対応するハッシュ連鎖値v(m(i))を含む情報のハッシュ値又はその一部のビット列である。本形態の場合、当該ハッシュ連鎖値v(j(i))は、ハッシュ連鎖値v(m(i))を含む情報を第２ハッシュ関数Gに入力して得られたハッシュ値又はその一部のビット列であり、当該「ハッシュ連鎖値v(m(i))を含む情報」は、任意値ｘに依存しない情報である。また、カウント値p(i)(p(i)∈{0,...,Max},p(i)≠i)に対応するハッシュ入力情報u(p(i))は、さらに、ハッシュ連鎖値v(m(i))を含む。
【００３５】
以下では、一例として、Max=t-1, t=CEIL(L/n), i∈{0,...,t-1}, j(i)=i-1, p(i)=i-1, m(i)=i-2, u(i)=v(i-1)||x||<i>, y(i)=H(v(i-1)||x||<i>), v(i-1)=G(v(i-2)||<i-1>)（i≧1の場合）, v(i-1)=v(-1)=0k∈{0,1}k（i=0の場合）とし、入力(x,L)∈{0,1}*×N(N≧1)に対して任意ビット長Ｌのビット列F(x,L)=y(0)||...||y(t-2)||[y(t-1)]r(r=L-n(t-1))を出力する場合を例示する。なお、本形態では、nはkを変数とする多項式でありn>kを満たす。また、第１ハッシュ関数HはH:{0,1}*→{0,1}nであり、第２ハッシュ関数GはG:{0,1}*→{0,1}kである。また、以下では、第１実施形態との相違点を中心に説明し、第１実施形態と共通する事項については説明を省略する。
【００３６】
＜構成＞
図３は、第２実施形態のビット列生成装置２００の構成を説明するためのブロック図である。なお、図３において、第１実施形態と共通する部分については、第１実施形態と同じ符号を用いた。
【００３７】
図３に例示するように、本形態のビット列生成装置２００は、制御部１０１と、メモリ１０２ａと、初期値メモリ１０２ｂと、入力部１０３と、パラメータ算出部２０４と、カウンタ１０５と、ハッシュ演算部１０６，２０９と、ビット切出し部２０７と、ビット結合部２０８とを有する。
【００３８】
本形態のビット列生成装置２００は、例えば、CPU、RAM、ROM等を備えた公知のコンピュータに所定のプログラムが読み込まれ、CPUがこのプログラムを実行することで構築されるものである。例えば、パラメータ算出部２０４、ハッシュ演算部２０９、ビット切出し部２０７、ビット結合部２０８は、例えば、CPUが所定のプログラムを実行することで構築される処理部である。なお、これらの処理部の少なくとも一部が集積回路によって構成されてもよい。
【００３９】
なお、図１では、複数のハッシュ演算部１０６，２０９が図示されているが、これは表記の便宜上からであり、必ずしも複数のハッシュ演算部１０６，２０９が存在しなくてもよい。また、ビット列生成装置２００は、制御部１０１の制御のもと各処理を実行する。また、以下では説明を簡略化するが、各処理部から出力されたデータは、逐一、メモリ１０２ａに格納される。メモリ１０２ａに格納されたデータは、必要に応じて各処理部に入力されてその処理に利用される。
【００４０】
＜処理＞
図４は、第２実施形態の処理を説明するためのフローチャートである。以下、この図を用いて、本形態の処理を説明する。なお、以下の処理の前提として、k,nの値が設定され、初期値メモリ１０２ｂにハッシュ連鎖値の初期値v(-1)=0kが格納されているものとする。
【００４１】
まず、入力部１０３に(x,L)∈{0,1}*×Nが入力される（ステップＳ１０１）。Lはパラメータ算出部１０４に入力され、パラメータ算出部２０４は、
t=CEIL(L/n)      …(10)
の演算を行い、その演算結果tを出力する（ステップＳ２０２）。
【００４２】
また、パラメータ算出部２０４は、
r=L-n(t-1)      …(11)
の演算を行い、その演算結果rを出力する（ステップＳ２０３）。パラメータ算出部１０４から出力された演算結果tは制御部１０１に入力され、演算結果rはビット切出し部２０７に入力される。
【００４３】
次に、カウンタ１０５がカウント値iを0に設定する（ステップＳ１０４）。
次に、ハッシュ演算部１０６に、初期値メモリ１０２ｂ又はハッシュ演算部２０９から出力されたハッシュ連鎖値v(i-1)と、入力部１０３に入力されたxと、カウンタ１０５から出力されたカウント値iとが入力される。ハッシュ演算部１０６は、
y(i)=H(v(i-1)||x||<i>)      …(12)
の演算を行い、そのハッシュ値y(i)を出力する（ステップＳ１０５）。
【００４４】
次に、ハッシュ演算部２０９に、初期値メモリ１０２ｂ又はハッシュ演算部２０９から出力されたハッシュ連鎖値v(i-1)と、カウンタ１０５から出力されたカウント値iとが入力される。ハッシュ演算部２０９は、
v(i)=G(v(i-1)||<i>)      …(13)
の演算を行い、そのハッシュ値v(i)をハッシュ連鎖値v(i)として出力する（ステップＳ２０７）。
【００４５】
次に、制御部１０１が、カウンタ１０５から出力されたカウント値iがt-2であるか否かを判定する（ステップＳ１０８）。ここで、i=t-2でないと判定されたならば、カウンタ１０５がi+1を新たなiとしてカウントアップを行い（ステップＳ１０９）、処理がステップＳ１０５に戻される。一方、i=t-2であると判定されたならば、ハッシュ演算部１０６に、ハッシュ演算部２０９から出力されたハッシュ連鎖値v(t-2)と、入力部１０３に入力されたxと、カウンタ１０５から出力されたカウントアップされたカウント値i=t-1とが入力される。ハッシュ演算部１０６は、カウント値i=t-1に対応する
y(t-1)=H(v(t-2)||x||<t-1>)      …(14)
の演算を行い、そのハッシュ値y(t-1)を出力する（ステップＳ１１０）。
【００４６】
ハッシュ演算部２０９から出力されたハッシュ値y(t-1)は、ビット切出し部２０７に入力される。ビット切出し部２０７は、カウント値i=t-1に対応する
z(t-1)=[y(t-1)]r      …(15)
の演算を行い、ハッシュ値y(t-1)から一部のビット列を切り出し、それによって得られたビット列z(t-1)を出力する（ステップＳ２１１）。
【００４７】
ハッシュ演算部１０６から出力されたハッシュ値y(0),...,y(t-2)と、ビット切出し部２０７から出力されたビット列z(t-1)とは、ビット結合部２０８に入力される。ビット結合部２０８は、
F(x,L)=y(0)||...||y(t-2)||z(t-1)      …(16)
の演算によって各ハッシュ値y(0),...,y(t-2)とビット列z(t-1)とをビット結合し、ビット長Ｌのビット列F(x,L)を生成して出力する（ステップＳ２１２）。
【００４８】
＜第２実施形態の変形例＞
本発明は第２実施形態に限定されない。
例えば、本形態では、カウント値iを増加させながら行われる繰り返し処理の中でハッシュ連鎖値v(i)を計算することとした（ステップＳ２０７）。しかし、本形態のハッシュ連鎖値v(i)は入力される任意値xに依存しない。そのため、必要となるすべてのハッシュ連鎖値v(i)をまとめて計算してもよく、また、ハッシュ連鎖値v(j)がステップＳ１０１より前に事前計算されハッシュ値y(i)が並列計算されていてもよい。これにより、演算速度を向上させることができる。
【００４９】
また、本形態のハッシュ入力情報u(i)は、ハッシュ連鎖値v(i-1)と、任意値xと、カウント値iのエンコーディングビット列<i>とのビット結合であった。しかし、少なくとも一部にカウント値iに対応するハッシュ入力情報u(i)が、カウント値iのエンコーディングビット列<i>を含まない構成でもよい。また、少なくとも一部にカウント値iに対応するハッシュ入力情報u(i)が、ハッシュ連鎖値v(i-1)と、任意値xと、その他の情報（例えば、乱数や装置の固有情報など）とのビット結合であってもよいし、ハッシュ連鎖値v(i-1)と、任意値xと、エンコーディングビット列<i>と、当該その他の情報とのビット結合であってもよい。
【００５０】
また、本形態のハッシュ連鎖値v(i)は、ハッシュ連鎖値v(i-1)とエンコーディングビット列<i>とのビット結合のハッシュ値G(v(i-1)||<i>)であった。しかし、少なくとも一部にカウント値iに対応するハッシュ連鎖値v(i)が、カウント値iのエンコーディングビット列<i>を含まない値のハッシュ値（例えば、v(i)=G(v(i-1))）であってもよい。また、少なくとも一部にカウント値iに対応するハッシュ連鎖値v(i)が、ハッシュ連鎖値v(i-1)と、エンコーディングビット列<i>と、その他の情報（例えば、乱数や装置の固有情報など）とのビット結合のハッシュ値であってもよいし、ハッシュ連鎖値v(i-1)と、当該その他の情報とのビット結合のハッシュ値であってもよい。また、ハッシュ値G(v(i-1)||<i>)などのハッシュ値の一部のビットをハッシュ連鎖値v(i)としてもよい。
【００５１】
また、各ビット列y(0),...,y(t-2),z(t-1)が式(16)以外の順序でビット結合されてもよい。また、本形態では、各カウント値iに対するハッシュ入力情報u(i),u(p(i))(i≠p(i))とハッシュ連鎖値v(j(i)),v(m(i))とが、j(i)=i-1, p(i)=i-1, m(i)=i-2の関係を満たすこととしたが、例えば、j(i)=i+1, p(i)=i+1, m(i)=i+2など、j(i),p(i)(i≠p(i)),m(i)がカウント値iに対するその他の関数であってもよい。この場合、それに応じてカウント値の更新方法が異なる。本形態では、j(i)=i-1, p(i)=i-1, m(i)=i-2としたため、カウント値iを0からt-1まで1ずつ増加させながら繰り返し処理を実行したが、例えば、j(i)=i+1, p(i)=i+1, m(i)=i+2の場合には、カウント値iをt-1から0まで1ずつ減少させながら繰り返し処理を実行すればよい。
【００５２】
また、本形態では、ハッシュ連鎖値の初期値がv(-1)=0kであったが、ハッシュ連鎖値の初期値が任意の定数、または任意値xの関数値であるなど、その他の値をハッシュ連鎖値の初期値v(-1)としてもよい。また、本形態では、j(i)=i-1, p(i)=i-1, m(i)=i-2としたため、ハッシュ連鎖値v(-1)に初期値を設定したが、j(i),p(i)(i≠p(i)),m(i)がその他の関数である場合には、それに応じて初期値が設定されるハッシュ連鎖値が異なる。例えば、j(i)=i+1, p(i)=i+1, m(i)=i+2の場合には、v(t+1)に初期値を設定する。
【００５３】
また、本形態では、ハッシュ値y(0),...,y(t-2)とビット列z(t-1)とのビット結合をビット列F(x,L)としたが、各ハッシュ値y(0),...,y(t-2)のそれぞれ一部のビット列とビット列z(t-1)とのビット結合をビット列F(x,L)としてもよい。この場合、tやrは、ビット列F(x,L)のビット長がLとなるように算出される。
【００５４】
また、本形態では、nがkを変数とする多項式であったがnが定数でもよい。また、本形態では、入力部１０３にｘとＬとが入力されることとしたが、Ｌを固定とし、入力部１０３にｘのみが入力される構成でもよい。
【００５５】
〔第３実施形態〕
次に本発明の第３実施形態を説明する。
本形態は、第１，２実施形態の変形例であり、一部のカウント値iに対応するハッシュ入力情報u(i)のみがハッシュ連鎖値v(j(i))を含む形態である。これにより、ハッシュ連鎖値v(j(i))の演算コストを削減できるとともに、ハッシュ連鎖値v(j(i))を含まないハッシュ入力情報u(i)やそのハッシュ値を同時並列に計算でき、演算速度を向上させることができる。
なお、本形態の構成は第１，２実施形態と同様であるため、以下では構成の説明を省略し、処理を中心に説明を行う。
【００５６】
＜実施例１＞
図５は、第３実施形態の処理を説明するためのフローチャートである。
図５の例では、カウント値i∈{0,...,t-1}のうち、i=w・q（wは2以上の整数、qは正の整数）を満たす場合にのみ、入力情報u(i)がハッシュ連鎖値v(j(i))を含む。一方、i≠w・qとなるカウント値iに対応する入力情報u(i)はハッシュ連鎖値v(j(i))を含まない。なお、本形態でも第１実施形態と同様、j(i)=i-1, p(i)=i-1, m(i)=i-2の場合を例にとって説明する。
【００５７】
まず、第１実施形態と同様のステップＳ１０１からＳ１０３の処理が実行される。次に、ハッシュ演算部１０６（図１）に、入力部１０３に入力されたxと、カウンタ１０５から出力されたカウント値i(i∈{0,...t-1}, i≠w・q)とが入力される。ハッシュ演算部１０６は、これらの各カウント値i(i∈{0,...t-1}, i≠w・q)に対して
y(i)=H(x||<i>)      …(17)
の演算を行い、そのハッシュ値y(i)を出力する（ステップＳ３０４）。この各カウント値iについての式(17)の演算は同時並列に実行されてもよいし、直列的に実行されてもよい。
【００５８】
これらのハッシュ値y(i)のうち、カウント値i(i∈{0,...t-1}, i=w・q-1)に対応するものがビット切出し部１０７に入力される。ビット切出し部１０７は、カウント値i(i∈{0,...t-1}, i=w・q-1)に対し、
v(i)=[y(i)]k      …(18)
の演算によってハッシュ値y(i)から一部のビット列を切り出し、それによって得られたビット列z(i)とハッシュ連鎖値v(i)とを出力する（ステップＳ３０５）。この各カウント値iについての式(18)の演算は同時並列に実行されてもよいし、直列的に実行されてもよい。
【００５９】
次に、ハッシュ演算部１０６に、初期値メモリ１０２ｂ又はビット切出し部１０７から出力されたハッシュ連鎖値v(i-1) (i∈{0,...t-1}, i=w・q)と、入力部１０３に入力されたxと、カウンタ１０５から出力されたカウント値i(i∈{0,...t-1}, i=w・q)とが入力される。ハッシュ演算部１０６は、これらの各カウント値i(i∈{0,...t-1}, i=w・q)に対して
y(i)=H(v(i-1)||x||<i>)      …(19)
の演算を行い、そのハッシュ値y(i)を出力する（ステップＳ３０６）。この各カウント値iについての式(19)の演算は同時並列に実行されてもよいし、直列的に実行されてもよい。
【００６０】
各カウント値i∈{0,...t-2}に対応するハッシュ値y(i)は、ビット切出し部１０７に入力される。ビット切出し部１０７は、
z(i)=[y(i)]n-k      …(20)
の演算によってハッシュ値y(i)から一部のビット列を切り出し、それによって得られたビット列z(i)(i∈{0,...t-2})を出力する（ステップＳ３０７）。
その後、第１実施形態と同様のステップＳ１１１及びＳ１１２の処理が実行される。
【００６１】
＜実施例２＞
図６は、第３実施形態の処理を説明するためのフローチャートである。
図６の例では、カウント値i∈{0,...,t-1}のうち、i=w・q（wは2以上の整数、qは正の整数）を満たす場合にのみ、入力情報u(i)がハッシュ連鎖値v(j(i))を含む。一方、i≠w・qとなるカウント値iに対応する入力情報u(i)はハッシュ連鎖値v(j(i))を含まない。なお、本形態でも第１実施形態と同様、j(i)=i-1, p(i)=i-1, m(i)=i-2の場合を例にとって説明する。また、以下の処理の前提として、初期値メモリ１０２ｂにハッシュ連鎖値の初期値v(-w)=0kが格納されているものとする。
【００６２】
まず、第２実施形態と同様のステップＳ１０１，Ｓ２０２，Ｓ２０３の処理が実行される。次に、ハッシュ演算部１０６（図３）に、入力部１０３に入力されたxと、カウンタ１０５から出力されたカウント値i(i∈{0,...t-1}, i≠w・q)とが入力される。ハッシュ演算部１０６は、これらの各カウント値i(i∈{0,...t-1}, i≠w・q)に対して式(17)の演算を行い、そのハッシュ値y(i)を出力する（ステップＳ３０４）。この各カウント値iについての式(17)の演算は同時並列に実行されてもよいし、直列的に実行されてもよい。
【００６３】
次に、カウンタ１０５がカウント値iを0に設定する（ステップＳ３１５）。
次に、ハッシュ演算部１０６に、初期値メモリ１０２ｂ又はハッシュ演算部２０９から出力されたハッシュ連鎖値v(i-1)と、入力部１０３に入力されたxと、カウンタ１０５から出力されたカウント値iとが入力される。ハッシュ演算部１０６は、
y(i)=H(v(i-w)||x||<i>)      …(21)
の演算を行い、そのハッシュ値y(i)を出力する（ステップＳ３１６）。
【００６４】
次に、ハッシュ演算部２０９に、初期値メモリ１０２ｂ又はハッシュ演算部２０９から出力されたハッシュ連鎖値v(i-w)と、カウンタ１０５から出力されたカウント値iとが入力される。ハッシュ演算部２０９は、
v(i)=G(v(i-w)||<i>)      …(22)
の演算を行い、そのハッシュ値v(i)をハッシュ連鎖値v(i)として出力する（ステップＳ３１７）。
【００６５】
次に、制御部１０１が、カウンタ１０５から出力されたカウント値iがt-1以上であるか否かを判定する（ステップＳ３１８）。ここで、i≧t−1でないと判定されたならば、カウンタ１０５がi+wを新たなiとしてカウントアップを行い（ステップＳ３１９）、処理がステップＳ３１６に戻される。一方、i≧t−1であると判定されたならば、第２実施形態のステップＳ２１１，Ｓ２１２の処理が実行される。
【００６６】
＜第３実施形態の変形例＞
本発明は第３実施形態に限定されない。例えば、第３実施形態の実施例１，２では、カウント値i∈{0,...,t-1}のうち、i=w・q（wは2以上の整数、qは正の整数）を満たす場合にのみ、入力情報u(i)がハッシュ連鎖値v(j(i))を含む例を説明した。しかし、その他のカウント値i∈{0,...,t-1}の部分集合についてのみ、入力情報u(i)がハッシュ連鎖値v(j(i))を含むこととしてもよい。また、上記の各処理において、前述の第１実施形態の変形例や第２実施形態の変形例で述べた変形がなされてもよい。
【００６７】
〔その他の変形例等〕
上述の各実施形態の処理は、記載に従って時系列に実行されるのみならず、処理を実行する装置の処理能力あるいは必要に応じて並列的にあるいは個別に実行されてもよい。その他、本発明の趣旨を逸脱しない範囲で適宜変更が可能であることはいうまでもない。
また、上述の構成をコンピュータによって実現する場合、各装置が有すべき機能の処理内容はプログラムによって記述される。そして、このプログラムをコンピュータで実行することにより、上記処理機能がコンピュータ上で実現される。
この処理内容を記述したプログラムは、コンピュータで読み取り可能な記録媒体に記録しておくことができる。コンピュータで読み取り可能な記録媒体としては、例えば、磁気記録装置、光ディスク、光磁気記録媒体、半導体メモリ等どのようなものでもよい。
【００６８】
また、このプログラムの流通は、例えば、そのプログラムを記録したＤＶＤ、ＣＤ−ＲＯＭ等の可搬型記録媒体を販売、譲渡、貸与等することによって行う。さらに、このプログラムをサーバコンピュータの記憶装置に格納しておき、ネットワークを介して、サーバコンピュータから他のコンピュータにそのプログラムを転送することにより、このプログラムを流通させる構成としてもよい。
【００６９】
このようなプログラムを実行するコンピュータは、例えば、まず、可搬型記録媒体に記録されたプログラムもしくはサーバコンピュータから転送されたプログラムを、一旦、自己の記憶装置に格納する。そして、処理の実行時、このコンピュータは、自己の記録媒体に格納されたプログラムを読み取り、読み取ったプログラムに従った処理を実行する。また、このプログラムの別の実行形態として、コンピュータが可搬型記録媒体から直接プログラムを読み取り、そのプログラムに従った処理を実行することとしてもよく、さらに、このコンピュータにサーバコンピュータからプログラムが転送されるたびに、逐次、受け取ったプログラムに従った処理を実行することとしてもよい。また、サーバコンピュータから、このコンピュータへのプログラムの転送は行わず、その実行指示と結果取得のみによって処理機能を実現する、いわゆるＡＳＰ（Application Service Provider）型のサービスによって、上述の処理を実行する構成としてもよい。なお、本形態におけるプログラムには、電子計算機による処理の用に供する情報であってプログラムに準ずるもの（コンピュータに対する直接の指令ではないがコンピュータの処理を規定する性質を有するデータ等）を含むものとする。
【産業上の利用可能性】
【００７０】
本発明の利用分野としては、暗号鍵の生成処理や電子署名などの暗号通信分野を例示できる。
【符号の説明】
【００７１】
１００，２００  ビット列生成装置
【図１】
2010286781.tif 000003
【図２】
2010286781.tif 000004
【図３】
2010286781.tif 000005
【図４】
2010286781.tif 000006
【図５】
2010286781.tif 000007
【図６】
2010286781.tif 000008