説明

ハッシュ値演算装置、ハッシュ値演算方法及びハッシュ値演算プログラム

【課題】少ない数の関数を用いつつ、安全性の高いハッシュ関数を構成することを目的とする。
【解決手段】ハッシュ値演算装置10は、3つの異なる非圧縮な内部関数f1,f2,f3を用いて、擬似ランダムオラクルの性質を満たすハッシュ関数を実現する。なお、ハッシュ値演算装置10が実現するハッシュ関数が擬似ランダムオラクルの性質を満たすのは、用いる3つの非圧縮な内部関数f1,f2,f3が、それぞれランダムオラクルの性質を満たす場合である。

【発明の詳細な説明】
【技術分野】
【0001】
この発明は、例えば、安全性の高いハッシュ値を計算する技術に関する。
【背景技術】
【0002】
ハッシュ関数は、任意長の値を入力として、固定長の値を出力する関数である。
【0003】
非特許文献1には、非圧縮な4つの関数f1,f2,f3,f4を用いて擬似ランダムオラクルの性質を満たすハッシュ関数を構成することについての記載がある。ここで、非特許文献1においてハッシュ関数が擬似ランダムオラクルの性質を満たすためには、4つの関数f1,f2,f3,f4がランダムオラクルである必要がある。なお、非圧縮な関数とは、入力長と出力長とが同じ関数である。
【0004】
非特許文献2には、非圧縮な3つの関数f1,f2,f3を用いて、衝突困難性の性質を満たすハッシュ関数を構成することについての記載がある。ここで、非特許文献2においてハッシュ関数が衝突困難性の性質を満たすためには、3つの関数f1,f2,f3がランダムオラクルである必要がある。
【先行技術文献】
【非特許文献】
【0005】
【非特許文献1】Y. Dodis, T. Ristenpart and T. Shrimpton, Salvaging Merkle−Damgard for Practical Applications. EUROCRYPT 2009, pp 371−388, LNCS 5479
【非特許文献2】T. Ristenpart and T. Shrimpton, Building a Collision−Resistant Compression Function from Non−compressing Primitives. ICALP 2008, pp643−654, LNCS5126
【発明の概要】
【発明が解決しようとする課題】
【0006】
非特許文献1に記載されたハッシュ関数は、擬似ランダムオラクルの性質を満たすために4つの異なる関数が必要である。非特許文献2に記載されたハッシュ関数で用いる関数は3つであるが、衝突困難性の性質しか保障しておらず、擬似ランダムオラクルの性質を保障していない。
本発明は、例えば、少ない数の関数を用いつつ、安全性の高いハッシュ関数を構成することを目的とする。
【課題を解決するための手段】
【0007】
この発明に係るハッシュ値演算装置は、
i個(iは1以上の整数)のnビット長(nは1以上の整数)の値m[1],...,値m[i]を入力する既定長値入力部と、
j=1からiまで順に、値w[j−1](値w[0]は固定値IVとする)を入力として関数f1を計算してnビット長の値x[j]を求め、前記既定長値入力部が入力した値m[j]を入力として関数f2を計算してnビット長の値y[j]を求め、値x[j]と値y[j]との排他的論理和を入力として関数f3を計算して値z[j]を求め、値y[j]と値z[j]との排他的論理和を計算して値w[j]を求める第1関数計算部と、
前記第1関数計算部が求めた値w[i]を入力として置換関数pを計算して、nビット長の値aを求める第2関数計算部と、
前記第2関数計算部が求めた値aを入力として前記関数f2を計算してnビット長の値wを求める第3関数計算部と、
前記第3関数計算部が計算した値wを出力する出力部と
を備えることを特徴とする。
【発明の効果】
【0008】
この発明に係るハッシュ値演算装置によれば、3つの関数を用いて、安全性の高いハッシュ関数を構成することができる。
【図面の簡単な説明】
【0009】
【図1】実施の形態1に係るハッシュ値演算装置10の機能を示す機能ブロック図。
【図2】図1に示すハッシュ値演算装置10の動作を示すフローチャート。
【図3】図1に示すハッシュ値演算装置10により実現されるハッシュ関数の構造図。
【発明を実施するための形態】
【0010】
実施の形態1.
まず、ハッシュ関数の安全性の概念について説明する。
【0011】
ランダムオラクルの性質を満たすハッシュ関数は、理想的なハッシュ関数である。
ランダムオラクルの性質を満たすハッシュ関数Hとは、以下の1,2が与えられたハッシュ関数である。
1.(リスト):全ての入力値と、各入力値に対してランダムに選択した出力値とのペアを記録したリストを持つ。
2.(順方向の値を出力するオラクル):入力値xに対し、リストから入力値xに対する出力値zを検索して、値zを出力する。つまり、H(x)=zとなる値zを出力する。
【0012】
ランダムオラクルの性質を満たすハッシュ関数は、「(1)衝突困難性」、「(2)第二原像計算困難性」、「(3)原像計算困難性」の3つの性質を満たす。
(1)〜(3)の各性質の定義は以下の通りである。以下の定義において、「H」は、ハッシュ関数を示す。「M」「M’(≠M)」は、ハッシュ関数Hの入力値を示す。「H(x)」は、xを入力したハッシュ関数Hの出力(ハッシュ値)を示す。
【0013】
(1)衝突困難性を満たすハッシュ関数とは、「H(M)=H(M’)」となる2つの入力値M、M’を見つけることが困難なハッシュ関数である。つまり、衝突困難性とは、ハッシュ値が同じである複数の入力値を求めることが難しいという性質である。
(2)第二原像計算困難性を満たすハッシュ関数とは、ランダムな入力値Mが与えられたとき、「H(M)=H(M’)」を満たす入力値M’を見つけることが困難なハッシュ関数である。つまり、第二原像計算困難性とは、第1の入力値とハッシュ値が同じである第2の入力値を求めることが難しいという性質である。
(3)原像計算困難性を満たすハッシュ関数とは、ランダムな値zが与えられたとき、「z=H(M)」を満たすMを見つけることが困難なハッシュ関数である。つまり、原像計算困難性とは、ハッシュ値に対応する入力値を求めることが難しいという性質である。
【0014】
(1)〜(3)各性質には、(1)衝突困難性を満たすハッシュ関数は(2)第二原像計算困難性を満たし、(2)第二原像計算困難性を満たすハッシュ関数は(3)原像計算困難性を満たすという関係がある。
また、(3)原像計算困難性が破られたハッシュ関数(原像計算困難性を満たさないハッシュ関数)は、(1)衝突困難性、及び、(2)第二原像計算困難性を満たさないという関係がある。つまり、原像計算困難性が破られたハッシュ関数は、安全なハッシュ関数が満たすべき(1)〜(3)の性質を満たさない関数であり、安全性が低いため一般的に使い物にならない。
【0015】
標準的な公開鍵暗号、電子署名アルゴリズムであるRSA−OAEP(RSA−Optimal Asymmetric Encryption Padding)、RSA−KEM(RSA−Key Encapsulation Mechanism)、RSA−PSS(RSA−Probabilistic Signature Scheme)などは、用いられるハッシュ関数がランダムオラクルの性質を満たすと仮定したときに安全なものである。
しかし、ランダムオラクルの性質を満たすハッシュ関数を実現することは困難であることが知られている。そのため、これらの公開鍵暗号、電子署名アルゴリズムを実現する際は、ランダムオラクルの性質を満たすハッシュ関数に代え、SHA−256(Secure Hash Algorithm−256)などのハッシュ関数を用いて運用されている。
【0016】
ランダムオラクルの性質を満たさないハッシュ関数を用いて、上述した公開鍵暗号、電子署名アルゴリズムを実現した場合、その安全性が保証されるとは限らない。しかし、その安全性が保証するための概念として、擬似ランダムオラクルという概念が存在する。
ここで、ハッシュ関数で用いる内部関数をP、Pを用いて構成したハッシュ関数をH[P]とする。H[P]が擬似ランダムオラクルの性質を満たすとは、どんな識別者でも、H[P]とランダムオラクルの性質を満たすハッシュ関数とを識別できないようなPをシミュレートするシミュレータSが存在することである。
【0017】
H[P]が擬似ランダムオラクルの性質を満たすならば、H[P]は(1)衝突困難性、(2)第二原像計算困難性、(3)原像計算困難性の性質を満たす。そして、ランダムオラクルの性質を満たすハッシュ関数を用いた場合に安全な暗号アルゴリズムは、H[P]を用いた場合にも安全であることが保証される。
【0018】
擬似ランダムオラクルの性質を満たすハッシュ関数には、例えば、非特許文献1に記載されたハッシュ関数等がある。非特許文献1に記載されたハッシュ関数等、擬似ランダムオラクルの性質を満たすハッシュ関数は、内部関数としてランダムオラクルの性質を満たす(理想化された)非圧縮な関数を用いて構成される。つまり、非特許文献1に記載されたハッシュ関数等は、内部関数としてランダムオラクルの性質を満たす非圧縮な関数を用いた場合に、擬似ランダムオラクルの性質を満たす。
【0019】
ランダムオラクルの性質を満たす関数f(FILRO(Fixed Input Length Random Oracle))とは、以下の1,2が与えられた関数である。
1.(リスト):全ての入力値と、各入力値に対してランダムに選択した出力値とのペアを記録したリストを持つ。
2.(順方向の値を出力するオラクル):入力値(x)に対し、リストから入力に対する出力値zを検索して、値zを出力する。つまり、f(x)=zとなる値zを出力する。
【0020】
ランダムオラクルの性質を満たす関数を実現することは困難であることが知られている。そのため、非特許文献1に記載されたハッシュ関数等、擬似ランダムオラクルの性質を満たすハッシュ関数を実現する際は、ランダムオラクルの性質を満たす関数に代え、例えば、(1)衝突困難性、(2)第二原像計算困難性、(3)原像計算困難性の3つの性質に相当する性質を満たす関数を用いることが考えられる。つまり、(1)出力値が同じである複数の入力値を求めることが難しいという性質、(2)第1の入力値と出力値が同じである第2の入力値を求めることが難しいという性質、(3)出力値に対応する入力値を求めることが難しいという性質という3つの性質を満たす関数を用いることが考えられる。
この場合、ランダムオラクルの性質を満たす関数を用いていないため、得られたハッシュ関数は、擬似ランダムオラクルの性質を満たすハッシュ関数とはならない。しかし、ランダムオラクルの性質を満たす関数を用いた場合に安全であることが証明されているため、ある程度の安全性があるものと認められる。
【0021】
以下の説明では、非特許文献1に記載されたハッシュ関数と同様に、非圧縮な関数を用いたハッシュ関数について説明する。以下で説明するハッシュ関数は、非特許文献1に記載されたハッシュ関数と同様に、用いる非圧縮な関数がランダムオラクルの性質を満たす場合、擬似ランダムオラクルの性質を満たす。しかし、以下で説明するハッシュ値の計算方法では、非圧縮な関数を3つだけ用いる。したがって、用いる関数の数が少ないため、例えば、以下で説明するハッシュ値の計算方法を回路で実現した場合、回路規模を小さくすることができる。
【0022】
なお、以下の説明では、内部関数として、異なる3つの非圧縮な関数f1,f2,f3を用いる。また、関数f1,f2,f3の入力長及び出力長をnビット(nは1以上の整数)とする。また、pをnビットの置換関数とし、任意のxに対してp(x)≠xを満たす関数とする。例えば、p(a)=a+1がその例であり、pは容易に実現可能な関数(非常に小さな回路で実現可能な関数)なので、内部関数には数えず、ハッシュ関数の構造の一部とみなしている。
【0023】
図1は、実施の形態1に係るハッシュ値演算装置10の機能を示す機能ブロック図である。
図2は、図1に示すハッシュ値演算装置10の動作を示すフローチャートである。
図3は、図1に示すハッシュ値演算装置10により実現されるハッシュ関数の構造図である。
【0024】
図1に示すハッシュ値演算装置10の機能と動作について、図2、図3を用いて説明する。
図1に示すハッシュ値演算装置10は、任意長値入力部11、パディング部12、分割部13、既定長値入力部14、関数計算部15、出力部16を備える。
【0025】
(S1:任意長値入力ステップ)
任意長値入力部11は、任意ビット長の値Mを入力装置により入力する。
【0026】
(S2:パディングステップ)
パディング部12は、(S1)で入力された値Mに対して、パディング関数padを用いて、所定の値を付加してnビットのi倍(iは1以上の整数)のビット長の値M’を処理装置により生成して記憶装置に記憶する。
パディング関数padとしては、例えば、M’=pad(M)=M||1||0...0||<M>などがある。ここで、<M>は、例えば、64ビットの値であり、Mのビット長情報を含む値である。つまり、パディング部12は、先頭が“1”で、その後が複数の“0”で、最後に<M>となるビット列を生成して、値Mに付加して、値M’を生成する。なお、M’がnの倍数のビット長となるように0の個数が決定される。
【0027】
(S3:分割ステップ)
分割部13は、(S2)で生成された値M’を処理装置により、先頭からnビット毎にi個に分割して、nビット長の値m[1],...,値m[i]を生成して記憶装置に記憶する。
【0028】
(S4:既定長値入力ステップ)
既定長値入力部14は、分割部13が生成したnビット長のi個の値m[1],...,値m[i]を入力装置により入力する。
【0029】
(S5:関数計算ステップ)
関数計算ステップは、(S51)から(S55)までの5つのステップを備える。
まず、関数計算部15は、w[0]にIVを設定して記憶装置に記憶する(S51)。ここで、IVは、nビットの固定値である。
【0030】
続いて、第1関数計算部151は、j=1,...,iの各jについて順に、(S52)から(S54)を実行する。
第1関数計算部151は、処理装置により、x[j]=f1(w[j−1]),y[j]=f2(m[j])を計算する(S52)。つまり、第1関数計算部151は、nビット長の値w[j−1]を入力として、関数f1を計算してnビット長の値x[j]を求めるとともに、nビット長の値m[j]を入力として、関数f2を計算してnビット長の値y[j]を求める。
次に、第1関数計算部151は、処理装置により、z[j]=f3(x[j]^y[j])を計算する(S53)。ここで、x[j]^y[j]は、x[j]とy[j]との排他的論理和である。つまり、第1関数計算部151は、nビット長の値x[j]とnビット長の値y[j]との排他的論理和を計算するとともに、計算した(nビット長の)排他的論理和を入力として、関数f3を計算してnビット長の値z[j]を求める。
そして、第1関数計算部151は、処理装置により、w[j]=y[j]^z[j]を計算する(S54)。つまり、第1関数計算部151は、nビット長の値y[j]とnビット長の値z[j]との排他的論理和を計算してnビット長の値w[j]を求める。
j=1,...,iの各jについて順に(S52)から(S54)が実行されることにより、w[i]が計算される。
【0031】
次に、第2関数計算部152は、処理装置により、a=p(w[i])を計算する(S55)。つまり、第2関数計算部152は、nビット長の値w[i]を入力として、置換関数pを計算してnビット長の値aを求める。
【0032】
そして、第3関数計算部153は、処理装置により、w=f1(a)を計算する(S56)。つまり、第3関数計算部153は、nビット長の値aを入力として、関数f1を計算してnビット長の値wを求める。
【0033】
(S6:出力ステップ)
出力部16は、関数計算部15が求めたnビット長の値wをハッシュ値として、出力装置から出力する。
【0034】
なお、必ずしも上述した処理順序通りに計算する必要はなく、ストリーム処理ができる場合には、ストリーム処理で計算してもよい。ストリーム処理とは、入力された先頭のビットから到着順に処理を行う方法であり、並列処理の一類型である。
【0035】
また、内部関数f1,f2,f3としては、例えば、3つのブロック暗号の暗号化関数を用いてもよい。
ブロック暗号の暗号化関数Eは、鍵kと、平文情報mとを入力として、平文情報mと同じビット長の暗号文cを計算する関数である。つまり、c=E(k,m)である。なお、暗号化関数Eを暗号処理で用いる場合、暗号文cを作成す者及び復号する者以外には鍵kは秘密にされる。
ここで、任意の値*に対して、E(k,*)は、任意の値*を他の値に置換する置換関数となる。そのため、関数Eをハッシュ関数における内部関数として用いることができる。なお、この場合、鍵kは公開パラメータとされる。
例えば、E1,E2,E3をブロック暗号の暗号化関数、k[1],k[2],k[3]を公開パラメータとした場合、関数f1,f2,f3を、f1(a)=E1(k[1],a)^a、f2(a)=E2(k[2],a)^a、f3(a)=E3(k[3],a)^aとしてもよい。ここで、k[t]≠k[s]ならば、Et=Esであってもよい。
【0036】
また、P1,P2,P3をそれぞれ異なる置換関数とした場合、関数f1,f2,f3を、f1(a)=P1(a)^a、f2(a)=P2(a)^a、f3(a)=P3(a)^aとしてもよい。
特に、P1,P2,P3は、(1)出力値が同じである複数の入力値を求めることが難しいという性質、(2)第1の入力値と出力値が同じである第2の入力値を求めることが難しいという性質、(3)出力値に対応する入力値を求めることが難しいという性質という3つの性質を満たす置換関数であることが望ましい。
【0037】
以上に説明したハッシュ値演算装置10は、例えば、回路やソフトウェア等で構成される。回路で構成される場合には、上記説明における処理装置は、例えば演算回路であり、記憶装置は、例えばレジスタである。また、ソフトウェアで構成される場合には、上記説明における処理装置は、例えばCPU(Central Processing Unit)であり、記憶装置は、例えばRAM(Random Access Memory)である。また、上記説明における入力装置は、例えばキーボード、通信ボードであり、出力装置は、例えばLCD(Liquid Crystal Display)等の表示装置、通信ボード、レジスタやRAM等の記憶装置である。もちろん、これらに限定されるものではない。
なお、ハッシュ値演算装置10を回路で構成する場合、上述した「〜部」を「〜回路」と読み変えてもよい。また、上述した「〜部」は、「〜処理」、「〜装置」、「〜機器」、「〜手段」、「〜手順」、「〜機能」と読み替えてもよい。つまり、「〜部」として説明するものは、ROM(Read Only Memory)に記憶されたファームウェアで実現されていても構わない。或いは、ソフトウェアのみ、或いは、素子・デバイス・基板・配線などのハードウェアのみ、或いは、ソフトウェアとハードウェアとの組み合わせ、さらには、ファームウェアとの組み合わせで実現されても構わない。
【0038】
ハッシュ関数は計算機パワーのない小型なもので実装することがあるため、回路規模が小さいものが望ましい。上述したように、ハッシュ値演算装置10は、3つの内部関数で構成でき、内部関数が少ないため、回路規模を小さくすることができる。
【符号の説明】
【0039】
10 ハッシュ値演算装置、11 任意長値入力部、12 パディング部、13 分割部、14 既定長値入力部、15 関数計算部、151 第1関数計算部、152 第2関数計算部、153 第3関数計算部、16 出力部。

