(57)【特許請求の範囲】
【請求項１】
任意ビット長の値Ｍを入力する任意長値入力部と、
前記任意長値入力部が入力した値Ｍを入力として、関数Ｆを計算してｔビット長（ｔは１以上の整数）の値ｗを求める関数計算部と、
前記関数計算部が求めた値ｗを入力として、関数ｇを計算してｄビット長（ｄはｔ以上の整数）の値ｋを求める鍵成分計算部と、
前記鍵成分計算部が求めた値ｋを鍵成分とし、ｎビット長の所定の値ｃ１を平文成分として、ブロック暗号の暗号化関数Ｅ１を計算してｎビット長（ｎは１以上の整数）の値ｙを求める暗号化関数Ｅ１計算部と、
前記鍵成分計算部が求めた値ｋを鍵成分とし、ｎビット長の所定の値ｃ２を平文成分として、ブロック暗号の暗号化関数Ｅ２を計算してｎビット長の値ｙｙを求める暗号化関数Ｅ２計算部と、
前記暗号化関数Ｅ１計算部が求めた値ｙと、前記暗号化関数Ｅ２計算部が求めた値ｙｙとを入力として、関数ｈを計算してｎ’ビット長（ｎ’は１以上２ｎ以下の整数）の値ｚをハッシュ値として求めるハッシュ値計算部と
を備えることを特徴とするハッシュ値演算装置。
【請求項２】
任意ビット長の値Ｍを入力する任意長値入力部と、
前記任意長値入力部が入力した値Ｍを入力として、関数Ｆを計算してｔビット長（ｔは１以上の整数）の値ｗを求める関数計算部と、
前記関数計算部が求めた値ｗを入力として、関数Ｇを計算してｄビット長（ｄはｔ以上の整数）の値ｋを求める鍵成分計算部と、
前記鍵成分計算部が求めた値ｋを鍵成分とし、ｎビット長の値ｃ１を平文成分として、ブロック暗号の暗号化関数Ｅ１を計算してｎビット長（ｎは１以上の整数）の値ｙを求める暗号化関数Ｅ１計算部と、
前記暗号化関数Ｅ１計算部が求めた値ｙを入力として、関数Ｈを計算してｎ’ビット長（ｎ’は１以上ｎ以下の整数）の値ｚをハッシュ値として求めるハッシュ値計算部と
を備えることを特徴とするハッシュ値演算装置。
【請求項３】
前記関数計算部は、
前記任意長値入力部が入力した値Ｍに対して、所定の値を付加して（Ｌ’＋Ｌ（ｉ−１））ビット長（Ｌ’は１以上ｄ以下の整数、Ｌは１以上ｄ−ｎ以下の整数、ｉは１以上の整数）の値Ｍ’を生成するパディング部と、
前記パディング部が生成した値Ｍ’を分割して、Ｌ’ビット長の値ｍ［１］と、Ｌビット長の値ｍ［２］，．．．，値ｍ［ｉ］を生成する分割部と、
前記分割部が生成した値ｍ［１］を入力として、関数Ｔ［１］を計算してｄビット長の値ｋ［１］を求める鍵成分ｋ１計算部と、
ｊ＝１からｉまで順に、値ｋ［ｊ］を鍵成分とし、ｎビット長の値ｙ［ｊ−１］（値ｙ［０］は固定値ＩＶとする）を平文成分として、ブロック暗号の暗号化関数Ｅｊ，１を計算してｎビット長の値ｘ［ｊ］を求める暗号化関数Ｅｊ，１計算部と、
ｊ＝１からｉまで順に、前記値ｙ［ｊ−１］と、前記暗号化関数Ｅｊ，１計算部が計算した値ｘ［ｊ］とを入力として、関数Ｒ［ｊ］を計算してｎビット長の値ｙ［ｊ］を求める関数Ｒ計算部と、
ｊ＝１からｉまで順に、前記値ｙ［ｊ−１］を入力として、関数ｐ［ｊ］を計算してｎビット長の値ｖｖ［ｊ］を求める関数ｐ計算部と、
ｊ＝１からｉまで順に、前記値ｋ［ｊ］を鍵成分とし、前記関数ｐ計算部が求めた値ｖｖ［ｊ］を平文成分として、ブロック暗号の暗号化関数Ｅｊ，２を計算してｎビット長の値ｘｘ［ｊ］を求める暗号化関数Ｅｊ，２計算部と、
ｊ＝１からｉまで順に、前記暗号化関数Ｅｊ，２計算部が求めた値ｘｘ［ｊ］を入力と
して、関数Ｓ［ｊ］を計算してｎビット長の値ｙｙ［ｊ］を求める関数Ｓ計算部と、
ｊ＝２からｉまで順に、前記分割部が生成した値ｍ［ｊ］と、前記関数Ｓ計算部が計算した値ｙｙ［ｊ−１］とを入力として、関数Ｔ［ｊ］を計算してｄビット長の値ｋ［ｊ］を求める鍵成分ｋｊ計算部と、
前記関数Ｒ計算部が求めた値ｙ［ｉ］と、前記関数Ｓ計算部が求めた値ｙｙ［ｉ］とを入力として、関数Ｖを計算して２ｎビット長の前記値ｗを求める関数Ｖ計算部と
を備えることを特徴とする請求項１又は２に記載のハッシュ値演算装置。
【請求項４】
前記関数計算部は、
前記任意長値入力部が入力した値Ｍに対して、所定の値を付加して（Ｌ’＋Ｌ（ｉ−１））ビット長（Ｌ’は１以上ｄ以下の整数、Ｌは１以上ｄ−２ｎ以下の整数、ｉは１以上の整数）の値Ｍ’を生成するパディング部と、
前記パディング部が生成した値Ｍ’を分割して、Ｌ’ビット長の値ｍ［１］と、Ｌビット長の値ｍ［２］，．．．，値ｍ［ｉ］を生成する分割部と、
前記分割部が生成した値ｍ［１］を入力として、関数ｇ［１］を計算してｄビット長の値ｋ［１］を求める鍵成分ｋ１計算部と、
ｊ＝１からｉまで順に、値ｋ［ｊ］を鍵成分とし、ｎビット長の所定の値ｃｊ，１を平文成分として、ブロック暗号の暗号化関数Ｅｊ，１を計算してｎビット長の値ｙ［ｊ］を求める暗号化関数Ｅｊ，１計算部と、
ｊ＝１からｉまで順に、前記値ｋ［ｊ］を鍵成分とし、ｎビット長の所定の値ｃｊ，２を平文成分として、ブロック暗号の暗号化関数Ｅｊ，２を計算してｎビット長の値ｙｙ［ｊ］を求める暗号化関数Ｅｊ，２計算部と、
ｊ＝１からｉまで順に、前記暗号化関数Ｅｊ，１計算部が求めた値ｙ［ｊ］と、前記暗号化関数Ｅｊ，２計算部が求めた値ｙｙ［ｊ］とを入力として、関数ｈ［ｊ］を計算して２ｎビット長の値ｗ［ｊ］を求める関数ｈ計算部と、
ｊ＝２からｉまで順に、前記分割部が生成した値ｍ［ｊ］と、前記関数ｈ計算部が計算した値ｗ［ｊ−１］とを入力として、関数ｈ［ｊ］を計算してｄビット長の値ｋ［ｊ］を求める鍵成分ｋｊ計算部と、
前記関数ｈ計算部が求めた値ｗ［ｉ］を入力として、関数ｈ’を計算してｔビット長の前記値ｗを求める関数ｈ’計算部と
を備えることを特徴とする請求項１又は２に記載のハッシュ値演算装置。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、例えば、安全性の高いハッシュ値を計算する技術に関する。
【背景技術】
【０００２】
ハッシュ関数は、任意長の値を入力として、固定長の値を出力する関数である。
【０００３】
非特許文献１〜３には、出力長がｎビットのブロック暗号の暗号化関数を用いて、衝突困難性の性質を満たす出力長が２ｎビットのハッシュ関数の構成法についての記載がある。
ここで、非特許文献１〜３におけるハッシュ関数が衝突困難性の性質を満たすためには、用いる暗号化関数が理想化されたブロック暗号における暗号化関数である必要がある。
【０００４】
非特許文献４，５には、出力長がｓビットのブロック暗号の暗号化関数を用いて、擬似ランダムオラクルの性質を満たす出力長がｎビットのハッシュ関数の構成法についての記載がある。但し、ｓはｎ以上の整数である。
ここで、非特許文献４，５におけるハッシュ関数が擬似ランダムオラクルの性質を満たすためには、用いる暗号化関数が理想化されたブロック暗号における暗号化関数である必要がある。また、非特許文献４，５におけるハッシュ関数の安全性のセキュリティレベルはＯ（２ｓ／２）以下である。なお、安全性のセキュリティレベルとは、擬似ランダムオラクルの性質を破るために必要となる計算量である。
【０００５】
非特許文献６には、入出力が固定長でありランダムオラクルの性質を満たす関数と、ＰｒＡ（Ｐｒｅｉｍａｇｅ  Ａｗａｒｅ）の性質を満たす任意長入力、固定長出力の関数とを用いて、擬似ランダムオラクルの性質を満たすハッシュ関数を構成することについての記載がある。非特許文献６では、ＰｒＡの性質をもつ関数として、出力長がｎビットのブロック暗号の暗号化関数を用いている。
ここで、非特許文献６におけるハッシュ関数が、擬似ランダムオラクルの性質を満たすためには、用いる暗号化関数が理想化されたブロック暗号における暗号化関数である必要がある。
【先行技術文献】
【非特許文献】
【０００６】
【非特許文献１】Ｏ．  Ｏｚｅｎ  ａｎｄ  Ｍ．  Ｓｔａｍ．  Ａｎｏｔｈｅｒ  Ｇｌａｎｃｅ  ａｔ  Ｄｏｕｂｌｅ−ｌｅｎｇｔｈ  Ｈａｓｈｉｎｇ．  ＩＭＡ  Ｉｎｔ．  Ｃｏｎｆ．  ２００９．  ｐｐ１７６−２０１．  ＬＮＣＳ  ５９２１．
【非特許文献２】Ｓ．  Ｈｉｒｏｓｅ．  Ｓｏｍｅ  Ｐｌａｕｓｉｂｌｅ  Ｃｏｎｓｔｒｕｃｔｉｏｎｓ  ｏｆ  Ｄｏｕｂｌｅ−Ｂｌｏｃｋ−ｌｅｎｇｔｈ  Ｈａｓｈ  Ｆｕｎｃｔｉｏｎｓ．  ＦＳＥ  ２００６．  ２１０−２２５．  ＬＮＣＳ  ４０４７．
【非特許文献３】Ｘ．  Ｌａｉ  ａｎｄ  Ｊ．  Ｍａｓｓｅｙ：  Ｈａｓｈ  Ｆｕｎｃｔｉｏｎ  Ｂａｓｅｄ  ｏｎ  Ｂｌｏｃｋ  Ｃｉｐｈｅｒｓ．  ＥＵＲＯＣＲＹＰＴ  １９９２．  ｐｐ５５−７０．  ＬＮＣＳ  ６５３．
【非特許文献４】Ｓｈｏｉｃｈｉ  Ｈｉｒｏｓｅ，  Ｊｅ．  Ｐａｒｋ，  ａｎｄ  Ａ．  Ｙｕｎ．  Ａ  Ｓｉｍｐｌｅ  Ｖａｒｉａｎｔ  ｏｆ  ｔｈｅ  Ｍｅｒｋｌｅ−Ｄａｍｇａｒｄ  Ｓｃｈｅｍｅ  ｗｉｔｈ  ａ  Ｐｅｒｍｕｔａｔｉｏｎ．  ＡＳＩＡＣＲＹＰＴ  ２００７．  ｐｐ１１３−１２９．  ＬＮＣＳ  ４８３３．
【非特許文献５】Ｊ．−Ｓ．  Ｃｏｒｏｎ，  Ｙ．  Ｄｏｄｉｓ，  Ｃ．  Ｍａｌｉｎａｕｄ，  ａｎｄ  Ｐ．  Ｐｕｎｉｙａ．  Ｍｅｒｋｌｅ−Ｄａｍｇａｒｄ  Ｒｅｖｉｓｉｔｅｄ：  Ｈｏｗ  ｔｏ  Ｃｏｎｓｔｒｕｃｔ  ａ  Ｈａｓｈ  Ｆｕｎｃｔｉｏｎ．  ＣＲＹＰＴＯ  ２００５．  ｐｐ４３０−４４８．  ＬＮＣＳ  ３６２１．
【非特許文献６】Ｙ．  Ｄｏｄｉｓ，  Ｔ．  Ｒｉｓｔｅｎｐａｒｔ，  ａｎｄ  Ｔ．  Ｓｈｒｉｍｐｔｏｎ．  Ｓａｌｖａｇｉｎｇ  Ｍｅｒｋｌｅ−Ｄａｍｇａｒｄ  ｆｏｒ  Ｐｒａｃｔｉｃａｌ  Ａｐｐｌｉｃａｔｉｏｎｓ．  ＥＵＲＯＣＲＹＰＴ  ２００９．  ｐｐ３７１−３８８．  ＬＮＣＳ  ５４７９．
【発明の概要】
【発明が解決しようとする課題】
【０００７】
非特許文献１〜３に記載されたハッシュ関数は、ブロック暗号の暗号化関数を用いたハッシュ関数であるが、擬似ランダムオラクルの性質を満たさない。
非特許文献４，５に記載されたハッシュ関数は、ブロック暗号の暗号化関数を用いたハッシュ関数である。そして、このハッシュ関数は、用いる暗号化関数が理想化されたブロック暗号における暗号化関数で、その出力長がｎビットの場合、擬似ランダムオラクルの性質を満たすものの、安全性のセキュリティレベルがＯ（２ｎ／２）である。
非特許文献６に記載されたハッシュ関数は、入出力が固定長でありランダムオラクルの性質を満たす関数を使う必要がある。
この発明は、例えば、ランダムオラクルの性質を満たす関数を用いることなく、出力長がｎビット長のブロック暗号の暗号化関数を用いて、擬似ランダムオラクルの性質を満たし、かつ、安全性のセキュリティレベルが少なくともＯ（２ｎ）となるハッシュ関数を構成することを目的とする。
【課題を解決するための手段】
【０００８】
この発明に係るハッシュ値演算装置は、
任意ビット長の値Ｍを入力する任意長値入力部と、
前記任意長値入力部が入力した値Ｍを入力として、関数Ｆを計算してｔビット長（ｔは１以上の整数）の値ｗを求める関数計算部と、
前記関数計算部が求めた値ｗを入力として、関数ｇを計算してｄビット長（ｄはｔ以上の整数）の値ｋを求める鍵成分計算部と、
前記鍵成分計算部が生成した値ｋを鍵成分とし、ｎビット長の所定の値ｃ１を平文成分として、ブロック暗号の暗号化関数Ｅ１を計算してｎビット長（ｎは１以上の整数）の値ｙを求める暗号化関数Ｅ１計算部と、
前記鍵成分計算部が生成した値ｋを鍵成分とし、ｎビット長の所定の値ｃ２を平文成分として、ブロック暗号の暗号化関数Ｅ２を計算してｎビット長の値ｙｙを求める暗号化関数Ｅ２計算部と、
前記暗号化関数Ｅ１計算部が求めた値ｙと、前記暗号化関数Ｅ２計算部が求めた値ｙｙとを入力として、関数ｈを計算してｎ’ビット長（ｎ’は１以上２ｎ以下の整数）の値ｚをハッシュ値として求めるハッシュ値計算部と
を備えることを特徴とする。
【発明の効果】
【０００９】
この発明に係るハッシュ値演算装置によれば、用いるブロック暗号の暗号化関数が理想化されたブロック暗号における暗号化関数であれば、擬似ランダムオラクルの性質を満たし、かつ、安全性のセキュリティレベルがＯ（２ｎ）（ｎは暗号化関数の出力長）となるハッシュ関数を構成することができる。
【図面の簡単な説明】
【００１０】
【図１】実施の形態１に係るハッシュ値演算装置１０の機能を示す機能ブロック図。
【図２】図１に示す実施の形態１に係るハッシュ値演算装置１０の動作を示すフローチャート。
【図３】図１に示す実施の形態１に係るハッシュ値演算装置１０により実現されるハッシュ関数の構造図。
【図４】実施の形態２に係るハッシュ値演算装置１０の機能を示す機能ブロック図。
【図５】図４に示す実施の形態２に係るハッシュ値演算装置１０の動作を示すフローチャート。
【図６】図４に示す実施の形態２に係るハッシュ値演算装置１０により実現されるハッシュ関数の構造図。
【図７】実施の形態３に係る関数計算部１２の機能を示す機能ブロック図。
【図８】図７に示す実施の形態３に係る関数計算部１２の動作を示すフローチャート。
【図９】図７に示す実施の形態３に係る関数計算部１２により実現される関数Ｆの構造図。
【図１０】実施の形態４に係る関数計算部１２の機能を示す機能ブロック図。
【図１１】図１０に示す実施の形態４に係る関数計算部１２の動作を示すフローチャート。
【図１２】図１０に示す実施の形態４に係る関数計算部１２により実現されるハッシュ関数の構造図。
【発明を実施するための形態】
【００１１】
実施の形態１．
まず、ハッシュ関数の安全性の概念について説明する。
【００１２】
ランダムオラクルの性質を満たすハッシュ関数は、理想的なハッシュ関数である。
ランダムオラクルの性質を満たすハッシュ関数Ｈとは、以下の１，２が与えられたハッシュ関数である。
１．（リスト）：全ての入力値と、各入力値に対してランダムに選択した出力値とのペアを記録したリストを持つ。
２．（順方向の値を出力するオラクル）：入力値ｘに対し、リストから入力値ｘに対する出力値ｚを検索して、値ｚを出力する。つまり、Ｈ（ｘ）＝ｚとなる値ｚを出力する。
【００１３】
ランダムオラクルの性質を満たすハッシュ関数は、「（１）衝突困難性」、「（２）第二原像計算困難性」、「（３）原像計算困難性」の３つの性質を満たす。
（１）〜（３）の各性質の定義は以下の通りである。以下の定義において、「Ｈ」は、ハッシュ関数を示す。「Ｍ」「Ｍ’（≠Ｍ）」は、ハッシュ関数Ｈの入力値を示す。「Ｈ（ｘ）」は、ｘを入力したハッシュ関数Ｈの出力（ハッシュ値）を示す。
【００１４】
（１）衝突困難性を満たすハッシュ関数とは、「Ｈ（Ｍ）＝Ｈ（Ｍ’）」となる２つの入力値Ｍ、Ｍ’を見つけることが困難なハッシュ関数である。つまり、衝突困難性とは、ハッシュ値が同じである複数の入力値を求めることが難しいという性質である。
（２）第二原像計算困難性を満たすハッシュ関数とは、ランダムな入力値Ｍが与えられたとき、「Ｈ（Ｍ）＝Ｈ（Ｍ’）」を満たす入力値Ｍ’を見つけることが困難なハッシュ関数である。つまり、第二原像計算困難性とは、第１の入力値とハッシュ値が同じである第２の入力値を求めることが難しいという性質である。
（３）原像計算困難性を満たすハッシュ関数とは、ランダムな値ｚが与えられたとき、「ｚ＝Ｈ（Ｍ）」を満たすＭを見つけることが困難なハッシュ関数である。つまり、原像計算困難性とは、ハッシュ値に対応する入力値を求めることが難しいという性質である。
【００１５】
（１）〜（３）各性質には、（１）衝突困難性を満たすハッシュ関数は（２）第二原像計算困難性を満たし、（２）第二原像計算困難性を満たすハッシュ関数は（３）原像計算困難性を満たすという関係がある。
また、（３）原像計算困難性が破られたハッシュ関数（原像計算困難性を満たさないハッシュ関数）は、（１）衝突困難性、及び、（２）第二原像計算困難性を満たさないという関係がある。つまり、原像計算困難性が破られたハッシュ関数は、安全なハッシュ関数が満たすべき（１）〜（３）の性質を満たさない関数であり、安全性が低いため一般的に使い物にならない。
【００１６】
標準的な公開鍵暗号、電子署名アルゴリズムであるＲＳＡ−ＯＡＥＰ（ＲＳＡ−Ｏｐｔｉｍａｌ  Ａｓｙｍｍｅｔｒｉｃ  Ｅｎｃｒｙｐｔｉｏｎ  Ｐａｄｄｉｎｇ）、ＲＳＡ−ＫＥＭ（ＲＳＡ−Ｋｅｙ  Ｅｎｃａｐｓｕｌａｔｉｏｎ  Ｍｅｃｈａｎｉｓｍ）、ＲＳＡ−ＰＳＳ（ＲＳＡ−Ｐｒｏｂａｂｉｌｉｓｔｉｃ  Ｓｉｇｎａｔｕｒｅ  Ｓｃｈｅｍｅ）などは、用いられるハッシュ関数がランダムオラクルの性質を満たすと仮定したときに安全なものである。
しかし、ランダムオラクルの性質を満たすハッシュ関数を実現することは困難であることが知られている。そのため、これらの公開鍵暗号、電子署名アルゴリズムを実現する際は、ランダムオラクルの性質を満たすハッシュ関数に代え、ＳＨＡ−２５６（Ｓｅｃｕｒｅ  Ｈａｓｈ  Ａｌｇｏｒｉｔｈｍ−２５６）などのハッシュ関数を用いて運用されている。
【００１７】
ランダムオラクルの性質を満たさないハッシュ関数を用いて、上述した公開鍵暗号、電子署名アルゴリズムを実現した場合、その安全性が保証されるとは限らない。しかし、その安全性を保証するための概念として、擬似ランダムオラクルという概念が存在する。
ここで、ハッシュ関数で用いる内部関数をＰ、Ｐを用いて構成したハッシュ関数をＨ［Ｐ］とする。Ｈ［Ｐ］が擬似ランダムオラクルの性質を満たすとは、どんな識別者でも、Ｈ［Ｐ］とランダムオラクルの性質を満たすハッシュ関数とを識別できないようなＰをシミュレートするシミュレータＳが存在することである。
【００１８】
Ｈ［Ｐ］が擬似ランダムオラクルの性質を満たすならば、Ｈ［Ｐ］は（１）衝突困難性、（２）第二原像計算困難性、（３）原像計算困難性の性質を満たす。そして、ランダムオラクルの性質を満たすハッシュ関数を用いた場合に安全な暗号アルゴリズムは、Ｈ［Ｐ］を用いた場合にも安全であることが保証される。
【００１９】
ＰｒＡの性質を満たすハッシュ関数とは、ハッシュ関数で用いる内部関数をＰ、Ｐを用いて構成したハッシュ関数をＨ［Ｐ］とすると、Ｈ［Ｐ］は衝突困難性を満たし、かつ、選択原像計算困難性を満たすというハッシュ関数である。
ここで、Ｈ［Ｐ］が選択原像計算困難性を満たす場合とは、任意の攻撃者Ａがハッシュ関数の出力値ｚを決め（但し、この時点では、Ａはその入力値を知らない）、攻撃者Ａはｚの入力値を求めようとした場合に、求めることができない場合である。
【００２０】
ブロック暗号（Ｅ，Ｄ）は、Ｅは暗号化関数、Ｄは復号関数である。暗号化関数Ｅは、ｄビットとｎビットの２つの値を入力とし、ｎビットの値を出力する。ｄビットの値を値ｋと固定した場合、Ｅ（ｋ，・）はｎビットの置換関数となる。
ｋを固定し、順方向の置換計算するのが関数Ｅ（ｋ，・）とすると、復号関数Ｄは逆方向の置換計算する関数Ｅ−１（ｋ，・）である。
理想化されたブロック暗号とは、全てのブロック暗号の関数の集合からランダムに１つブロック暗号の関数を取ってきた場合におけるブロック暗号の関数のことである。
【００２１】
理想化されたブロック暗号を実現することは困難であることが知られている。そのため、非特許文献４，５に記載されたハッシュ関数等、擬似ランダムオラクルの性質を満たすハッシュ関数を実現する際は、理想化されたブロック暗号の代わりに、例えば、（１）衝突困難性、（２）第二原像計算困難性、（３）原像計算困難性の３つの性質に相当する性質を満たす関数を用いることが考えられる。つまり、（１）出力値が同じである複数の入力値を求めることが難しいという性質、（２）第１の入力値と出力値が同じである第２の入力値を求めることが難しいという性質、（３）出力値に対応する入力値を求めることが難しいという性質という３つの性質を満たす関数を用いることが考えられる。
この場合、理想的なブロック暗号を用いていないため、得られたハッシュ関数は、擬似ランダムオラクルの性質を満たすハッシュ関数とはならない。しかし、ランダムオラクルの性質を満たす関数を用いた場合に安全であることが証明されているため、ある程度の安全性があるものと認められる。
【００２２】
以下の説明では、非特許文献４，５に記載されたハッシュ関数と同様に、理想的なブロック暗号における暗号化関数を用いたハッシュ関数について説明する。以下で説明するハッシュ関数は、非特許文献４，５に記載されたハッシュ関数と同様に、用いるブロック暗号が理想的なブロック暗号における暗号化関数の場合、擬似ランダムオラクルの性質を満たす。
しかし、以下で説明するハッシュ関数では、非特許文献４，５に記載されたハッシュ関数と同等の安全性を満たすのに必要なブロック暗号の暗号化関数の出力長が半分以下でよい。つまり、非特許文献４，５に記載されたハッシュ関数に比べ、用いる暗号化関数の出力長が小さくて済む。そのため、例えば、以下で説明するハッシュ関数を回路で実現した場合、回路規模を小さくすることができる。
【００２３】
次に、実施の形態１に係るハッシュ関数について説明する。
【００２４】
図１は、実施の形態１に係るハッシュ値演算装置１０の機能を示す機能ブロック図である。
図２は、図１に示す実施の形態１に係るハッシュ値演算装置１０の動作を示すフローチャートである。
図３は、図１に示す実施の形態１に係るハッシュ値演算装置１０により実現されるハッシュ関数の構造図である。なお、図３では、各値の下に括弧書でその値のビット長を示す。例えば、値Ｍは任意長であり、値ｗはｔビット長である。
【００２５】
図１に示すハッシュ値演算装置１０の機能と動作について、図２、図３を用いて説明する。
図１に示すハッシュ値演算装置１０は、任意長値入力部１１、関数計算部１２、鍵成分計算部１３、暗号化関数Ｅ１計算部１４、暗号化関数Ｅ２計算部１５、ハッシュ値計算部１６を備える。
【００２６】
（Ｓ１：任意長値入力ステップ）
任意長値入力部１１は、任意ビット長の値Ｍを入力装置により入力する。
【００２７】
（Ｓ２：関数Ｆ計算ステップ）
関数計算部１２は、（Ｓ１）で入力された値Ｍを入力として、関数Ｆを計算してｔビット長（ｔは１以上の整数）の値ｗを処理装置により求める。
【００２８】
（Ｓ３：関数ｇ計算ステップ）
鍵成分計算部１３は、（Ｓ２）で求められた値ｗを入力として、関数ｇを計算してｄビット長（ｄはｔ以上の整数）の値ｋを処理装置により求める。
【００２９】
（Ｓ４：暗号化関数Ｅ１計算ステップ）
暗号化関数Ｅ１計算部１４は、（Ｓ３）で求められた値ｋを鍵成分とし、ｎビット長（ｎは１以上の整数）の固定値ｃ１を平文成分として、暗号化関数Ｅ１を計算してｎビット長の値ｙを処理装置により求める。
【００３０】
（Ｓ５：暗号化関数Ｅ２計算ステップ）
暗号化関数Ｅ２計算部１５は、（Ｓ３）で求められた値ｋを鍵成分とし、ｎビット長の固定値ｃ２を平文成分として、暗号化関数Ｅ２を計算してｎビット長の値ｙｙを処理装置により求める。
なお、（Ｓ４）と（Ｓ５）とは並列に実行してもよい。
【００３１】
（Ｓ６：ハッシュ値計算ステップ）
ハッシュ値計算部１６は、（Ｓ４）で求められた値ｙと、（Ｓ５）で求められた値ｙｙとを入力として、関数ｈを計算してｎ’ビット長（ここでのｎ’は１以上２ｎ以下の整数）の値ｚをハッシュ値として求める。
【００３２】
つまり、実施の形態１に係るハッシュ値演算装置１０は、関数Ｆ、関数ｇ、暗号化関数Ｅ１、暗号化関数Ｅ２、関数ｈを用いてハッシュ関数を構成する。
【００３３】
関数Ｆは、任意長の値Ｍを入力として、ｔビット長の値ｗを出力する関数である。
関数Ｆについては、後の実施の形態で詳しく説明する。
【００３４】
関数ｇは、ｔビット長の値ｗを入力として、ｄビット長の値ｋを出力する関数である。
関数ｇは、例えば、（ｄ−ｔ）ビット長の固定値ｃを用いて、入力値ｗと値ｃとをビット結合する関数である。ビット結合の方法は、ｗ｜｜ｃでもよいし、ｃ｜｜ｗでもよいし、値ｃのビットと値ｗのビットとをそれぞれ決められたルールでシャッフルして任意の順に結合してもよい。なお、“｜｜”という記号は、ビット列の結合を意味する。つまり、ｗ｜｜ｃであれば、値ｗの後に値ｃを付加するという意味であり、ｃ｜｜ｗであれば、値ｃの後に値ｗを付加するという意味である。
【００３５】
暗号化関数Ｅ１は、ｄビット長の値ｋと、ｎビット長の値ｃ１とを入力として、ｎビット長の値を出力するブロック暗号の暗号化関数である。同様に、暗号化関数Ｅ２は、ｄビット長の値ｋと、ｎビット長の値ｃ２とを入力として、ｎビット長の値を出力するブロック暗号の暗号化関数である。
暗号化関数Ｅ１と暗号化関数Ｅ２とは同じ関数であってもよいし、異なる関数であってもよい。但し、暗号化関数Ｅ１と暗号化関数Ｅ２とが同じ関数である場合、値ｃ１と値ｃ２とを異なる値とする。
【００３６】
関数ｈは、２つのｎビット長の値ｙ、値ｙｙを入力として、ｎ’ビット長の値を出力する関数である。
関数ｈは、例えば、２つの入力された値ｙ、値ｙｙをビット結合し、そのビットからｎ’ビット選んで出力する関数である。なお、値ｙ、値ｙｙをビット結合の方法は、関数ｇにおいて値ｗと値ｃとのビット結合の方法と同様に、値ｙと値ｙｙとをそのまま結合してもよいし、ビットを混ぜて結合してもよい。
【００３７】
実施の形態１に係るハッシュ値演算装置１０が実現するハッシュ関数は、関数ＦがＰｒＡの性質を満たし、かつ、暗号化関数Ｅ１，Ｅ２が理想化されたブロック暗号における暗号化関数である場合、擬似ランダムオラクルの性質を満たす。
【００３８】
なお、図３に示す暗号化関数Ｅ１，Ｅ２は、三角の印が付いた部分の入力（図３では値ｋ）を固定とすると、置換関数となる。以下の実施の形態においても同様に、図において三角の印が付いた部分の入力を固定とした場合、その暗号化関数は置換関数となる。
【００３９】
実施の形態２
実施の形態２では、実施の形態１とは異なるハッシュ関数について説明する。
【００４０】
図４は、実施の形態２に係るハッシュ値演算装置１０の機能を示す機能ブロック図である。
図５は、図４に示す実施の形態２に係るハッシュ値演算装置１０の動作を示すフローチャートである。
図６は、図４に示す実施の形態２に係るハッシュ値演算装置１０により実現されるハッシュ関数の構造図である。なお、図６では、図３と同様に、各値の下に括弧書でその値のビット長を示す。
【００４１】
図４に示すハッシュ値演算装置１０の機能と動作について、図５、図６を用いて説明する。
図４に示すハッシュ値演算装置１０は、暗号化関数Ｅ２計算部１５を備えていない点で、図１に示すハッシュ値演算装置１０と異なる。
【００４２】
（Ｓ１１）から（Ｓ１２）までは、図２に示す（Ｓ１）から（Ｓ２）までと同じであるため、説明を省略する。
【００４３】
（Ｓ１３：関数Ｇ計算ステップ）
鍵成分計算部１３は、（Ｓ１２）で求められた値ｗを入力として、関数Ｇを計算してｄビット長の値ｋを処理装置により求める。
【００４４】
（Ｓ１４：暗号化関数Ｅ１計算ステップ）
暗号化関数Ｅ１計算部１４は、（Ｓ１３）で求められた値ｋを鍵成分とし、ｎビット長の固定値ｃ１を平文成分として、暗号化関数Ｅ１を計算してｎビット長の値ｙを処理装置により求める。
【００４５】
（Ｓ１５：ハッシュ値計算ステップ）
ハッシュ値計算部１６は、（Ｓ１４）で求められた値ｙとを入力として、関数Ｈを計算してｎ’ビット長（ここでのｎ’は１以上ｎ以下の整数）の値ｚをハッシュ値として求める。
【００４６】
つまり、実施の形態２に係るハッシュ値演算装置１０は、関数Ｆ、関数Ｇ、暗号化関数Ｅ１、関数Ｈを用いてハッシュ関数を構成する。
【００４７】
関数Ｆは、任意長の値Ｍを入力として、ｔビット長の値ｗを出力する関数である。
関数Ｆについては、後の実施の形態で詳しく説明する。
【００４８】
関数Ｇは、ｔビット長の値ｗを入力として、ｄビット長の値ｋを出力する関数である。
関数Ｇは、例えば、（ｄ−ｔ）ビット長の固定値ｃを用いて、入力値ｗと値ｃとをビット結合する関数である。入力値ｗと値ｃとのビット結合の方法は、入力値ｗと値ｃとをそのまま結合してもよいし、ビットを混ぜて結合してもよい。
【００４９】
暗号化関数Ｅ１は、ｄビット長の値ｋと、ｎビット長の値ｃ１とを入力として、ｎビット長の値を出力するブロック暗号の暗号化関数である。
【００５０】
関数Ｈは、ｎビット長の値ｙを入力として、ｎ’ビット長の値を出力する関数である。
関数Ｈは、例えば、入力された値ｙからｎ’ビット選んで出力する関数である。
【００５１】
実施の形態２に係るハッシュ値演算装置１０が実現するハッシュ関数は、関数ＦがＰｒＡの性質を満たし、かつ、暗号化関数Ｅ１が理想化されたブロック暗号における暗号化関数である場合、擬似ランダムオラクルの性質を満たす。
【００５２】
実施の形態３．
実施の形態３では、実施の形態１，２における関数Ｆの一例について説明する。
【００５３】
図７は、実施の形態３に係る関数計算部１２の機能を示す機能ブロック図である。
図８は、図７に示す実施の形態３に係る関数計算部１２の動作を示すフローチャートである。
図９は、図７に示す実施の形態３に係る関数計算部１２により実現される関数Ｆの構造図である。なお、図９では、図３と同様に、各値の下に括弧書でその値のビット長を示す。
【００５４】
図７に示す関数計算部１２の機能と動作について、図８、図９を用いて説明する。
関数計算部１２は、パディング部２１、分割部２２、鍵成分ｋ１計算部２３、暗号化関数Ｅｊ，１計算部２４、関数Ｒ計算部２５、関数ｐ計算部２６、暗号化関数Ｅｊ，２計算部２７、関数Ｓ計算部２８、鍵成分ｋｊ計算部２９、関数Ｖ計算部３０、変数ｊ制御部３１を備える。
【００５５】
（Ｓ２１：パディングステップ）
パディング部２１は、任意長の値Ｍに対して、パディング関数ｐａｄを用いて、所定の値を付加して（Ｌ’＋Ｌ（ｉ−１））ビット長（Ｌ’は１以上ｄ以下の整数、ここでのＬは１以上ｄ−ｎ以下の整数、ｉは１以上の整数）の値Ｍ’を処理装置により生成する。
【００５６】
（Ｓ２２：分割ステップ）
分割部２２は、（Ｓ２１）で生成された値Ｍ’を先頭から、最初はＬ’ビット、以降Ｌビットづつに分割して、Ｌ’ビット長の値ｍ［１］と、Ｌビット長の値ｍ［２］，．．．，値ｍ［ｉ］を処理装置により生成する。
【００５７】
（Ｓ２３：変数ｊ初期化ステップ）
変数ｊ制御部３１は、変数ｊを１に初期化する。
【００５８】
（Ｓ２４：関数Ｔ１計算ステップ）
鍵成分ｋ１計算部２３は、（Ｓ２２）で生成された値ｍ［ｊ］（つまり、値ｍ［１］）を入力として、関数Ｔ［ｊ］（つまり、関数Ｔ［１］）を計算してｄビット長の値ｋ［ｊ］（つまり、値ｋ［１］）を処理装置により求める。
【００５９】
（Ｓ２５：暗号化関数Ｅｊ，１計算ステップ）
暗号化関数Ｅｊ，１計算部２４は、（Ｓ２４）又は後述する（Ｓ３２）で求めた値ｋ［ｊ］を鍵成分とし、ｎビット長の値ｙ［ｊ−１］（値ｙ［０］は固定値ＩＶ）を平文成分として、暗号化関数Ｅｊ，１を計算してｎビット長の値ｘ［ｊ］を処理装置により求める。
【００６０】
（Ｓ２６：関数Ｒ計算ステップ）
関数Ｒ計算部２５は、（Ｓ２５）で求めた値ｘ［ｊ］と、ｎビット長の値ｙ［ｊ−１］とを入力として、関数Ｒ［ｊ］を計算してｎビット長の値ｙ［ｊ］を処理装置により求める。
【００６１】
（Ｓ２７：関数ｐ計算ステップ）
関数ｐ計算部２６は、ｎビット長の値ｙ［ｊ−１］とを入力として、関数ｐ［ｊ］を計算してｎビット長の値ｖｖ［ｊ］を処理装置により求める。
【００６２】
（Ｓ２８：暗号化関数Ｅｊ，２計算ステップ）
暗号化関数Ｅｊ，２計算部２７は、（Ｓ２４）又は後述する（Ｓ３２）で求めた値ｋ［ｊ］を鍵成分とし、（Ｓ２７）で求めた値ｖｖ［ｊ］を平文成分として、暗号化関数Ｅｊ，２を計算してｎビット長の値ｘｘ［ｊ］を処理装置により求める。
【００６３】
（Ｓ２９：関数Ｓ計算ステップ）
関数Ｓ計算部２８は、（Ｓ２８）で求めた値ｘｘ［ｊ］と、（Ｓ２７）で求めた値ｖｖ［ｊ］とを入力として、関数Ｓ［ｊ］を計算してｎビット長の値ｙｙ［ｊ］を求める。
なお、（Ｓ２５）から（Ｓ２６）までと、（Ｓ２７）から（Ｓ２９）までとは並列に実行してもよい。
【００６４】
（Ｓ３０：変数ｊ判定ステップ）
変数ｊ制御部３１は、変数ｊの値が値ｉであるか否かを判定する。変数ｊの値が値ｉでなければ（Ｓ３０でＮＯ）、処理を（Ｓ３１）へ進める。一方、変数ｊの値が値ｉであれば（Ｓ３０でＹＥＳ）、処理を（Ｓ３３）へ進める。
【００６５】
（Ｓ３１：変数ｊインクリメントステップ）
変数ｊ制御部３１は、変数ｊに１を加算する。
【００６６】
（Ｓ３２：関数Ｔ計算ステップ）
鍵成分ｋｊ計算部２９は、（Ｓ２２）で生成された値ｍ［ｊ］と、（Ｓ２９）で求めた値ｙｙ［ｊ−１］とを入力として、関数Ｔ［ｊ］を計算してｄビット長の値ｋ［ｊ］を処理装置により求める。
そして、処理を（Ｓ２５）及び（Ｓ２７）へ戻す。
【００６７】
（Ｓ３３：関数Ｖ計算ステップ）
関数Ｖ計算部３０は、（Ｓ２６）で求めた値ｙ［ｉ］と、（Ｓ２９）で求めた値ｙｙ［ｉ］とを入力として、関数Ｖを計算してｔビット長の値ｗを処理装置により求める。
【００６８】
つまり、実施の形態３に係る関数計算部１２は、パディング関数ｐａｄ、関数Ｔ［１］，．．．，関数Ｔ［ｉ］、関数ｐ［１］，．．．，関数ｐ［ｉ］、暗号化関数Ｅ１，１，．．．，暗号化関数Ｅｉ，１、暗号化関数Ｅ１，２，．．．，暗号化関数Ｅｉ，２、関数Ｒ［１］，．．．，関数Ｒ［ｉ］、関数Ｓ［１］，．．．，関数Ｓ［ｉ］、関数Ｖを用いて、図３や図６に示す関数Ｆを構成する。
【００６９】
パディング関数ｐａｄは、例えば、Ｍ’＝ｐａｄ（Ｍ）＝Ｍ｜｜１｜｜０．．．０｜｜＜Ｍ＞である。ここで、＜Ｍ＞は、例えば、６４ビットの値であり、Ｍのビット長情報を含む値である。
つまり、パディング関数ｐａｄは、先頭が“１”で、その後が複数の“０”で、最後に＜Ｍ＞となるビット列を生成して、値Ｍに付加して、値Ｍ’を生成する関数である。
なお、Ｍ’がＬ’＋Ｌ（ｉ−１）ビットとなるように０の個数が決定される。
【００７０】
関数Ｔ［１］は、Ｌ’ビット長の値を入力として、ｄビット長の値を出力する関数である。
関数Ｔ［１］は、例えば、ｃｏｎｓｔ’をｄ−Ｌ’ビット長の固定値とした場合、Ｌ’ビット長の入力値ｍに対して、ｃｏｎｓｔ’をビット結合したものを出力する関数である。なお、Ｌ’＝ｄの場合には、入力値をそのまま出力するものとする。
値ｍと値ｃｏｎｓｔ’とのビット結合の方法は、値ｍと値ｃｏｎｓｔ’とをそのまま結合してもよいし、ビットを混ぜて結合してもよい。
【００７１】
関数Ｔ［２］，．．．，関数Ｔ［ｉ］は、Ｌビット長の値と、ｎビット長の値とを入力として、ｄビット長の値を出力する関数である。
関数Ｔ［２］，．．．，関数Ｔ［ｉ］は、値ｃｏｎｓｔを（ｄ−Ｌ−ｎ）ビットの固定値とした場合、Ｌビットの入力値ｍと、ｎビットの入力値ｘと、値ｃｏｎｓｔとをビット結合したものを出力する関数である。なお、Ｌ＝ｄ−ｎの場合は、値ｃｏｎｓｔは付加しない。
入力値ｍと入力値ｘと値ｃｏｎｓｔとビット結合の方法は、入力値ｍと入力値ｘと値ｃｏｎｓｔとをそのまま結合してもよいし、ビットを混ぜて結合してもよい。
【００７２】
関数ｐ［１］，．．．，関数ｐ［ｉ］は、全てのｎビットの値ｘに対してｐ［ｊ］（ｘ）≠ｘ（ｊ＝１，．．．，ｉ）となる置換関数である。
【００７３】
暗号化関数Ｅ１，１，．．．，暗号化関数Ｅｉ，１と、暗号化関数Ｅ１，２，．．．，暗号化関数Ｅｉ，２とは、ｄビット長の値と、ｎビット長の値とを入力として、ｎビット長の値を出力するブロック暗号の暗号化関数である。
暗号化関数Ｅ１，１，．．．，暗号化関数Ｅｉ，１、暗号化関数Ｅ１，２，．．．，暗号化関数Ｅｉ，２、暗号化関数Ｅ１，Ｅ２は、全て同じ暗号化関数であってもよい。
また、暗号化関数Ｅ１，１，．．．，暗号化関数Ｅｉ，１、暗号化関数Ｅ１，２，．．．，暗号化関数Ｅｉ，２は同じ暗号化関数であり、暗号化関数Ｅ１，Ｅ２は、暗号化関数Ｅ１，１，．．．，暗号化関数Ｅｉ，１、暗号化関数Ｅ１，２，．．．，暗号化関数Ｅｉ，２と異なる暗号化関数であってもよい。この場合、暗号化関数Ｅ１，Ｅ２は、同じ暗号化関数であってもよいし、異なる暗号化関数であってもよい。
【００７４】
関数Ｒ［１］，．．．，関数Ｒ［ｉ］と、関数Ｓ［１］，．．．，関数Ｓ［ｉ］とは、２つのｎビット長の値を入力として、ｎビット長の値を出力する関数である。
関数Ｒ［１］，．．．，関数Ｒ［ｉ］と、関数Ｓ［１］，．．．，関数Ｓ［ｉ］とは、例えば、２つのｎビット長の入力値ｘ，ｙに対して、値ｘと値ｙとの排他的論理和を出力する関数である。
また、関数Ｒ［１］，．．．，関数Ｒ［ｉ］と、関数Ｓ［１］，．．．，関数Ｓ［ｉ］とは、２つのｎビット長の入力値ｘ，ｙに対して、値ｘと値ｙとを加算した値を出力する関数であってもよい。この場合、加算方法は、例えば、値ｘと値ｙとの先頭からＬビットづつをそれぞれ加算していき、最後に加算したものをビット結合すればよい。
【００７５】
関数Ｖは、２つのｎビット長の値を入力として、ｔビット長の値を出力する関数である。
関数Ｖは、例えば、２つのｎビット長の入力値ｘ，ｙに対して、値ｘと値ｙとをビット結合し、そのうちｔビットを所定の方法で抽出して出力する関数である。なお、ｔ＝２ｎの場合は、ビット結合した値をそのまま出力すればよい。
値ｘと値ｙとのビット結合の方法は、値ｘと値ｙとをそのまま結合してもよいし、ビットを混ぜて結合してもよい。また、ビットの抽出方法は、先頭から抽出してもよいし、後ろから抽出してもよく、それ以外の抽出方法でもよい。
【００７６】
実施の形態１に係るハッシュ値演算装置１０が、実施の形態３に係る関数計算部１２が実現する関数Ｆを用いて実現したハッシュ関数は、暗号化関数Ｅ１，１，．．．，暗号化関数Ｅｉ，１、暗号化関数Ｅ１，２，．．．，暗号化関数Ｅｉ，２、暗号化関数Ｅ１，Ｅ２が理想化されたブロック暗号における暗号化関数である場合、擬似ランダムオラクルの性質を満たす。そして、その安全性のセキュリティレベルはＯ（２ｎ）となる。また、このハッシュ関数は、各暗号化関数の出力長がｎビットであり、ハッシュ値の出力長が最大２ｎビットである。
【００７７】
実施の形態２に係るハッシュ値演算装置１０が、実施の形態３に係る関数計算部１２が実現する関数Ｆを用いて実現したハッシュ関数は、暗号化関数Ｅ１，１，．．．，暗号化関数Ｅｉ，１、暗号化関数Ｅ１，２，．．．，暗号化関数Ｅｉ，２、暗号化関数Ｅ１が理想化されたブロック暗号における暗号化関数である場合、擬似ランダムオラクルの性質を満たす。そして、その安全性のセキュリティレベルはＯ（２ｎ）となる。また、このハッシュ関数は、各暗号化関数の出力長がｎビットであり、ハッシュ値の出力長が最大ｎビットである。
【００７８】
なお、実施の形態１に係るハッシュ関数と、実施の形態２に係るハッシュ関数との出力長を同じ２ｎとする場合、実施の形態１に係るハッシュ関数は、上述した通り、安全性のセキュリティレベルはＯ（２ｎ）であり、用いる各暗号化関数の出力長がｎビットである。一方、実施の形態２に係るハッシュ関数は、安全性のセキュリティレベルはＯ（２２ｎ）であり、用いる各暗号化関数の出力長が２ｎビットである。
つまり、ハッシュ関数の出力長を同じにした場合、実施の形態１に係るハッシュ関数の方が、実施の形態２に係るハッシュ関数よりも、用いる暗号化関数の出力長が短くてよい。そのため、例えば、ハッシュ関数を回路で実現した場合、回路規模を小さくできる。一方、実施の形態２に係るハッシュ関数の方が、実施の形態１に係るハッシュ関数よりも、安全性のセキュリティレベルが高い。
【００７９】
実施の形態４．
実施の形態４では、実施の形態１，２における関数Ｆの実施の形態３とは異なる例について説明する。
【００８０】
図１０は、実施の形態４に係る関数計算部１２の機能を示す機能ブロック図である。
図１１は、図１０に示す実施の形態４に係る関数計算部１２の動作を示すフローチャートである。
図１２は、図１０に示す実施の形態４に係る関数計算部１２により実現されるハッシュ関数の構造図である。なお、図１２では、図３と同様に、各値の下に括弧書でその値のビット長を示す。
【００８１】
図１０に示すハッシュ値演算装置１０の機能と動作について、図１１、図１２を用いて説明する。
図１０に示す関数計算部１２は、関数ｈ計算部３２、関数ｈ’計算部３３を備え、関数ｐ計算部２６、関数Ｒ計算部２５、関数Ｓ計算部２８を備えていない点が図７に示す関数計算部１２と異なる。
【００８２】
（Ｓ４１）から（Ｓ４３）までの処理は、図８に示す（Ｓ２１）から（Ｓ２３）までの処理と同じであるため、説明を省略する。但し、ここでのＬは１以上ｄ−２ｎ以下の整数である。
【００８３】
（Ｓ４４：関数ｇ１計算ステップ）
鍵成分ｋ１計算部２３は、（Ｓ４２）で生成された値ｍ［ｊ］（値ｍ［１］）を入力として、関数ｇ［ｊ］（関数ｇ［１］）を計算してｄビット長の値ｋ［ｊ］（値ｋ［１］）を処理装置により求める。
【００８４】
（Ｓ４５：暗号化関数Ｅｊ，１計算ステップ）
暗号化関数Ｅｊ，１計算部２４は、（Ｓ４４）又は後述する（Ｓ５０）で求めた値ｋ［ｊ］を鍵成分とし、ｎビット長の所定の値ｃｊ，１を平文成分として、暗号化関数Ｅｊ，１を計算してｎビット長の値ｙ［ｊ］を処理装置により求める。
【００８５】
（Ｓ４６：暗号化関数Ｅｊ，２計算ステップ）
暗号化関数Ｅｊ，２計算部２７は、（Ｓ４４）又は後述する（Ｓ５０）で求めた値ｋ［ｊ］を鍵成分とし、ｎビット長の所定の値ｃｊ，２を平文成分として、暗号化関数Ｅｊ，２を計算してｎビット長の値ｙｙ［ｊ］を処理装置により求める。
なお、（Ｓ４５）と（Ｓ４６）とは並列に実行してもよい。
【００８６】
（Ｓ４７：関数ｈ計算ステップ）
関数ｈ計算部３２は、（Ｓ４５）で求めた値ｙ［ｊ］と、（Ｓ４６）で求めた値ｙｙ［ｊ］とを入力として、関数ｈ［ｊ］を計算して２ｎビット長の値ｗ［ｊ］を処理装置により求める。
【００８７】
（Ｓ４８：変数ｊ判定ステップ）
関数計算部１２は、変数ｊの値が値ｉであるか否かを判定する。変数ｊの値が値ｉでなければ（Ｓ４８でＮＯ）、処理を（Ｓ４９）へ進める。一方、変数ｊの値が値ｉであれば（Ｓ４８でＹＥＳ）、処理を（Ｓ５１）へ進める。
【００８８】
（Ｓ４９：変数ｊインクリメントステップ）
関数計算部１２は、変数ｊに１を加算する。
【００８９】
（Ｓ５０：関数ｇ計算ステップ）
鍵成分ｋｊ計算部２９は、（Ｓ４２）で生成された値ｍ［ｊ］と、（Ｓ４７）で求めた値ｗ［ｊ−１］とを入力として、関数ｇ［ｊ］を計算してｄビット長の値ｋ［ｊ］を処理装置により求める。
そして、処理を（Ｓ４５）及び（Ｓ４６）へ戻す。
【００９０】
（Ｓ５１：関数ｈ’計算ステップ）
関数ｈ’計算部３３は、（Ｓ４７）で求めた値ｗ［ｉ］を入力として、関数ｈ’を計算してｔビット長の値ｗを処理装置により求める。
【００９１】
つまり、実施の形態４に係る関数計算部１２は、パディング関数ｐａｄ、関数ｇ［１］，．．．，関数ｇ［ｉ］、暗号化関数Ｅ１，１，．．．，暗号化関数Ｅｉ，１、暗号化関数Ｅ１，２，．．．，暗号化関数Ｅｉ，２、関数ｈ［１］，．．．，関数ｈ［ｉ］、関数ｈ’を用いて、図３や図６に示す関数Ｆを構成する。
【００９２】
パディング関数ｐａｄは、実施の形態３のパディング関数ｐａｄと同じである。
【００９３】
関数ｇ［１］は、Ｌ’ビット長の値を入力として、ｄビット長の値を出力する関数である。
関数ｇ［１］は、例えば、ｃｏｎｓｔ’をｄ−Ｌ’ビット長の固定値とした場合、Ｌ’ビット長の入力値ｍに対して、ｃｏｎｓｔ’をビット結合したものを出力する関数である。なお、Ｌ’＝ｄの場合には、入力値をそのまま出力するものとする。
値ｍと値ｃｏｎｓｔ’とのビット結合の方法は、値ｍと値ｃｏｎｓｔ’とをそのまま結合してもよいし、ビットを混ぜて結合してもよい。
【００９４】
関数ｇ［２］，．．．，関数ｇ［ｉ］は、Ｌビット長の値と、ｎビット長の値とを入力として、ｄビット長の値を出力する関数である。
値ｃｏｎｓｔを（ｄ−Ｌ−２ｎ）ビットの固定値とした場合、Ｌビットの入力値ｍと、ｎビットの入力値ｘと、値ｃｏｎｓｔとをビット結合したものを出力する関数である。なお、Ｌ＝ｄ−２ｎの場合は、値ｃｏｎｓｔは付加しない。
入力値ｍと入力値ｘと値ｃｏｎｓｔとビット結合の方法は、入力値ｍと入力値ｘと値ｃｏｎｓｔとをそのまま結合してもよいし、ビットを混ぜて結合してもよい。
【００９５】
暗号化関数Ｅ１，１，．．．，暗号化関数Ｅｉ，１と、暗号化関数Ｅ１，２，．．．，暗号化関数Ｅｉ，２とは、ｄビット長の値と、ｎビット長の値とを入力として、ｎビット長の値を出力するブロック暗号の暗号化関数である。
暗号化関数Ｅ１，１，．．．，暗号化関数Ｅｉ，１、暗号化関数Ｅ１，２，．．．，暗号化関数Ｅｉ，２、暗号化関数Ｅ１，Ｅ２は、全て同じ暗号化関数であってもよい。
また、暗号化関数Ｅ１，１，．．．，暗号化関数Ｅｉ，１、暗号化関数Ｅ１，２，．．．，暗号化関数Ｅｉ，２は同じ暗号化関数であり、暗号化関数Ｅ１，Ｅ２は、暗号化関数Ｅ１，１，．．．，暗号化関数Ｅｉ，１、暗号化関数Ｅ１，２，．．．，暗号化関数Ｅｉ，２と異なる暗号化関数であってもよい。この場合、暗号化関数Ｅ１，Ｅ２は、同じ暗号化関数であってもよいし、異なる暗号化関数であってもよい。
【００９６】
関数ｈ［１］，．．．，関数ｈ［ｉ］は、２つのｎビット長の値を入力として、２ｎビット長の値を出力する関数である。
関数ｈ［１］，．．．，関数ｈ［ｉ］は、２つのｎビット長の値をビット結合する関数である。２つのｎビットの値のビット結合の方法は、２つのｎビットの値をそのまま結合してもよいし、ビットを混ぜて結合してもよい。
【００９７】
関数ｈ’は、２つのｎビット長の値を入力として、ｔビット長の値を出力する関数である。
関数ｈ’は、例えば、２つのｎビット長の入力値ｘ，ｙに対して、値ｘと値ｙとをビット結合し、そのうちｔビットを所定の方法で抽出して出力する関数である。
値ｘと値ｙとのビット結合の方法は、値ｘと値ｙとをそのまま結合してもよいし、ビットを混ぜて結合してもよい。また、ビットの抽出方法は、先頭から抽出してもよいし、後ろから抽出してもよく、それ以外の抽出方法でもよい。
【００９８】
実施の形態１に係るハッシュ値演算装置１０が、実施の形態４に係る関数計算部１２が実現する関数Ｆを用いて実現したハッシュ関数は、暗号化関数Ｅ１，１，．．．，暗号化関数Ｅｉ，１、暗号化関数Ｅ１，２，．．．，暗号化関数Ｅｉ，２、暗号化関数Ｅ１，Ｅ２が理想化されたブロック暗号における暗号化関数である場合、擬似ランダムオラクルの性質を満たす。そして、その安全性のセキュリティレベルはＯ（２ｎ）となる。また、このハッシュ関数は、各暗号化関数の出力長がｎビットであり、ハッシュ値の出力長が最大２ｎビットである。
【００９９】
実施の形態２に係るハッシュ値演算装置１０が、実施の形態４に係る関数計算部１２が実現する関数Ｆを用いて実現したハッシュ関数は、暗号化関数Ｅ１，１，．．．，暗号化関数Ｅｉ，１、暗号化関数Ｅ１，２，．．．，暗号化関数Ｅｉ，２、暗号化関数Ｅ１が理想化されたブロック暗号における暗号化関数である場合、擬似ランダムオラクルの性質を満たす。そして、その安全性のセキュリティレベルはＯ（２ｎ）となる。また、このハッシュ関数は、各暗号化関数の出力長がｎビットであり、ハッシュ値の出力長が最大ｎビットである。
【０１００】
なお、実施の形態１に係るハッシュ関数と、実施の形態２に係るハッシュ関数との出力長を同じ２ｎとする場合、実施の形態１に係るハッシュ関数は、上述した通り、安全性のセキュリティレベルはＯ（２ｎ）であり、用いる各暗号化関数の出力長がｎビットである。一方、実施の形態２に係るハッシュ関数は、安全性のセキュリティレベルはＯ（２２ｎ）であり、用いる各暗号化関数の出力長が２ｎビットである。
つまり、ハッシュ関数の出力長を同じにした場合、実施の形態１に係るハッシュ関数の方が、実施の形態２に係るハッシュ関数よりも、用いる暗号化関数の出力長が短くてよい。そのため、例えば、ハッシュ関数を回路で実現した場合、回路規模を小さくできる。一方、実施の形態２に係るハッシュ関数の方が、実施の形態１に係るハッシュ関数よりも、安全性のセキュリティレベルが高い。
【０１０１】
以上に説明したハッシュ値演算装置１０は、例えば、回路やソフトウェア等で構成される。回路で構成される場合には、上記説明における処理装置は、例えば演算回路であり、記憶装置は、例えばレジスタである。また、ソフトウェアで構成される場合には、上記説明における処理装置は、例えばＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）であり、記憶装置は、例えばＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）である。また、上記説明における入力装置は、例えばキーボード、通信ボードであり、出力装置は、例えばＬＣＤ（Ｌｉｑｕｉｄ  Ｃｒｙｓｔａｌ  Ｄｉｓｐｌａｙ）等の表示装置、通信ボード、レジスタやＲＡＭ等の記憶装置である。もちろん、これらに限定されるものではない。
なお、ハッシュ値演算装置１０を回路で構成する場合、上述した「〜部」を「〜回路」と読み変えてもよい。また、上述した「〜部」は、「〜処理」、「〜装置」、「〜機器」、「〜手段」、「〜手順」、「〜機能」と読み替えてもよい。つまり、「〜部」として説明するものは、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）に記憶されたファームウェアで実現されていても構わない。或いは、ソフトウェアのみ、或いは、素子・デバイス・基板・配線などのハードウェアのみ、或いは、ソフトウェアとハードウェアとの組み合わせ、さらには、ファームウェアとの組み合わせで実現されても構わない。
【符号の説明】
【０１０２】
１０  ハッシュ値演算装置、１１  任意長値入力部、１２  関数計算部、１３  鍵成分計算部、１４  暗号化関数Ｅ１計算部、１５  暗号化関数Ｅ２計算部、１６  ハッシュ値計算部、２１  パディング部、２２  分割部、２３  鍵成分ｋ１計算部、２４  暗号化関数Ｅｊ，１計算部、２５  関数Ｒ計算部、２６  関数ｐ計算部、２７  暗号化関数Ｅｊ，２計算部、２８  関数Ｓ計算部、２９  鍵成分ｋｊ計算部、３０  関数Ｖ計算部、３１  変数ｊ制御部、３２  関数ｈ計算部、３３  関数ｈ’計算部。
【図１】
0005528281.tif 000002
【図２】
0005528281.tif 000003
【図３】
0005528281.tif 000004
【図４】
0005528281.tif 000005
【図５】
0005528281.tif 000006
【図６】
0005528281.tif 000007
【図７】
0005528281.tif 000008
【図８】
0005528281.tif 000009
【図９】
0005528281.tif 000010
【図１０】
0005528281.tif 000011
【図１１】
0005528281.tif 000012
【図１２】
0005528281.tif 000013