"メッセージを所定のデータ長のメッセージブロックに分割し、前記分割された各メッセージブロックに対してブロック暗号の処理を実行することによって算出された出力データを連結して、所定のデータ長のハッシュ値を算出するハッシュ値生成装置であって、前記メッセージの入力を受け付け、前記ハッシュ値を出力する入出力部と、前記ハッシュ値の算出処理に用いられる初期値を格納する記憶領域を提供する記憶部と、前記初期値から暗号化に用いられる鍵定数Kを算出する関数fk、並びに、前記算出された鍵定数K及び前記メッセージブロックを入力することによって前記出力データを算出する関数fRを実行し、前記関数fk及び関数fRによって前記各メッセージブロックが変換された前記出力データを前記記憶部に格納し、前記出力データを連結して前記ハッシュ値を算出する演算部と、を備え、前記関数fRは、mビット幅mは、m>1となる整数のビット列の巡回演算を実行する巡回シフトと、二つのビット列を加算する算術加算とを含み、4mビットの入力データに対して4mビットの出力データを算出する非線形関数γと、2mビット幅のビット列の巡回演算を実行する巡回シフトと、二つのビット列の排他的論理和とを含み、4mビットの入力データに対して4mビットの出力データを算出する線形関数θと、の合成関数である関数FRを含むことを特徴とするハッシュ値生成装置。前記演算部は前記非線形関数γを実行することによって、前記入力データを2mビットのサブデータに分割し、前記分割された各サブデータを関数Fkに入力することによって前記各サブデータを変換し、前記変換された各サブデータを連結して4mビットの出力データを算出し、前記演算部は前記関数Fkを実行することによって、2mビットの入力データをmビットのサブデータs0、s1に分割し、前記サブデータs1に対して所定のビットの巡回シフトを実行して算出された値と、前記サブデータs0との算術加算を実行してデータs0を算出し、前記データs0に対して所定のビットの巡回シフトを実行して算出された値と、前記サブデータs1との算術加算を実行してデータs1を算出し、前記データs0及び前記データs1を連結することによって、前記サブデータを変換することを特徴とする請求項1に記載のハッシュ値生成装置。前記ハッシュ値生成装置は、前記関数fk及び前記関数fRを用いた処理を一つの処理単位とするラウンド処理を複数回実行し、前記演算部は、前記ラウンド処理において、前回のラウンド処理において算出された前記鍵定数を前記関数fkに入力することによって新たな前記鍵定数を算出し、前記新たな鍵定数と、前回のラウンド処理において算出された前記出力データとを前記関数fRに入力することによって新たな前記出力データを算出し、前記前記演算部は前記関数fRを実行することによって、前回のラウンドr-1のラウンド処理において算出された出力データxを、ビット数が同一である五つのデータx0、x1、x2、x3、x4に分割し、前記データx0、x1、x2、x3を、それぞれ、前記新たな出力データxrを構成するデータx1r、x2r、x3r、x4rとして出力し、前記新たな鍵定数Krからビット列Sを生成し、前記ビット列Sと前記データx3との排他的論理和pを前記関数FRに入力することによってデータqを算出し、前記データqと前記データx4との排他的論理和を前記出力データxrを構成するデータx0rとして出力し、前記データx0r、x1r、x2r、x3r、x4rを連結して、前記新たな出力データxrを算出し、前記記憶部に前記出力データxrを格納することを特徴とする請求項2に記載のハッシュ値生成装置。前記記憶部は、前記鍵定数の算出時に用いられるラウンド定数及び鍵ラウンド値を格納し、前記演算部は、さらに、前回のラウンドr-1のラウンド処理において算出された前記ラウンド定数Cからラウンドrにおける前記ラウンド定数Crを算出する関数fcを実行し、前記演算部は前記関数fkを実行することによって、前回のラウンドr-1において算出された鍵ラウンド値kを、ビット数が同一である五つのデータk0、k1、k2、k3、k4に分割し、前記データk0、k1、k2、k3を、それぞれ、前記新たな鍵ラウンド値krを構成するデータk1r、k2r、k3r、k4rとして出力し、前記ラウンド定数Crと前記データk3との排他的論理和aを前記関数FRに入力することによってデータbを算出し、前記データbと前記データk4との排他的論理和を前記新たな鍵ラウンド値krを構成するデータk0rとして出力し、前記データk0r、k1r、k2r、k3r、k4rを連結して、前記新たな鍵ラウンド値krを算出し、前記記憶部に前記鍵ラウンド値krを格納し、前記鍵ラウンド値krを構成するk1rを前記新たな鍵定数Krとして、前記関数fRに対して出力することを特徴とする請求項3に記載のハッシュ値生成装置。メッセージを所定のデータ長のメッセージブロックに分割し、前記各メッセージブロックに対してブロック暗号の処理を実行することによって算出された出力データを連結して、所定のデータ長のハッシュ値を算出する装置に実行させるためのハッシュ値生成プログラムであって、前記装置は、前記ハッシュ値生成プログラムを実行するプロセッサと、前記プロセッサに接続される記憶媒体とを備え、前記ハッシュ値生成プログラムは前記メッセージの入力を受け付ける手順と、前記ハッシュ値の算出処理に用いる初期値が格納される前記記憶媒体から前記初期値を読み出し、当該初期値から暗号化に用いられる鍵定数Kを生成する関数fkを実行させる手順と、前記生成された鍵定数K及び前記メッセージブロックを入力として前記出力データを算出する関数fRを実行させる手順と、前記算出された出力データを前記記憶媒体に格納する手順と、前記記憶媒体に格納される前記出力データを連結して前記ハッシュ値を算出する手順と、を前記プロセッサに実行させ、前記関数fRは、mビット幅mは、m>1となる整数のビット列の巡回演算を実行する巡回シフトと、二つのビット列を加算する算術加算とを含み、4mビットの入力データに対して4mビットの出力データを算出する非線形関数γと、2mビット幅のビット列の巡回演算を実行する巡回シフトと、二つのビット列の排他的論理和とを含み、4mビットの入力データに対して4mビットの出力データを算出する線形関数θと、の合成関数である関数FRを含むことを特徴とするハッシュ値生成プログラム。前記関数FRに含まれる非線形関数γを実行させる手順では、前記入力データを2mビットのサブデータに分割する手順と、前記分割された各サブデータを関数Fkに入力することによって前記各サブデータを変換する手順と、前記変換された各サブデータを連結して4mビットの出力データを算出する手順と、を含み、前記関数Fkを実行させる手順では、2mビットの入力データをmビットのサブデータs0、s1に分割する手順と、前記サブデータs1に対して所定のビットの巡回シフトを実行して算出された値と、前記サブデータs0との算術加算を実行してデータs0を算出する手順と、前記データs0に対して所定のビットの巡回シフトを実行して算出された値と、前記サブデータs1との算術加算を実行してデータs1を算出する手順と、前記データs0及び前記データs1を連結することによって、前記サブデータを変換する手順と、を含むことを特徴とする請求項5に記載のハッシュ値生成プログラム。前記関数fk及び前記関数fRを用いた処理を一つの処理単位とするラウンド処理を複数回実行させる手順を含み、前記ラウンド処理は、前回のラウンド処理において算出された前記鍵定数を前記関数fkに新たな鍵定数を算出する手順と、前記新たな鍵定数と、前回のラウンド処理において算出された前記出力データとを前記関数fRに入力することによって新たな前記出力データを算出する手順と、を含み、前記関数fRを実行させる手順では、前回のラウンドr-1のラウンド処理において算出された出力データxを、ビット数が同一である五つのデータx0、x1、x2、x3、x4に分割する手順と、前記データx0、x1、x2、x3を、それぞれ、前記新たな出力データxrを構成するデータx1r、x2r、x3r、x4rとして出力する手順と、前記新たな鍵定数Krからビット列Sを生成する手順と、前記ビット列Sと前記データx3との排他的論理和pを前記関数FRに入力することによってデータqを算出する手順と、前記データqと前記データx4との排他的論理和を前記出力データxrを構成するデータx0rとして出力する手順と、前記データx0r、x1r、x2r、x3r、x4rを連結して、前記新たな出力データxrを算出する手順と、前記記憶媒体に前記出力データxrを格納する手順と、を含むことを特徴とする請求項6に記載のハッシュ値生成プログラム。前記記憶媒体は、前記鍵定数の算出時に用いられるラウンド定数及び鍵ラウンド値を格納し、前記ハッシュ値生成プログラムは、前回のラウンドr-1のラウンド処理においてにおいて算出された前記ラウンド定数Cからラウンドrにおける前記ラウンド定数Crを算出する関数fcを前記プロセッサに実行させる手順を含み、前記関数fkを実行させる手順では、前回のラウンドr-1において算出された鍵ラウンド値kを、ビット数が同一である五つのデータk0、k1、k2、k3、k4に分割する手順と、前記データk0、k1、k2、k3を、それぞれ、前記新たな鍵ラウンド値krを構成するデータk1r、k2r、k3r、k4rとして出力する手順と、前記ラウンド定数Crと前記データk3との排他的論理和aを前記関数FRに入力することによってデータbを算出する手順と、前記データbと前記データk4との排他的論理和を前記新たな鍵ラウンド値krを構成するデータk0rとして出力する手順と、前記データk0r、k1r、k2r、k3r、k4rを連結して、前記新たな鍵ラウンド値krを算出する手順と、前記記憶媒体に前記鍵ラウンド値krを格納する手順と、前記鍵ラウンド値krを構成するk1rを前記新たな鍵定数Krとして、前記関数fRに対して出力する手順と、を含むことを特徴とする請求項7に記載のハッシュ値生成プログラム。メッセージを所定のデータ長のメッセージブロックに分割し、前記各メッセージブロックに対してブロック暗号の処理を実行することによって算出された出力データを連結して、所定のデータ長のハッシュ値を算出する装置が実行するハッシュ値生成方法であって、前記装置は、プロセッサと、前記プロセッサに接続される記憶媒体とを備え、前記方法は、前記プロセッサが、前記メッセージの入力を受け付けるステップと、前記プロセッサが、前記ハッシュ値の算出処理に用いる初期値が格納される前記記憶媒体から前記初期値を読み出し、当該初期値から暗号化に用いられる鍵定数Kを算出する関数fkを実行するステップと、前記プロセッサが、前記生成された鍵定数K及び前記各メッセージブロックを入力することによって前記出力データを算出する関数fRを実行するステップと、前記プロセッサが、前記出力データを前記記憶媒体に格納するステップと、前記プロセッサが、前記記憶媒体に格納される前記出力データを連結して前記ハッシュ値を算出するステップと、を含み、前記関数fRは、mビット幅mは、m>1となる整数のビット列の巡回演算を実行する巡回シフトと、二つのビット列を加算する算術加算とを含み、4mビットの入力データに対して4mビットの出力データを算出する非線形関数γと、2mビット幅のビット列の巡回演算を実行する巡回シフトと、二つのビット列の排他的論理和とを含み、4mビットの入力データに対して4mビットの出力データを算出する線形関数θと、の合成関数である関数FRを含むことを特徴とするハッシュ値生成方法。前記プロセッサが前記関数FRに含まれる前記非線形関数γを実行する処理は、前記入力データを2mビットのサブデータに分割するステップと、前記分割された各サブデータを関数Fkに入力することによって前記各サブデータを変換するステップと、前記変換された各サブデータを連結して4mビットの出力データを算出するステップと、を含み、前記プロセッサが前記関数Fkを実行する処理は、2mビットの入力データをmビットのサブデータs0、s1に分割するステップと、前記サブデータs1に対して所定のビットの巡回シフトを実行して算出された値と、前記サブデータs0との算術加算を実行してデータs0を算出するステップと、前記データs0に対して所定のビットの巡回シフトを実行して算出された値と、前記サブデータs1との算術加算を実行してデータs1を算出するステップと、前記データs0及び前記データs1を連結することによって、前記サブデータを変換するステップと、を含むことを特徴とする請求項9に記載のハッシュ値生成方法。前記ブロック暗号の処理では、前記プロセッサが、前記関数fk及び前記関数fRを用いた処理を一つの処理単位とするラウンド処理を複数回実行し、前記ラウンド処理は、前記プロセッサが、前回のラウンド処理において算出された前記鍵定数を前記関数fkに入力することによって新たな前記鍵定数を算出するステップと、前記新たな鍵定数と、前回のラウンド処理において算出された前記出力データとを前記関数fRに入力することによって新たな前記出力データを算出するステップと、を含み、前記プロセッサが前記関数fRを実行する処理は、前回のラウンドr-1において算出された出力データxを、ビット数が同一である五つのデータx0、x1、x2、x3、x4に分割するステップと、前記データx0、x1、x2、x3を、それぞれ、前記新たな出力データxrを構成するデータx1r、x2r、x3r、x4rとして出力するステップと、前記算出された鍵定数Krからビット列Sを生成するステップと、前記ビット列Sと前記データx3との排他的論理和pを前記関数FRに入力して、データqを算出するステップと、前記データqと前記データx4との排他的論理和を前記出力データxrを構成するデータx0rとして出力するステップと、前記データx0r、x1r、x2r、x3r、x4rを連結して、前記新たな出力データxrを算出するステップと、前記記憶領域に前記出力データxrを格納するステップと、を含むことを特徴とする請求項10に記載のハッシュ値生成方法。前記記憶媒体は、前記鍵定数の算出時に用いられるラウンド定数及び鍵ラウンド値を格納し、前記方法は、前回のラウンドr-1において算出された前記ラウンド定数Cからラウンドrにおける前記ラウンド定数Crを算出する関数fcを実行するステップを含み、前記プロセッサが前記関数fkを実行する処理は、前回のラウンドr-1において算出された鍵ラウンド値kを、ビット数が同一である五つのデータk0、k1、k2、k3、k4に分割するステップと、前記データk0、k1、k2、k3を、それぞれ、前記新たな鍵ラウンド値krを構成するデータk1r、k2r、k3r、k4rとして出力するステップと、前記ラウンド定数Crと前記データk3との排他的論理和aを前記関数FRに入力することによってデータbを算出するステップと、前記データbと前記データk4との排他的論理和を前記新たな鍵ラウンド値krを構成するデータk0rとして出力するステップと、前記データk0r、k1r、k2r、k3r、k4rを連結して、前記新たな鍵ラウンド値krを算出するステップと、前記記憶媒体に前記鍵ラウンド値krを格納するステップと、前記鍵ラウンド値krを構成するk1rを前記新たな鍵定数Krとして、前記関数fRに対して出力するステップと、を含むことを特徴とする請求項11に記載のハッシュ値生成方法。非特許文献1に記載のSHA-1は、ハッシュ関数が持つべき安全性である衝突耐性に問題があることが知られており、SHA-2ハッシュ族についても、SHA-1と類似した構造であることから、ハッシュ関数が持つべき安全性に問題を生ずる可能性がある。そこで、本発明は、安全性の評価が可能なハッシュ関数を提供することを目的とする。従来技術は、算術加算による非線形変換処理と巡回シフト変換による線型変換処理との組み合わせ処理を一回実行しているため、安全性を確保するのが困難である。また、ハッシュ関数では、非線形変換が利用されており、その一つにS-box型によるものがある。従来のS-box型の非線形変換は、8ビットのS-boxでは、表参照によって実装され、また、4ビットのS-boxでは、論理演算の合成として実装される。しかし、8ビットのS-boxの場合、表を格納するためのROM使用量が増大し、また、4ビットのS-boxでは演算数が15~20程度と多くコードサイズが増大し、ROM使用量が増大する。したがって、従来の非線形変換を実現するためのプログラムは、マイコン等のROMサイズが小さいローエンド環境における実装することが困難であるという課題がある。一方、他の非線形変換の構成方法として、SHA-3候補ハッシュ関数Skeinが採用しているARX算術加算、巡回シフト、排他的論理和型によるものがある。この非線形置換に基づいてワード長を変えることによって、容易に非線形変換を設計することができる。しかし、前述した非線形置換では、差分攻撃に対する強度が小さいという課題がある。また、従来のハッシュ関数では、実装環境であるPC及びサーバ等に用いられるCPUのレジスタ幅に合わせた処理単位で内部の処理が実行される。例えば、CPUのレジスタ幅が32又は64ビットであれば、ハッシュ関数は、入力データを32又は64ビットのワード単位に区切って処理実行しており、これらのワードを8ビット、16ビット単位のような、より小さい長さのワードに分割することは一般的には行われない。これは、小さい長さのワードに分割すると、処理速度が悪くなる等の困難性が生じるためである。これは、一般的に32ビットCPUは、32ビット命令32ビット単位で処理を行う命令をサポートしているが、32より小さいビット幅16ビット又は8ビットの命令はサポートしないという点による。本発明では、ハッシュ値の安全性を確保し、かつ、ROM使用量を抑えたハッシュ関数を実現することを目的とする。本願において開示される発明の代表的な一例を示せば以下の通りである。すなわち、メッセージを所定のデータ長のメッセージブロックに分割し、前記分割された各メッセージブロックに対してブロック暗号の処理を実行することによって算出された出力データを連結して、所定のデータ長のハッシュ値を算出するハッシュ値生成装置であって、前記メッセージの入力を受け付け、前記ハッシュ値を出力する入出力部と、前記ハッシュ値の算出処理に用いられる初期値を格納する記憶領域を提供する記憶部と、前記初期値から暗号化に用いられる鍵定数Kを算出する関数fk、並びに、前記算出された鍵定数K及び前記メッセージブロックを入力することによって前記出力データを算出する関数fRを実行し、前記関数fk及び関数fRによって前記各メッセージブロックが変換された前記出力データを前記記憶部に格納し、前記出力データを連結して前記ハッシュ値を算出する演算部と、を備え、前記関数fRは、mビット幅のビット列の巡回演算を実行する巡回シフトと、二つのビット列を加算する算術加算とを含み、4mビットmは、m>1となる整数の入力データに対して4mビットの出力データを算出する非線形関数γと、2mビット幅のビット列の巡回演算を実行する巡回シフトと、二つのビット列の排他的論理和とを含み、4mビットの入力データに対して4mビットの出力データを算出する線形関数θと、の合成関数である関数FRを含むことを特徴とする。本発明によれば、算術加算、巡回シフト、及び排他的論理和を用いてハッシュ値を算出するため差分攻撃に対する耐性が向上する。また、S-boxを用いることなくハッシュ値を生成できるためメモリ容量に制限のある機器に適用することができる。以下、図面を用いて本発明の実施形態について説明する。図1は、本発明の実施形態におけるハッシュ値生成装置100の論理構成の一例を示すブロック図である。ハッシュ値生成装置100は、所定のメッセージからハッシュ値を生成する。本実施形態では、ハッシュ値生成装置100は、160ビットのハッシュ値を生成するものとする。なお、本発明は、生成するハッシュ値のビット数に限定されない。ハッシュ値生成装置100は、記憶部110、制御部120、入力部130及び出力部140を備える。制御部120は、記憶部110に格納される情報を用いて、ハッシュ値生成装置100に入力されたメッセージからハッシュ値を生成する。制御部120は、全体制御部121、メッセージブロック化部122、ラウンド定数生成部123、ラウンド鍵生成部124及び撹拌部125を備える。全体制御部121は、ハッシュ値生成装置100における処理の全体を制御する。本実施形態の全体制御部121は、処理対象であるメッセージをブロック化したメッセージブロックを管理し、また、ラウンド毎のラウンド定数生成部123、ラウンド鍵生成部124及び撹拌部125における処理を管理する。また、全体制御部121は、全てのラウンドを経て撹拌部125において算出された平文ラウンド値を出力することによって算出値を算出する。さらに、全体制御部121は、全てのメッセージブロック及び全てのラウンドを経て撹拌部125において算出された平文ラウンド値を出力することによって、ハッシュ値を算出する。メッセージブロック化部122は、ハッシュ値の算出対象となるメッセージを所定のビット長のブロックに分割し、パディングを行う。なお、ビット上は予め設定されているものとする。以下、所定のビット長のブロックをメッセージブロックとも記載する。ここで、本実施形態では、ハッシュ値の算出対象となるメッセージを80ビット毎のブロックに分割するようにしているが、このような態様に限定されるわけではない。また、本実施形態におけるパディングは、以下のような処理が考えられる。メッセージブロック化部122は、メッセージの最後に1を連結し、次に、vビットの0を連結する。ただし、vは、vLここで、Lはメッセージのビット長を示す値が80で割り切れる最小の非負整数とする。次に、メッセージブロック化部122は、最後の32ビットにLを格納する。なお、本実施形態においては、ハッシュ値を算出するメッセージをMで表し、パディングによってブロック化されたメッセージブロックをMで表す。また、メッセージMは、k1個kは1以上の整数のメッセージブロックに分割されるものとし、各メッセージブロックをMiiは、0≦i≦kを満たす整数で表す。ラウンド定数生成部123は、各ラウンドにおけるラウンド定数及び定数ラウンド値を算出する。ラウンド鍵生成部124は、各ラウンドにおける鍵ラウンド値及びラウンド鍵を算出する。撹拌部125は、各ラウンドにおける平文ラウンド値を算出する。記憶部110は、ハッシュ値を生成するために必要な情報及び数値を格納する。具体的には、記憶部110は、初期値記憶領域111、定数ラウンド値記憶領域112、鍵ラウンド値記憶領域113、平文ラウンド値記憶領域114、算出値記憶領域115及びハッシュ値記憶領域116を備える。初期値記憶領域111は、ハッシュ値の生成時に用いられる初期値を特定するための情報を格納する。本実施形態の初期値記憶領域111には、定数ラウンド値の初期値及び算出値の初期値が格納される。例えば、下式1に示すような定数cがラウンド定数の初期値として格納され、下式2に示すような定数H1が算出値の初期値として格納される。ここで、H10、H11、H12、H13及びH14は下式3~7に示すような定数とする。なお、ラウンド定数及び算出値の初期値として格納される定数は前述したものに限定されず、例えば、図示していない疑似乱数生成器等を用いて生成された乱数が、定数ラウンド値及び算出値の初期値として格納されてもよい。定数ラウンド値記憶領域112は、各メッセージブロックにおけるラウンド毎のラウンド定数を特定する情報を格納する。なお、本実施形態においては、ラウンド定数は、ラウンド定数生成部123によって生成される。鍵ラウンド値記憶領域113は、各メッセージブロックにおけるラウンド毎の鍵ラウンド値を特定する情報が格納される。なお、本実施形態においては、鍵ラウンド値は、ラウンド鍵生成部124によって生成される。平文ラウンド値記憶領域114は、各メッセージブロックにおけるラウンド毎の平文ラウンド値を特定する情報を格納する。なお、本実施形態において、平文ラウンド値は、撹拌部125によって生成される。算出値記憶領域115は、各メッセージブロックにおいて全てのラウンドの処理を経て算出された算出値を特定する情報を格納する。なお、本実施形態においては、算出値は、全体制御部121によって生成される。ハッシュ値記憶領域116は、全てのメッセージブロックに対するハッシュ値を特定する情報が格納される。なお、本実施形態においては、ハッシュ値は、全体制御部121によって生成される。なお、図示していないが、所定の演算に用いられる各種関数は、記憶部110に格納される。入力部130は、メッセージ等の情報の入力を受け付ける。出力部140は、算出されたハッシュ値を出力する。ハッシュ値生成装置100は、図2に示すようなハードウェア構成によって実現される。図2は、本発明の実施形態におけるハッシュ値生成装置100のハードウェア構成を示すブロック図である。ハッシュ値生成装置100は、プロセッサ201、メモリ202、外部記憶装置203、通信装置205、入力装置206、出力装置207及び読書装置208を備える計算機によって実現できる。プロセッサ201は、メモリ202に格納されるプログラムを実行する。プロセッサ201がメモリ202に格納されるプログラムを実行することによって、ハッシュ値生成装置100が備える機能が実現される。メモリ202は、プロセッサ201が実行するプログラム及びプログラムの実行に必要な情報を格納する。外部記憶装置203は、各種情報を格納する記憶媒体であり、例えば、HDDHardDiskDrive及びSSDSolidStateDrive等が考えられる。読書装置208は、CD-ROMCompactDiskReadOnlyMemory又はDVD-ROMDigitalVersatileDiskReadOnlyMemory等の可搬性を有する記憶媒体210から情報を読み出し、又は情報を書き込む。制御部120を実現するためのプログラムが記録された記憶媒体210を、汎用的な計算機にインストールすることによって、ハッシュ値生成装置100を実現することができる。通信装置205は、通信ネットワークに接続するための装置であり、例えば、NICNetworkInterfaceCard等が考えられる。入力装置206は、ハッシュ値生成装置100に情報を入力するための装置であり、例えば、キーボード及びマウスなどが含まれる。出力装置207は、ハッシュ値生成装置100における処理結果等を出力するための装置であり、ディスプレイなどが含まれる。本実施形態における記憶部110は、メモリ202及び外部記憶装置203の記憶領域を用いることによって実現できる。また、制御部120は、図1に示すような複数のプログラムモジュールから構成されるプログラムとして実現可能である。当該プログラムは、外部記憶装置203に格納されいる場合には、プロセッサ201が、メモリ202にロードして実行することによって制御部120が有する機能を実現できる。また、入力部130は、入力装置206を用いることによって実現可能であり、出力部140は、出力装置207を用いることによって実現可能である。制御部120を実現するめのプログラムは、予め、外部記憶装置203に格納されていなくてもよく、読書装置208を介して記憶媒体210から取得されてもよいし、又は、通信装置205を介して通信ネットワークから取得されてもよい。また、取得されたプログラムは、メモリ202及び外部記憶装置203のどちらに格納されてもよい。なお、ハッシュ値生成装置100を実現するためのハードウェア構成は図2に示すものに限定されず、1チップマイコンなどを用いても実現することができる。また、本実施形態では、全体制御部121、メッセージブロック化部122、ラウンド定数生成部123、ラウンド鍵生成部124及び撹拌部125をプログラムによって実現しているが、本発明はこれに限定されず、同一の機能を有する専用のハードウェア及び回路を用いてもよい。ここで、ハッシュ値の算出方法の概要について説明する。図3は、本発明の実施形態におけるハッシュ値の算出方法の一例を示す説明図である。まず、ハッシュ値生成装置100は、入力部130を介して、処理対象であるメッセージMの入力を受け付けると、全体制御部121が、メッセージブロック化部122にメッセージMを入力する。メッセージブロック化部122は、メッセージMに対してパディングを行い、80ビット毎のメッセージブロックMiに分割する。本実施形態では、メッセージMは、k1個のメッセージブロックM0,...,Mkに分割される。次に、全体制御部121は、初期値記憶領域111に格納される算出値の初期値H1と、ブロック化されたメッセージブロックM0とをブロック暗号fEに入力し、平文ラウンド値h0、h1を算出する。全体制御部121は、平文ラウンド値h0、h1を算出値として出力する。ここで、ブロック暗号fEを用いた処理は、後述するように、ラウンド定数生成部123、ラウンド鍵生成部124及び撹拌部125によって実行される。全体制御部121は、出力された算出値と、次のメッセージブロックM1とをブロック暗号fEに入力し、次の平文ラウンド値を算出する。なお、算出された算出値は、算出値記憶領域115に格納される。全体制御部121は、前述した処理を繰り返し実行することによって、平文ラウンド値を更新する。全体制御部121は、更新された平文ラウンド値と、最後のメッセージブロックMkと、をブロック暗号fEに入力し、ハッシュ値Hkを算出する。算出されたハッシュ値Hkは、ハッシュ値記憶領域116に格納される。なお、本発明におけるハッシュ値の算出処理方法は、図3に示した算出処理方法に限定されるわけではなく、ブロック暗号fEを利用すれば、どのようなものであってもよい。図4は、本発明の実施形態におけるハッシュ値生成装置100が実行するハッシュ値の生成処理を説明するフローチャートである。まず、ハッシュ値生成装置100は、入力部130を介して処理対象となるメッセージMを取得すると処理を開始するステップS110。ハッシュ値生成装置100は、取得したメッセージMを所定のデータ長のメッセージブロックに分割するステップS112。具体的には、メッセージブロック化部122が、メッセージMを所定のデータ長に分割して、分割されたメッセージに対してパディングを行って、k1個のメッセージブロックMiを生成する。本実施形態では、メッセージブロック化部122は、メッセージMを512ビットのデータ長のメッセージブロックMiに分割するものとする。ハッシュ値生成装置100は、記憶部110を初期化するステップS114。具体的には、全体制御部121が、定数ラウンド値記憶領域112、鍵ラウンド値記憶領域113、平文ラウンド値記憶領域114、算出値記憶領域115及びハッシュ値記憶領域116に格納される情報をリセットする。すなわち、全てのビット値が0に設定される。ハッシュ値生成装置100は、メッセージブロックMiのカウンタであるメッセージカウンタiの値を初期化するステップS116。具体的には、全体制御部121が、メッセージカウンタiの値に0を設定する。なお、メッセージカウンタiは、記憶部110に格納されるものとする。ハッシュ値生成装置100は、全てのメッセージブロックMiに対して処理が完了したか否かを判定するステップS118。具体的には、全体制御部121が、i=kを満たすか否かを判定する。i=kを満たさないと判定された場合、すなわち、ステップS118の判定結果がNoである場合、ハッシュ値生成装置100は、ステップS120の処理に進む。一方、i=kを満たすと判定された場合、すなわち、ステップS118の判定結果がYesである場合、ハッシュ値生成装置100は、ステップS132の処理に進む。全てのメッセージブロックMiに対して処理が完了していないと判定された場合、ハッシュ値生成装置100は、ラウンドのカウンタであるラウンドカウンタrを初期化するステップS120。具体的には、全体制御部121が、ラウンドカウンタrの値に0を設定する。ハッシュ値生成装置100は、全てのラウンドの処理が完了したか否かを判定するステップS122。具体的には、全体制御部121が、ラウンドカウンタrの値が、予め設定されたラウンド数Rに対して、r=R1を満たすか否かを判定する。r=R1を満たすと判定された場合、すなわち、ステップS122の判定結果がYESの場合、ハッシュ値生成装置100は、ステップS128の処理に進む。一方、r=R1を満たさないと判定された場合、すなわち、ステップS122の判定結果がNOの場合、ハッシュ値生成装置100は、ステップS124の処理に進む。全てのラウンドの処理が完了していないと判定された場合、ハッシュ値生成装置100は、メッセージブロックMiに対する所定のラウンドの処理を実行するステップS124。具体的には、ラウンド定数生成部123、ラウンド鍵生成部124及び撹拌部125が、ブロック暗号fEを用いて、ラウンド定数、鍵ラウンド値及び平文ラウンド値を算出し、定数ラウンド値記憶領域112、鍵ラウンド値記憶領域113及び平文ラウンド値記憶領域114に格納される情報を更新する。次に、ハッシュ値生成装置100は、ラウンドカウンタrを更新しステップS126、ステップS122に戻り、次のラウンドの処理を実行する。具体的には、全体制御部121が、現在のラウンドカウンタrの値に1をインクリメントしたものを新たなラウンドカウンタrの値とする。本実施形態では、ハッシュ値生成装置100は、一つのメッセージブロックMiに対して、ラウンドにおける処理を繰り返し実行する。ステップS122において、全てのラウンドの処理が完了したと判定された場合、ハッシュ値生成装置100は、算出値記憶領域115を更新するステップS128。具体的には、全体制御部121が、平文ラウンド値記憶領域114に格納される平文ラウンド値に基づいて算出値を算出し、算出値記憶領域115に格納される情報を更新する。ハッシュ値生成装置100は、メッセージカウンタiを更新してステップS130、ステップS118に戻り、同様の処理を実行する。具体的には、全体制御部121が、メッセージカウンタiの値に1をインクリメントしたものを新たなメッセージカウンタiの値とする。ステップS118において、全てのメッセージブロックMiに対して処理が完了したと判定された場合、ハッシュ値生成装置100は、ハッシュ値を算出して処理を終了するステップS132。具体的には、全体制御部121が、ラウンドカウンタrに初期値0を設定し、また、平文ラウンド値記憶領域114に格納される平文ラウンド値に基づいてハッシュ値を算出し、ハッシュ値記憶領域116に格納される情報を更新する。図5は、本発明の実施形態におけるブロック暗号fEにおける処理の概要を示す説明図である。ブロック暗号fEは、複数のラウンドを含み、各ラウンドでは鍵スケジューリング処理及び攪拌処理が実行される。r=iにおける鍵スケジューリング処理では、ラウンド定数C及び算出値を鍵ラウンド値変換関数fkに入力してラウンド鍵Kが算出される。また、r=iにおける攪拌処理では、ラウンド鍵K、メッセージブロックMi及び算出値を平文ラウンド値変換関数fRに入力して平文ラウンド値が算出される。以下では、r=iにおける平文ラウンド値をxと表す。ここでは、ラウンドr=0、1の場合を例に、処理の流れについて説明する。まず、ラウンド定数生成部123は、初期値記憶領域111に格納される定数ラウンド値の初期値cを取得し、取得した定数ラウンド値cを線形変換関数fcに入力することによって、定数ラウンド値cを算出する。ここで、線形変換関数fcは、図6に示すような変換を行う関数である。さらに、ラウンド定数生成部123は、算出された定数ラウンド値cの下位16ビットを、r=0におけるラウンド定数Cとして算出する。ラウンド定数生成部123は、算出された定数ラウンド値cを定数ラウンド値記憶領域112に格納し、ラウンド定数Cをラウンド鍵生成部124に出力する。次に、ラウンド鍵生成部124は、ブロック暗号fEに入力されたメッセージブロックがM0であるため、初期値記憶領域111に格納される算出値の初期値h0、h1を取得する。なお、メッセージブロックがM0以外の場合には、算出値記憶領域115に格納される算出値が取得される。なお、算出値記憶領域115には、一つ前のラウンドにおいて算出された算出値が格納される。ラウンド鍵生成部124は、ラウンド定数C、及び算出値の初期値h0を鍵ラウンド値変換関数fKに入力して鍵ラウンド値kを算出する。ここで、鍵ラウンド値変換関数fKについて説明する。図7は、本発明の実施形態における鍵ラウンド値変換関数fKを示す説明図である。鍵ラウンド値変換関数fkは、第r-1ラウンドの鍵ラウンド値kを5分割ここでは、16ビットに分割した分割データk0、k1、k2、k3、k4を、それぞれ、k0、k1、k2、k3、k4に変換する。さらに、鍵ラウンド値変換関数fkは、k0、k1、k2、k3、k4を連結することによって、第rラウンドの鍵ラウンド値kを算出する。ただし、r=0の場合、鍵ラウンド値kは、初期値記憶領域111に格納される算出値の初期値とする。具体的には、鍵ラウンド値変換関数fkでは、まず、ラウンド鍵生成部124が、鍵ラウンド値記憶領域113に格納される第r-1ラウンドの鍵ラウンド値kを5つに分割し、k0、k1、k2、k3、k4を出力する。次に、ラウンド鍵生成部124は、分割データk0、k1、k2、k3、をそれぞれk1、k2、k3、k4として出力する。次に、ラウンド鍵生成部124は、ラウンド定数生成部123によって生成されたラウンド定数Cと第r-1ラウンドのラウンド鍵の内のk3との排他的論理和の値aHを関数Fkに入力して、出力値bHを算出する。なお、出力値bHは下式8に示すように表される。ラウンド鍵生成部124は、出力値bHとk4との排他的論理和を算出し、算出された値をk0として出力する。ラウンド鍵生成部124は、以上のようにして算出されたk0、k1、k2、k3、k4を連結して第rラウンドの鍵ラウンド値kとして鍵ラウンド値記憶領域113に格納する。このとき、鍵ラウンド値記憶領域113に格納される第r-1ラウンドの鍵ラウンド値kは上書きされる。また、ラウンド鍵生成部124は、第rラウンドの鍵ラウンド値kの内のk1を、第rラウンドのラウンド鍵Kとして、撹拌部125に出力する。次に、ラウンド鍵生成部124が使用する関数FKについて説明する。ここでは、関数FKへの入力値をX、関数FKからの出力値をYとする。また、本実施形態において、X及びYは16ビットのデータである。関数FKは、非線形な変換を行う関数であり、関数FKでは、Xを8ビット毎のサブデータs0,s1に分割して、分割された各サブデータを下式9及び下式10に示すように非線形変換が行われる。ここで、変換後のサブデータをs0、s1とする。また、q1及びq2は自然数とする。関数FKは、最後に、算出されたサブデータs0、s1を連結して、出力値Yを出力する。ここで、>>>q1はq1ビットの右巡回シフトを示し、プラス記号は算術加算を示す。以上が鍵ラウンド値変換関数fKの説明である。図5の説明に戻る。ラウンド鍵生成部124は、前述したような処理によって算出された鍵ラウンド値kの内のk0を、ラウンドr=0のラウンド鍵Kとして算出する。また、ラウンド鍵生成部124は、鍵ラウンド値kを鍵ラウンド値記憶領域113に格納し、ラウンド鍵Kを撹拌部125に出力する。撹拌部125は、ブロック暗号fEに入力されたメッセージブロックMiと初期値h1とを平文ラウンド値変換関数fRに入力するによって、r=0における平文ラウンド値xを算出し、平文ラウンド値記憶領域114に格納する。以上が、第0ラウンドの処理である。ここで、平文ラウンド値変換関数fRについて説明する。図8は、本発明の実施形態における平文ラウンド値変換関数fRを示す説明図である。平文ラウンド値変換関数fRは、第r-1ラウンドの平文ラウンド値xを5分割ここでは、各々32ビットした分割データであるx0、x1、x2、x3、x4を、それぞれ、x0、x1、x2、x3、x4に変換する。さらに、平文ラウンド値変換関数fRは、変換された値を連結することによって、第rラウンドの平文ラウンド値xを生成する。ただし、r=0の場合、メッセージブロックMiと算出値h1とを連結した値が平文ラウンド値xとなる。具体的には、平文ラウンド値変換関数fRでは、まず、撹拌部125が、平文ラウンド値記憶領域114に格納される第r-1ラウンドの平文ラウンド値を5つに分割し、x0、x1、x2、x3、x4を出力する。次に、撹拌部125は、x0、x1、x2、x3をそれぞれ第rラウンドの平文ラウンド値の内のx1、x2、x3、x4として出力する。次に、撹拌部125は、ラウンド鍵生成部124によって生成されたラウンド鍵Kを用いてSを生成し、当該Sと第r-1ラウンドの平文ラウンド値の内のx3との排他的論理和の値pを、関数FRに入力して出力値qを算出する。Sは、32ビットのデータであり、上位16ビットがラウンド鍵Kの値、下位16ビットがすべて0の値を有する。なお、値qは下式11に示すように表される。撹拌部125は、値qと、第r-1ラウンドの平文ラウンド値の内のx4との排他的論理和を算出し、算出された値を第rラウンドの平文ラウンド鍵のx0とする。そして、撹拌部125は、以上のようにして算出されたx0、x1、x2、x3、x4を連結して第rラウンドの平文ラウンド値xとして平文ラウンド値記憶領域114に格納する。このとき、平文ラウンド値記憶領域114に格納される第r-1ラウンドの平文ラウンド値xは上書きされる。なお、関数FRの詳細については図9及び図10を用いて後述する。以上が、平文ラウンド値変換関数fRの説明である。次に、r=1の場合の処理の流れについて説明する。r=1において、ラウンド定数生成部123は、定数ラウンド値記憶領域112に格納される定数ラウンド値cと鍵ラウンド値記憶領域113に格納される鍵ラウンド値kとを線形変換関数fcに入力することによって、ラウンドr=1における定数ラウンド値cを算出する。ラウンド定数生成部123は、ラウンド定数cの下位16ビットを、r=1におけるラウンド定数Cとして算出する。ラウンド定数生成部123は、算出された定数ラウンド値cを定数ラウンド値記憶領域112に格納し、ラウンド定数Cをラウンド鍵生成部124に出力する。このとき、定数ラウンド値記憶領域112に格納される定数ラウンド値cは上書きされる。次に、ラウンド鍵生成部124は、鍵ラウンド値記憶領域113に格納される鍵ラウンド値kを鍵ラウンド値変換関数fKに入力することによって、r=1における鍵ラウンド値kを算出する。また、ラウンド鍵生成部124は、鍵ラウンド値kの内のk0を、r=1のラウンド鍵Kとして算出する。ラウンド鍵生成部124は、算出された鍵ラウンド値kを鍵ラウンド値記憶領域113に格納し、ラウンド鍵Kを撹拌部125に出力する。このとき、鍵ラウンド値記憶領域113に格納される鍵ラウンド値kは上書きされる。次に、撹拌部125は、平文ラウンド値記憶領域114に格納される平文ラウンド値xを平文ラウンド値変換関数fRに入力することによって、r=1における平文ラウンド値xを算出する。また、撹拌部125は、算出された平文ラウンド値xを平文ラウンド値記憶領域114に格納する。このとき、平文ラウンド値記憶領域114に格納される平文ラウンド値xは上書きされる。以上が、第1ラウンドの処理である。第2ラウンド以下の処理は、同一の処理であるため説明を省略する。ブロック暗号fEでは、r=kまで処理が繰り返し実行される。次に、関数FRについて説明する。図9は、本発明の実施形態における関数FRを示す説明図である。関数FRは、下式12に示すように、非線形変換γRをT回、線形変換θRをN回行う合成関数である。ここで、関数FRへの入力をX、関数FRからの出力をYとして説明する。本実施形態においては、X及びYは、32ビットのデータである。なお、図7に示す例では、入力Xは排他的論理和pに対応し、出力Yは出力qに対応する。まず、非線形変換γRでは、値Xを16ビットのサブデータs0,s1に分割して、分割された各サブデータを、下式13に示すように関数FKを用いて非線形変換を行う。ここで、変換後のサブデータをs0,s1とする。次に、線形変換θRでは、下式14及び下式15に示すように、非線形変換γRによって変換されたサブデータs0,s1の入替えを行う。なお、式14及び式15は一例であって、他の入替え方式を採用してもよい。ここで、変換後のサブデータをy0,y1とする。ここで、q3及びq4は自然数とする。そして、算出されたサブデータy0,y1を連結したものを、関数FRの出力Yとする。なお、関数FRにおける非線形変換γRと、線形変換θRとの適用回数については、それぞれ適宜変更可能である。図10は、本発明の実施形態における関数FRの処理の流れを説明するフローチャートである。ハッシュ値生成装置100は、32ビットの入力値Xを受け付けるとステップS210、当該入力値Xを2つのビットデータに分割するステップS212。具体的には、撹拌部125が、入力値Xの上位16ビットのビットデータs0と、下位16ビットのビットデータs1とに分割する。以下では、上位16ビットのビットデータを上位ビットデータs0と記載し、下位16ビットのビットデータを下位ビットデータs1と記載する。ハッシュ値生成装置100は、それぞれのビットデータを関数FKに入力して、ビットデータを変換するステップS214。関数FKを用いた変換処理では、図7及び図9において説明したような処理が実行される。ハッシュ値生成装置100は、上位ビットデータs0に巡回シフトを適用したビットデータと、下位ビットデータs1との排他的論理和の値y1を算出するステップS216。また、ハッシュ値生成装置100は、値y1に巡回シフトを適用したビットデータと、上位ビットデータs0との排他的論理和の値y0を算出するステップS218。ハッシュ値生成装置100は、ビットデータy0及びy1を連結して出力Yを算出するステップS220。以上のように、本発明では、160ビットにおけるブロック暗号を用いている。本発明によれば、算術加算による非線形変換処理と巡回シフト変換による線型変換処理との組み合わせ処理を複数回実行しているため、理論的安全性を確保する共に、Sboxを用いないためハッシュ値を生成するプログラムのコードを小さくすることができる。また、本発明では、入力データを16ビット又は8ビットに分割して、ハッシュ値を算出できるため、汎用のPC及びサーバ以外の組み込み機器等に適用することができる。"