【特許請求の範囲】
【請求項1】
i個(iは1以上の整数)のnビット長(nは1以上の整数)の値m[1],...,値m[i]を入力する既定長値入力部と、
j=1からiまで順に、値w[j−1](値w[0]は固定値IVとする)を入力として関数f1を計算してnビット長の値x[j]を求め、前記既定長値入力部が入力した値m[j]を入力として関数f2を計算してnビット長の値y[j]を求め、値x[j]と値y[j]との排他的論理和を入力として関数f3を計算して値z[j]を求め、値y[j]と値z[j]との排他的論理和を計算して値w[j]を求める第1関数計算部と、
前記第1関数計算部が求めた値w[i]を入力として置換関数pを計算して、nビット長の値aを求める第2関数計算部と、
前記第2関数計算部が求めた値aを入力として前記関数f1を計算してnビット長の値wを求める第3関数計算部と、
前記第3関数計算部が計算した値wを出力する出力部と
を備えることを特徴とするハッシュ値演算装置。
【請求項2】
前記ハッシュ値演算装置は、さらに、
任意ビット長の値Mを入力する任意長値入力部と、
前記任意長値入力部が入力した値Mに対して、所定の値を付加してnビット長のi倍のビット長の値M’を生成して記憶装置に記憶するパディング部と、
前記パディング部が生成した値M’を分割して、nビット長の値m[1],...,値m[i]を生成して記憶装置に記憶する分割部とを備え、
前記既定長値入力部は、前記分割部が生成した値m[1],...,値m[i]を入力する
ことを特徴とする請求項1に記載のハッシュ値演算装置。
【請求項3】
前記関数f1,f2,f3は、それぞれ、nビットの値が入力された場合に、nビットの暗号文cを計算する暗号化関数E1,E2,E3である
ことを特徴とする請求項1又は2に記載のハッシュ値演算装置。
【請求項4】
前記関数f1,f2,f3は、それぞれ、nビットの入力値が入力された場合に、nビットの暗号文を計算する暗号化関数E1,E2,E3を用いて、入力値に対する暗号文を計算するとともに、計算した暗号文と、前記入力値との排他的論理和を計算して出力する関数である
ことを特徴とする請求項1又は2に記載のハッシュ値演算装置。
【請求項5】
前記関数f1,f2,f3は、それぞれ、nビットの入力値が入力された場合に、前記入力値とは異なるnビットの出力値を計算する置換関数を用いて、入力値に対する出力値を計算するとともに、計算した出力値と、前記入力値との排他的論理和を計算して出力する関数である
ことを特徴とする請求項1又は2に記載のハッシュ値演算装置。
【請求項6】
i個(iは1以上の整数)のnビット長(nは1以上の整数)の値m[1],...,値m[i]を入力する既定長値入力ステップと、
j=1からiまで順に、値w[j−1](値w[0]は固定値IVとする)を入力として関数f1を計算してnビット長の値x[j]を求め、前記既定長値入力ステップで入力した値m[j]を入力として関数f2を計算してnビット長の値y[j]を求め、値x[j]と値y[j]との排他的論理和を入力として関数f3を計算して値z[j]を求め、値y[j]と値z[j]との排他的論理和を計算して値w[j]を求める第1関数計算ステップと、
前記第1関数計算ステップで求めた値w[i]を入力として置換関数pを計算して、nビット長の値aを求める第2関数計算ステップと、
前記第2関数計算ステップで求めた値aを入力として前記関数f1を計算してnビット長の値wを求める第3関数計算ステップと、
前記第3関数計算ステップで計算した値wを出力する出力ステップと
を備えることを特徴とするハッシュ値演算方法。
【請求項7】
i個(iは1以上の整数)のnビット長(nは1以上の整数)の値m[1],...,値m[i]を入力する既定長値入力処理と、
j=1からiまで順に、値w[j−1](値w[0]は固定値IVとする)を入力として関数f1を計算してnビット長の値x[j]を求め、前記既定長値入力処理で入力した値m[j]を入力として関数f2を計算してnビット長の値y[j]を求め、値x[j]と値y[j]との排他的論理和を入力として関数f3を計算して値z[j]を求め、値y[j]と値z[j]との排他的論理和を計算して値w[j]を求める第1関数計算処理と、
前記第1関数計算処理で求めた値w[i]を入力として置換関数pを計算して、nビット長の値aを求める第2関数計算処理と、
前記第2関数計算処理で求めた値aを入力として前記関数f1を計算してnビット長の値wを求める第3関数計算処理と、
前記第3関数計算処理で計算した値wを出力する出力処理と
をコンピュータに実行させることを特徴とするハッシュ値演算プログラム。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate