図1は、本発明の第一の実施形態であるハッシュ値生成装置100の概略図である。
ここで、本実施形態においては、512ビットのハッシュ値を生成するようにしている。
図示するように、ハッシュ値生成装置100は、記憶部110と、制御部120と、入力部130と、出力部140と、を備える。
記憶部110は、初期値記憶領域111と、定数ラウンド値記憶領域112と、鍵ラウンド値記憶領域113と、平文ラウンド値記憶領域114と、算出値記憶領域115と、ハッシュ値記憶領域116と、を備える。
初期値記憶領域111には、ハッシュ値を生成する際の初期値を特定する情報が格納される。
本実施形態においては、ハッシュ値を生成する際の初期値として、定数ラウンド値の初期値と、算出値の初期値と、が記憶される。
ここで、定数ラウンド値の初期値は、例えば、c(−1)=0xffffffffffffffffffffffffffffffffといった定数が記憶される。
また、算出値の初期値は、H−1=(H−1.0,H−1.1,・・・,H−1.7)であり、H−1.0=0x0000000000000000、H−1.1=0x0000000000000000、H−1.2=0x0000000000000000、H−1.3=0x0000000000000000、H−1.4=0x0000000000000000、H−1.5=0x0000000000000000、H−1.6=0x0000000000000000、H−1.7=0x0000000000000000、といった定数が記憶される。
なお、定数ラウンド値及び算出値の初期値に使用される定数はこれらに限定されるわけではなく、例えば、疑似乱数生成器等で生成された乱数を使用することも可能である。
定数ラウンド値記憶領域112には、各々のメッセージブロックにおけるラウンド毎の定数ラウンド値を特定する情報が格納される。
なお、本実施形態においては、定数ラウンド値は、後述するラウンド定数生成部123で生成される。
鍵ラウンド値記憶領域113には、各々のメッセージブロックにおけるラウンド毎の鍵ラウンド値を特定する情報が格納される。
なお、本実施形態においては、鍵ラウンド値は、後述する第一ラウンド鍵生成部124又は第二ラウンド鍵生成部125で生成される。
平文ラウンド値記憶領域114には、各々のメッセージブロックにおけるラウンド毎の平文ラウンド値を特定する情報が格納される。
なお、本実施形態においては、平文ラウンド値は、後述する撹拌部126で生成される。
算出値記憶領域115には、各々のメッセージブロックにおいて全てのラウンドを経て算出された算出値を特定する情報が格納される。
なお、本実施形態においては、算出値は、後述する全体制御部121で生成される。
ハッシュ値記憶領域には、全てのメッセージブロックにおいて全てのラウンドを経て算出されたハッシュ値を特定する情報が格納される。
なお、本実施形態においては、ハッシュ値は、後述する全体制御部121で生成される。
制御部120は、全体制御部121と、メッセージブロック化部122と、ラウンド定数生成部123と、第一ラウンド鍵生成部124と、第二ラウンド鍵生成部125と、撹拌部126と、を備える。
全体制御部121は、ハッシュ値生成装置100における処理の全体を制御する。
特に、本実施形態においては、ハッシュ値を算出するメッセージをブロック化したメッセージブロックを管理する処理や、ラウンド定数生成部123、第一ラウンド鍵生成部124、第二ラウンド鍵生成部125及び撹拌部126でのラウンドを管理する処理を行う。
また、全体制御部121は、全てのラウンドを経て撹拌部126において算出された平文ラウンド値と、当該ラウンドでの処理の対象となったメッセージブロックと、の排他的論理和を算出することで、算出値を算出する。
さらに、全体制御部121は、全てのメッセージブロック及び全てのラウンドを経て撹拌部126において算出された平文ラウンド値と、最後のメッセージブロックと、の排他的論理和を算出することで、ハッシュ値を算出する。
メッセージブロック化部122は、ハッシュ値を算出する対象となるメッセージを予め定められたビット長のブロックに分割し、パディングを行う。
ここで、本実施形態では、ハッシュ値を算出する対象となるメッセージを512ビット毎のブロックに分割するようにしているが、このような態様に限定されるわけではない。
また、例えば、本実施形態におけるパディングは、以下のようにして行う。
まず、メッセージブロック化部122は、ハッシュ値を算出する対象となるメッセージのビット数が、512ビットで割り切れる場合には、当該メッセージを512ビット毎に分割することで各々のメッセージブロックを生成するとともに、メッセージブロックを追加して最後のメッセージブロックとする。
そして、メッセージブロック化部122は、この最後のメッセージブロックにおいて、先頭ビットに「1」、先頭ビットの次のビットから数えて383ビットまでに「0」、最後の128ビットにメッセージのビット長、を特定する情報を格納する。
次に、メッセージブロック化部122は、ハッシュ値を算出する対象となるメッセージのビット数が、512ビットで割り切れない場合には、当該メッセージを512ビット毎に分割することで各々のメッセージブロックを生成するとともに、分割した最後尾のメッセージブロックには最後のビットまで「0」を特定する情報を格納することで、512ビットにし、さらに、メッセージブロックを追加して最後のメッセージブロックとする。
そして、メッセージブロック化部122は、この最後のメッセージブロックにおいて、先頭ビットから数えて384ビットまでに「0」、最後の128ビットにメッセージのビット長、を特定する情報を格納する。
なお、本実施形態においては、ハッシュ値を算出するメッセージをMとし、パディングにより、512ビットで割り切れるようなビット長にされたメッセージをM’とし、メッセージブロックの数をk+1(kは1以上の整数)とし、各々のメッセージブロックをM’i(iは、0≦i≦kなる整数)とする。
ラウンド定数生成部123は、各ラウンドにおける定数ラウンド値及びラウンド定数を算出する。
本実施形態においては、ラウンド定数生成部123は、最初のラウンドの場合には初期値記憶領域111に記憶されている定数ラウンド値の初期値から、または、最初のラウンドではない場合には定数ラウンド値記憶領域112に記憶されている前ラウンドにおける定数ラウンド値から、線形変換関数fcを用いて、各ラウンドにおける定数ラウンド値を算出する。
例えば、図2(線形変換関数fcを示す概略図)に示すように、ラウンド定数生成部123は、前ラウンド(r−1)の定数ラウンド値c(r−1)(r=0の場合には定数ラウンド値の初期値)を関数fLに入力して算出された値の上位ビット(本実施形態では、上位64ビット)と下位ビット(本実施形態では、下位64ビット)を入れ替えることにより、今ラウンド(r)の定数ラウンド値c(r)を算出する。
即ち、下記の(1)式及び(2)式に示されるようにして、前ラウンドの定数ラウンド値c(r−1)(r=0の場合には定数ラウンド値の初期値)から今ラウンドの定数ラウンド値c(r)を算出する。
ここで、(1)式及び(2)式において、tH及びtLは、それぞれ、定数ラウンド値c(r−1)(r=0の場合には定数ラウンド値の初期値)を関数fLに入力して算出された値の上位ビット及び下位ビットである。
また、関数fLは、線形フィードバックシフトレジスタ(LFSR)を用いる。
一般に、LFSRは多項式で決定されるが、ここではLFSRを決定する多項式g(x)を、下記の(3)式のように定義する。
但し、g(x)は有限体GF(2)において定義される多項式である。
なお、関数fLの擬似コードは、下記の(4)のように示される。
ここで、「<<X」は、Xビットの左シフトを示し、「>>Y」は、Yビットの右シフトを示し、「^」は、ビット毎の排他的論理和を示し、「&」は、ビット毎の論理積を示し、「|」は、ビット毎の論理和を示す。また、hは、定数ラウンド値c(r−1)における上位ビット(上位64ビット)、lは、定数ラウンド値c(r−1)における下位ビット(下位64ビット)である。
そして、ラウンド定数生成部123は、算出したラウンド(r)での定数ラウンド値c(r)の下位64ビットを、第rラウンドにおけるラウンド定数C(r)として、第一ラウンド鍵生成部124又は第二ラウンド鍵生成部125に出力する。
以下に、R=96の場合におけるC(r)の一例を掲げる。
C(0)=0x9916b42b1075d3c4、C(1)=0xef660b4c6b97a9a1、C(2)=0x645ad0ac41d74f11、C(3)=0xdb7166e541d48abf、C(4)=0x81f2b60293356a19、C(5)=0x0b2cd041e8d806c6、C(6)=0x71ba676d3737d203、C(7)=0x5ac3fe60d882617f、C(8)=0xd670690748b71e50、C(9)=0x0de6b2578d83a9c6、C(10)=0x495850aeb6b42f1c、C(11)=0x379ac95e360ea718、C(12)=0x4388096e355a904b、C(13)=0xa81b9a1fa3d8e607、C(14)=0x1eb9d10b41021771、C(15)=0xa06e687e8f63981c、C(16)=0x7ae7442d04085dc5、C(17)=0x81b9a1fa3d8e6070、C(18)=0x8d745b60ffab5b2e、C(19)=0x7096388f8ddbfba6、C(20)=0x43a1d2e4854f16df、C(21)=0xd2c1168da307b8c4、C(22)=0x686e0046fab67746、C(23)=0x5b9dae851876b54c、C(24)=0xc7514acf0553f123、C(25)=0x7eef4ea7f5b2836d、C(26)=0x7bac60e8fac5e8b7、C(27)=0xeb24ce2c42a25be8、C(28)=0x8858c877049d8ee6、C(29)=0xbc0acc029ee139fd、C(30)=0x216321dc12763b99、C(31)=0xf02b300a7b84e7f4、C(32)=0x858c877049d8ee65、C(33)=0xa6458bfd0199b3ea、C(34)=0x6042a2a65c81c3f2、C(35)=0xef6690937d84b5cf、C(36)=0x91937e2ae66f5995、C(37)=0xdb7309991998fb06、C(38)=0x303d47cce25f1c32、C(39)=0x7d55d2d7f20bba44、C(40)=0xc0f51f33897c70c8、C(41)=0x93be008b27a4c52a、C(42)=0x134d887db199957d、C(43)=0x4ef8022c9e9314a8、C(44)=0x4d3621f6c66655f4、C(45)=0x5d09436695c67e9b、C(46)=0x244173688df1018c、C(47)=0x12cc464eb893d657、C(48)=0xe77572c54c267c57、C(49)=0x3d41a65d99ad233a、C(50)=0x8d4c3fa6a4f1a700、C(51)=0xf506997666b48ce9、C(52)=0x3530fe9a93c69c01、C(53)=0xb2f32e0d75581f9f、C(54)=0xa2b3450d34f80a62、C(55)=0xbdbc0752ae82041a、C(56)=0xfcbdab53a80253ee、C(57)=0x8080a22dc1ea6a0e、C(58)=0xe26f59fd346119e5、C(59)=0x020288b707a9a839、C(60)=0xef542c203e0e4baf、C(61)=0x7e7a9dbb6544da82、C(62)=0xadc944336c5178e0、C(63)=0x9f033d397a994632、C(64)=0xc155afaacaa799e6、C(65)=0x0a7c4b82918762ae、C(66)=0x15cf4a18bef631c4、C(67)=0x29f12e0a461d8ab8、C(68)=0x573d2862fbd8c710、C(69)=0xa7c4b82918762ae0、C(70)=0x3a1dea5f00e9307a、C(71)=0xe9625fc31a3ad1e7、C(72)=0x9e07161b7846bb8e、C(73)=0xb5108bbffc8311c1、C(74)=0x781c586de11aee39、C(75)=0xd4422efff20c4704、C(76)=0x86982a636be194de、C(77)=0x41914f4c5c594a4d、C(78)=0x1a60a98daf865378、C(79)=0x60ac76e59eef050f、C(80)=0x1ff21951c5fb3787、C(81)=0x92282f25efd44260、C(82)=0x7fc8654717ecde1d、C(83)=0x48a0bc97bf510980、C(84)=0x99c8dec8b039544f、C(85)=0x321b06ed692c705d、C(86)=0x67237b22c0e5513c、C(87)=0xc86c1bb5a4b1c174、C(88)=0xfa64a75fec1f68ca、C(89)=0x31299a6506af538d、C(90)=0x8f7bd6ab5ff78f13、C(91)=0xb2d6d6f3615f3452、C(92)=0x4b9fe5ca043c462a、C(93)=0xbd2be4aafe9eab2f、C(94)=0x3ee6639b84994ef5、C(95)=0xf4af92abfa7aacbc。
第一ラウンド鍵生成部124は、各ラウンドにおける鍵ラウンド値及びラウンド鍵を算出する処理を行う。
例えば、第一ラウンド鍵生成部124による鍵ラウンド値の算出は、図3(第一鍵ラウンド値変換関数fkの概略図)に示す第一鍵ラウンド値変換関数fkを用いて行われる。
図示するように、第一鍵ラウンド値変換関数fkは、第r−1ラウンドの鍵ラウンド値k(r−1)(但し、r=0の場合は、算出値記憶領域115に記憶されている算出値、または、初期値記憶領域111に記憶されている算出値の初期値)を8分割(ここでは、各々64ビット)した分割データであるk0 (r−1)、k1 (r−1)、k2 (r−1)、k3 (r−1)、k4 (r−1)、k5 (r−1)、k6 (r−1)、k7 (r−1)を、それぞれ、k0 (r)、k1 (r)、k2 (r)、k3 (r)、k4 (r)、k5 (r)、k6 (r)、k7 (r)に変換し、変換したこれらの値を連結することで、第rラウンドの鍵ラウンド値k(r)を生成する関数である。
具体的には、第一鍵ラウンド値変換関数fkでは、まず、第一ラウンド鍵生成部124が、鍵ラウンド値記憶領域113に記憶されている第r−1ラウンドの鍵ラウンド値(但し、r=0の場合は、算出値記憶領域115に記憶されている算出値、または、初期値記憶領域111に記憶されている算出値の初期値)を、k0 (r−1)、k1 (r−1)、k2 (r−1)、k3 (r−1)、k4 (r−1)、k5 (r−1)、k6 (r−1)、k7 (r−1)に8等分する。
次に、第一ラウンド鍵生成部124は、第r−1ラウンドの鍵ラウンド値の内のk0 (r−1)、k1 (r−1)、k2 (r−1)、k3 (r−1)、をそれぞれ第rラウンドの鍵ラウンド値の内のk2 (r)、k3 (r)、k4 (r)、k5 (r)、とする。
次に、第一ラウンド鍵生成部124は、ラウンド定数生成部123で生成されたラウンド定数C(r)及び第r−1ラウンドのラウンド鍵の内のk4 (r−1)の排他的論理和の値aHと、第r−1ラウンドのラウンド鍵の内のk5 (r−1)の値aLと、を連結した値aをF関数である関数Fkに入力した出力値の内の上位ビット(ここでは、上位64ビット)の値bH(bH=Fk(k4 (r−1) XOR C(r),k5 (r−1))H)と、下位ビット(ここでは、下位64ビット)の値bL(bL=Fk(k4 (r−1) XOR C(r),k5 (r−1))L)と、を算出する。
そして、第一ラウンド鍵生成部124は、値bHと、第r−1ラウンドの鍵ラウンド値の内のk6 (r−1)と、の排他的論理和を算出し、算出した値を第rラウンドの鍵ラウンド値のk0 (r)とする。
また、第一ラウンド鍵生成部124は、値bLと、第r−1ラウンドの鍵ラウンド値の内のk7 (r−1)と、の排他的論理和を算出し、算出した値を第rラウンドの鍵ラウンド値のk1 (r)とする。
次に、第一ラウンド鍵生成部124は、第r−1ラウンドの鍵ラウンド値の内のk4 (r−1)、k5 (r−1)を、それぞれ第rラウンドの鍵ラウンド値k6 (r)、k7 (r)とする。
そして、第一ラウンド鍵生成部124は、以上のようにして算出したk0 (r)、k1 (r)、k2 (r)、k3 (r)、k4 (r)、k5 (r)、k6 (r)、k7 (r)を連結して第rラウンドの鍵ラウンド値として、第r−1ラウンドの鍵ラウンド値と入れ替えて鍵ラウンド値記憶領域113に記憶する。
また、第一ラウンド鍵生成部124は、第rラウンドの鍵ラウンド値の内のk3 (r)を、第rラウンドのラウンド鍵K(r)として、撹拌部126に出力する。
次に、第一ラウンド鍵生成部124で使用するF関数である関数FKについて説明する。
関数FKは、下記の(5)式に示すように、非線形変換γKと、線形変換λkと、の合成変換を行う関数である。
また、線形変換λkは、バイト置換πKと、行列変換θKと、の合成変換である。
ここで、関数FKへの入力をX、関数FKからの出力をYとして説明する。
本実施形態においては、X及びYは、128ビットのデータである。
まず、非線形変換γKでは、値Xを8ビット毎のサブデータ(s0,s1,・・・,s15)に分割して、分割した各々のサブデータを、下記の(6)式に示すように、置換テーブルS−boxを用いて非線形変換を行う。ここで、変換後のサブデータをs’0,s’1,・・・,s’15とする。
なお、置換テーブルSboxは、例えば、下記の(7)で示される。
次に、行列変換θKでは、上記の非線形変換γKでの変換後のサブデータ(s’0,s’1,・・・,s’15)を8行2列の行列にして、下記の(10)式に示すように、変換行列Aとの乗算を行うことで、変換を行う。ここで、変換後のサブデータをs”0,s”1,・・・,s”15とする。乗算は、有限体GF(28)上での乗算である。有限体GF(2^8)は、下記の(8)式及び(9)式を満たす。
ここで、変換行列Aは、ある列を入力列とし、当該入力列に対して変換行列Aによる変換を行った後の値の列を出力列とした場合に、入力列及び出力列に含まれる項の内、値が「0」ではない項が、9個以上になるような変換であれば、どのような変換行列を用いてもよい。
次に、バイト置換πKでは、下記の(11)式に示すように、行列変換θKで変換されたサブデータ(s”0,s”1,・・・,s”15)のうちの半分のデータの入れ替えを行う。なお、変換後のサブデータをy0,y1,・・・,y15とする。
そして、以上のようにして算出されたサブデータ(y0,y1,・・・,y15)を(12)式のように連結することで、関数FKの出力Yとする。
以上の関数FKでは、後述する関数FRと比較して、一つの入力に対して一回の処理で出力を行うため、計算量が少なくてすみ、軽実装が可能となる。
図1に戻り、第二ラウンド鍵生成部125は、各ラウンドにおける鍵ラウンド値及びラウンド鍵を算出する処理を行う。
例えば、第二ラウンド鍵生成部125による鍵ラウンド値の算出は、図4(第二鍵ラウンド値変換関数f’Kの概略図)に示す第二鍵ラウンド値変換関数f’Kを用いて行われる。
図示するように、第二鍵ラウンド値変換関数f’Kは、第r−1ラウンドの鍵ラウンド値k(r−1)(但し、r=0の場合は、算出値記憶領域115に記憶されている算出値、または、初期値記憶領域111に記憶されている算出値の初期値)を8分割(ここでは、各々64ビット)した分割データであるk0 (r−1)、k1 (r−1)、k2 (r−1)、k3 (r−1)、k4 (r−1)、k5 (r−1)、k6 (r−1)、k7 (r−1)を、それぞれ、k0 (r)、k1 (r)、k2 (r)、k3 (r)、k4 (r)、k5 (r)、k6 (r)、k7 (r)に変換し、変換したこれらの値を連結することで、第rラウンドの鍵ラウンド値k(r)を生成する関数である。
具体的には、第二鍵ラウンド値変換関数f’Kでは、まず、第二ラウンド鍵生成部125が、鍵ラウンド値記憶領域113に記憶されている第r−1ラウンドの鍵ラウンド値(但し、r=0の場合は、算出値記憶領域115に記憶されている算出値)を、k0 (r−1)、k1 (r−1)、k2 (r−1)、k3 (r−1)、k4 (r−1)、k5 (r−1)、k6 (r−1)、k7 (r−1)に8等分する。
次に、第二ラウンド鍵生成部125は、第r−1ラウンドの鍵ラウンド値(r=0の場合には算出値)の内のk0 (r−1)、k1 (r−1)、k2 (r−1)、k3 (r−1)、をそれぞれ第rラウンドの鍵ラウンド値の内のk2 (r)、k3 (r)、k4 (r)、k5 (r)、とする。
次に、第二ラウンド鍵生成部125は、ラウンド定数生成部123で生成されたラウンド定数C(r)及び第r−1ラウンドの鍵ラウンド値(r=0の場合には算出値)の内のk4 (r−1)の排他的論理和である値a’Hと、第r−1ラウンドの鍵ラウンド値(r=0の場合には算出値)の内のk5 (r−1)の値a’Lと、を連結した値a’をF関数である関数FRに入力した出力値の内の上位ビット(ここでは、上位64ビット)の値b’H(b’H=FR(k4 (r−1) XOR C(r),k5 (r−1))H)と、下位ビット(ここでは、下位64ビット)の値b’L(bL=FR(k4 (r−1) XOR C(r),k5 (r−1))L)と、を算出する。
そして、第二ラウンド鍵生成部125は、値b’Hと、第r−1ラウンドの鍵ラウンド値(r=0の場合には算出値)の内のk6 (r−1)と、の排他的論理和を算出し、算出した値を第rラウンドの鍵ラウンド値のk0 (r)とする。
また、第二ラウンド鍵生成部125は、値b’Lと、第r−1ラウンドの鍵ラウンド値(r=0の場合には算出値)の内のk7 (r−1)と、の排他的論理和を算出し、算出した値を第rラウンドの鍵ラウンド値のk1 (r)とする。
次に、第二ラウンド鍵生成部125は、第r−1ラウンドの鍵ラウンド値(r=0の場合には算出値)の内のk4 (r−1)、k5 (r−1)を、それぞれ第rラウンドの鍵ラウンド値k6 (r)、k7 (r)とする。
そして、第二ラウンド鍵生成部125は、以上のようにして算出したk0 (r)、k1 (r)、k2 (r)、k3 (r)、k4 (r)、k5 (r)、k6 (r)、k7 (r)を連結して第rラウンドの鍵ラウンド値として、第r−1ラウンドの鍵ラウンド値と入れ替えて鍵ラウンド値記憶領域113に記憶する。
また、第二ラウンド鍵生成部125は、第rラウンドの鍵ラウンド値の内のk3 (r)を、第rラウンドのラウンド鍵K(r)として、撹拌部126に出力する。
次に、第二ラウンド鍵生成部125で使用するF関数である関数FRについて説明する。
関数FRは、下記の(13)式に示すように、非線形変換γRと、バイト置換πRと、行列変換θRと、の合成変換を4回(4段)行う関数である。
ここで、関数FRへの入力をX、関数FRからの出力をYとして説明する。本実施形態においては、X及びYは、128ビットのデータである。
まず、非線形変換γRでは、値Xを8ビット毎のサブデータ(s0,s1,・・・,s15)に分割して、分割した各々のサブデータを、下記の(14)式に示すように、置換テーブルS−boxを用いて非線形変換を行う。ここで、変換後のサブデータをs’0,s’1,・・・,s’15とする。
なお、置換テーブルSboxは、例えば、上記の(7)で示されるものを使用すればよい。
次に、バイト置換πRでは、(15)式に示すように、非線形変換γRで変換されたサブデータ(s’0,s’1,・・・,s’15)を4行4列の行列として、各々の列に含まれる各々の行のデータが各々異なる列に配置されるように、データの入れ替えを行う。なお、(15)式は一例であって、各々の列に含まれる各々の行のデータが各々異なる列に配置されるものであれば、他の入れ替え方式を採用することも可能である。
また、変換後のサブデータをs”0,s”1,・・・,s”15とする。
次に、行列変換θRでは、下記の(16)式に示すように、上記のバイト置換πRでの変換後のサブデータ(s”0,s”1,・・・,s”15)を要素とする4行4列の行列と、変換行列Bと、の有限体GF(28)上での乗算を行うことで、変換を行う。ここで、変換後のサブデータをy0,y1,・・・,y15とする。
ここで、変換行列Bは、ある列を入力列とし、当該入力列に対して変換行列Bによる変換を行った後の値の列を出力列とした場合に、入力列及び出力列に含まれる項の内、値が「0」ではない項が、5個以上になるような変換であれば、どのような変換行列を用いてもよい。
そして、このようにして算出されたサブデータ(y0,y1,・・・,y15)を、(17)式に示すように、サブデータ(s0,s1,・・・,s15)として、非線形変換γR、バイト置換πR及び行列変換θRによる変換を3回(合計4回)行うことで、算出されるサブデータ(y0,y1,・・・,y15)を(17)式のように連結することで、関数FRの出力Yとする。
以上の関数FRでは、前述の関数FKと比較して、一つの入力に対して4回の処理で出力を行うため、安全性を高めることができる。なお、この4回という回数については、適宜変更可能である。
図1に戻り、撹拌部126は、各ラウンドにおける平文ラウンド値を算出する処理を行う。
例えば、撹拌部126による平文ラウンド値の算出は、図5(平文ラウンド値変換関数fRの概略図)に示す平文ラウンド値変換関数fRを用いて行われる。
図示するように、平文ラウンド値変換関数fRは、第r−1ラウンドの平文ラウンド値x(r−1)(但し、r=0の場合は、メッセージブロック化部122でブロック化されたメッセージブロックM’i)を8分割(ここでは、各々64ビット)した分割データであるx0 (r−1)、x1 (r−1)、x2 (r−1)、x3 (r−1)、x4 (r−1)、x5 (r−1)、x6 (r−1)、x7 (r−1)を、それぞれ、x0 (r)、x1 (r)、x2 (r)、x3 (r)、x4 (r)、x5 (r)、x6 (r)、x7 (r)に変換し、変換したこれらの値を連結することで、第rラウンドの平文ラウンド値x(r)を生成する関数である。
具体的には、平文ラウンド値変換関数fRでは、まず、撹拌部126が、平文ラウンド値記憶領域114に記憶されている第r−1ラウンドの平文ラウンド値(但し、r=0の場合は、メッセージブロック化部122でブロック化されたメッセージブロックM’i)を、x0 (r−1)、x1 (r−1)、x2 (r−1)、x3 (r−1)、x4 (r−1)、x5 (r−1)、x6 (r−1)、x7 (r−1)に8等分する。
次に、撹拌部126は、第r−1ラウンドの平文ラウンド値(r=0の場合は、メッセージブロックM’i)の内のx0 (r−1)、x1 (r−1)、x2 (r−1)、x3 (r−1)、をそれぞれ第rラウンドの平文ラウンド値の内のx2 (r)、x3 (r)、x4 (r)、x5 (r)、とする。
次に、撹拌部126は、第一ラウンド鍵生成部124又は第二ラウンド鍵生成部125で生成されたラウンド鍵K(r)及び第r−1ラウンドの平文ラウンド値(r=0の場合は、メッセージブロックM’i)の内のx4 (r−1)の排他的論理和である値pHと、第r−1ラウンドの平文ラウンド値(r=0の場合は、メッセージブロックM’i)の内のx5 (r−1)の値pLと、を連結した値pをF関数である関数FRに入力した出力値の内の上位ビット(ここでは、上位64ビット)の値qHと(qH=FR(x4 (r−1) XOR K(r),x5 (r−1))H)、下位ビット(ここでは、下位64ビット)の値qLと(qL=FR(x4 (r−1) XOR K(r),x5 (r−1))L)、を算出する。
そして、撹拌部126は、値qHと、第r−1ラウンドの平文ラウンド値(r=0の場合は、メッセージブロックM’i)の内のx6 (r−1)と、の排他的論理和を算出し、算出した値を第rラウンドの平文ラウンド鍵のx0 (r)とする。
また、撹拌部126は、値qLと、第r−1ラウンドの平文ラウンド値(r=0の場合は、メッセージブロックM’i)の内のx7 (r−1)と、の排他的論理和を算出し、算出した値を第rラウンドの平文ラウンド値のx1 (r)とする。
次に、撹拌部126は、第r−1ラウンドの平文ラウンド値(r=0の場合は、メッセージブロックM’i)の内のx4 (r−1)、x5 (r−1)を、それぞれ第rラウンドの平文ラウンド値x6 (r)、x7 (r)とする。
そして、撹拌部126は、以上のようにして算出したx0 (r)、x1 (r)、x2 (r)、x3 (r)、x4 (r)、x5 (r)、x6 (r)、x7 (r)を連結して第rラウンドの平文ラウンド値として、第r−1ラウンドの鍵ラウンド値と入れ替えて平文ラウンド値記憶領域114に記憶する。
撹拌部126で使用するF関数である関数FRについては、上述の(13)式で示されているものと同様であるため、説明を省略する。
入力部130は、情報の入力を受け付ける。
出力部140は、情報を出力する。
以上に記載したハッシュ値生成装置100は、例えば、図6(コンピュータ900の概略図)に示すような、CPU(Central Processing Unit)901と、メモリ902と、HDD(Hard Disk Drive)等の外部記憶装置903と、CD−ROM(Compact Disk Read Only Memory)やDVD−ROM(Digital Versatile Disk Read Only Memory)等の可搬性を有する記憶媒体904に対して情報を読み書きする読書装置905と、キーボードやマウスなどの入力装置906と、ディスプレイなどの出力装置907と、通信ネットワークに接続するためのNIC(Network Interface Card)等の通信装置908と、を備えた一般的なコンピュータ900で実現できる。
例えば、記憶部110は、CPU901がメモリ902又は外部記憶装置903を利用することにより実現可能であり、制御部120は、外部記憶装置903に記憶されている所定のプログラムをメモリ902にロードしてCPU901で実行することで実現可能であり、入力部130は、CPU901が入力装置906を利用することで実現可能であり、出力部140は、CPU901が出力装置907を利用することで実現可能である。
この所定のプログラムは、読書装置905を介して記憶媒体904から、あるいは、通信装置908を介してネットワークから、外部記憶装置903にダウンロードされ、それから、メモリ902上にロードされてCPU901により実行されるようにしてもよい。また、読書装置905を介して記憶媒体904から、あるいは、通信装置908を介してネットワークから、メモリ902上に直接ロードされ、CPU901により実行されるようにしてもよい。
次に、図7(ハッシュ値の算出処理を示す概略図)を用いて、ハッシュ値生成装置100がハッシュ値を算出する処理の概略を示す。
まず、ハッシュ値生成装置100では、入力部130を介して、ハッシュ値を生成するメッセージMの入力を受け付け、ハッシュ値生成装置100の全体制御部121が、メッセージブロック化部122にメッセージMを入力する。
そして、メッセージブロック化部122では、メッセージMをパディングして、512ビット毎のメッセージブロック(M’0,・・・,M’k;kは1以上の整数)に分割する。
次に、全体制御部121は、初期値記憶領域111に記憶されている算出値の初期値H−1と、メッセージブロック化部122でブロック化されたメッセージブロックMi’のうち、最初のメッセージブロックM’0と、を第一ブロック暗号fEに入力することで、平文ラウンド値h0を算出する。
ここで、第一ブロック暗号fEを用いた処理は、後述するように、ラウンド定数生成部123、第一ラウンド鍵生成部124及び撹拌部126で行われる。
そして、全体制御部121は、算出した平文ラウンド値h0と、メッセージブロックM’0と、の排他的論理和を算出することで、算出値を求め、求めた算出値と、次のメッセージブロックM’1と、を第一ブロック暗号fEに入力することで、平文ラウンド値h1を算出する。なお、算出された算出値については、算出値記憶領域115に記憶される。
このような処理を、最後のメッセージブロックM’kの直前のメッセージブロックM’k−1まで繰り返すことで、平文ラウンド値hk−1を算出する。
そして、全体制御部121は、平文ラウンド値hk−1と、メッセージブロックM’k−1と、の排他的論理和で算出される算出値と、最後のメッセージブロックM’kと、を第二ブロック暗号f’Eに入力することにより、平文ラウンド値hkを算出する。
ここで、第二ブロック暗号f’Eを用いた処理は、後述するように、ラウンド定数生成部123、第二ラウンド鍵生成部125及び撹拌部126で行われる。
そして、全体制御部121は、平文ラウンド値hkと、最後のメッセージブロックM’kと、の排他的論理和でハッシュ値Hkを算出する。
このようなハッシュ値Hkは、ハッシュ値記憶領域116に記憶される。
なお、本発明におけるハッシュ値の算出処理(方法)は、図7に示した処理(方法)に限定されるわけではなく、第一ブロック暗号fE又は、第二ブロック暗号f’Eの少なくとも何れか一方を利用すれば、どのようなものであってもよく。
図8は、第一ブロック暗号fEでの処理を示す概略図である。
まず、ラウンド定数生成部123は、初期値記憶領域111に記憶されている定数ラウンド値の初期値を取得して、図2に示すような線形変換関数fcを用いた処理を行うことにより、ラウンドr=0における定数ラウンド値c(0)を算出し、定数ラウンド値c(0)の下位64ビットを、ラウンドr=0におけるラウンド定数C(0)として算出する。
そして、ラウンド定数生成部123は、算出した定数ラウンド値c(0)を定数ラウンド値記憶領域112に記憶し、ラウンド定数C(0)を第一ラウンド鍵生成部124に出力する。
次に、第一ラウンド鍵生成部124は、第一ブロック暗号fEに入力されたメッセージブロックM’iがメッセージブロックM’0の場合には、初期値記憶領域111に記憶されている算出値の初期値を取得して、一方、第一ブロック暗号fEに入力されたメッセージブロックM’iがメッセージブロックM’0ではない場合には、算出値記憶領域115に記憶されている前メッセージブロックM’iにおける算出値を取得して、図3に示すような第一鍵ラウンド値変換関数fKを用いた処理を行うことにより、r=0における鍵ラウンド値k(0)を算出し、また、鍵ラウンド値k(0)の内のk3 (0)を、ラウンドr=0のラウンド鍵K(0)として算出する。
そして、第一ラウンド鍵生成部124は、鍵ラウンド値k(0)を鍵ラウンド値記憶領域113に記憶し、ラウンド鍵K(0)を撹拌部126に出力する。
次に、撹拌部126は、第一ブロック暗号fEに入力されたメッセージブロックM’iを取得して、図5に示すような平文ラウンド値変換関数fRを用いた処理を行うことにより、r=0における平文ラウンド値x(0)を算出し、平文ラウンド値記憶領域114に記憶する。
以上で、第0ラウンドの処理を終了する。
次に、ラウンド定数生成部123は、定数ラウンド値記憶領域112に記憶されている定数ラウンド値c(0)を取得して、図2に示すような線形変換関数fcを用いた処理を行うことにより、ラウンドr=1における定数ラウンド値c(1)を算出し、定数ラウンド値c(1)の下位64ビットを、ラウンドr=1におけるラウンド定数C(1)として算出する。
そして、ラウンド定数生成部123は、算出した定数ラウンド値c(1)を、定数ラウンド値c(0)に置き換えて(いわゆる上書きして)、定数ラウンド値記憶領域112に記憶し、ラウンド定数C(1)を第一ラウンド鍵生成部124に出力する。
次に、第一ラウンド鍵生成部124は、鍵ラウンド値記憶領域113に記憶されている鍵ラウンド値k(0)を取得して、図3に示すような第一鍵ラウンド値変換関数fKを用いた処理を行うことにより、ラウンドr=1における鍵ラウンド値k(1)を算出し、また、鍵ラウンド値k(1)の内のk3 (1)を、ラウンドr=1のラウンド鍵K(1)として算出する。
そして、第一ラウンド鍵生成部124は、算出した鍵ラウンド値k(1)を、鍵ラウンド値k(0)に置き換えて(いわゆる上書きして)、鍵ラウンド値記憶領域113に記憶し、ラウンド鍵K(1)を撹拌部126に出力する。
次に、撹拌部126は、平文ラウンド値記憶領域114に記憶されている平文ラウンド値x(0)を取得して、図5に示すような平文ラウンド値変換関数fRを用いた処理を行うことにより、ラウンドr=1における平文ラウンド値x(1)を算出し、算出した平文ラウンド値x(1)を、平文ラウンド値x(0)に置き換えて(いわゆる上書きして)、平文ラウンド値記憶領域114に記憶する。
以上で、第1ラウンドの処理を終了する。
そして、以上に記載した第1ラウンドでの処理と同様の処理を、所定のラウンド(ここでは、第31ラウンド)まで繰り返すことで、第一ブロック暗号fEでの処理を終了する。
図9は、第二ブロック暗号f’Eでの処理を示す概略図である。
まず、ラウンド定数生成部123は、初期値記憶領域111に記憶されている定数ラウンド値の初期値を取得して、図2に示すような線形変換関数fcを用いた処理を行うことにより、ラウンドr=0における定数ラウンド値c(0)を算出し、定数ラウンド値c(0)の下位64ビットを、ラウンドr=0におけるラウンド定数C(0)として算出する。
そして、ラウンド定数生成部123は、算出した定数ラウンド値c(0)を定数ラウンド値記憶領域112に記憶し、ラウンド定数C(0)を第二ラウンド鍵生成部125に出力する。
次に、第二ラウンド鍵生成部125は、算出値記憶領域115に記憶されている前メッセージブロックM’k−1における算出値を取得して、図4に示すような第二鍵ラウンド値変換関数f’Kを用いた処理を行うことにより、r=0における鍵ラウンド値k(0)を算出し、また、鍵ラウンド値k(0)の内のk3 (0)を、ラウンドr=0のラウンド鍵K(0)として算出する。
そして、第二ラウンド鍵生成部125は、鍵ラウンド値k(0)を鍵ラウンド値記憶領域113に記憶し、ラウンド鍵K(0)を撹拌部126に出力する。
次に、撹拌部126は、第二ブロック暗号f’Eに入力されたメッセージブロックM’kを取得して、図5に示すような平文ラウンド値変換関数fRを用いた処理を行うことにより、r=0における平文ラウンド値x(0)を算出し、平文ラウンド値記憶領域114に記憶する。
以上で、第0ラウンドの処理を終了する。
次に、ラウンド定数生成部123は、定数ラウンド値記憶領域112に記憶されている定数ラウンド値c(0)を取得して、図2に示すような線形変換関数fcを用いた処理を行うことにより、ラウンドr=1における定数ラウンド値c(1)を算出し、定数ラウンド値c(1)の下位64ビットを、ラウンドr=1におけるラウンド定数C(1)として算出する。
そして、ラウンド定数生成部123は、算出した定数ラウンド値c(1)を、定数ラウンド値c(0)に置き換えて(いわゆる上書きして)、定数ラウンド値記憶領域112に記憶し、ラウンド定数C(1)を第二ラウンド鍵生成部125に出力する。
次に、第二ラウンド鍵生成部125は、鍵ラウンド値記憶領域113に記憶されている鍵ラウンド値k(0)を取得して、図4に示すような第二鍵ラウンド値変換関数f’Kを用いた処理を行うことにより、ラウンドr=1における鍵ラウンド値k(1)を算出し、また、鍵ラウンド値k(1)の内のk3 (1)を、ラウンドr=1のラウンド鍵K(1)として算出する。
そして、第二ラウンド鍵生成部125は、算出した鍵ラウンド値k(1)を、鍵ラウンド値k(0)に置き換えて(いわゆる上書きして)、鍵ラウンド値記憶領域113に記憶し、ラウンド鍵K(1)を撹拌部126に出力する。
次に、撹拌部126は、平文ラウンド値記憶領域114に記憶されている平文ラウンド値x(0)を取得して、図5に示すような平文ラウンド値変換関数fRを用いた処理を行うことにより、ラウンドr=1における平文ラウンド値x(1)を算出し、算出した平文ラウンド値x(1)を、平文ラウンド値x(0)に置き換えて(いわゆる上書きして)、平文ラウンド値記憶領域114に記憶する。
以上で、第1ラウンドの処理を終了する。
以上に記載した第1ラウンドでの処理と同様の処理を、所定のラウンド(ここでは、第31ラウンド)まで繰り返すことで、第二ブロック暗号f’Eでの処理を終了する。
図10は、ハッシュ値生成装置100におけるハッシュ値の生成処理を示すフローチャートである。
まず、ハッシュ値生成装置100は、入力部130を介してハッシュ値を生成する元となるメッセージMを取得する(S10)。
次に、メッセージブロック化部122は、入出部130を介して取得したメッセージを予め定められたデータ長に分割することによりk+1個のメッセージブロックM’iを生成する(S11)。ここで、本実施形態においては、メッセージを512ビットのデータ長に分割するようにしている。
次に、全体制御部121は、定数ラウンド値記憶領域112、鍵ラウンド値記憶領域113、平文ラウンド値記憶領域114、算出値記憶領域115及びハッシュ値記憶領域116に記憶されている情報のリセットを行う(S12)。具体的には、全てのビット値を「0」にする。
次に、全体制御部121は、メッセージブロックのカウンタであるメッセージカウンタiの値を初期化する(S13)。ここでは、メッセージカウンタiの値に「0」を代入する。
次に、全体制御部121は、メッセージカウンタiの値が、i=kとなっているか否かを判断する(S14)。
ステップS14で、i=kとなっていない場合には(ステップS14でNo)、ステップS15に進み、i=kとなっている場合には(ステップS14でYes)、ステップS21に進む。
ステップS15では、全体制御部121は、ラウンドのカウンタであるラウンドカウンタrに初期値「0」を代入する。
次に、全体制御部121は、ラウンドカウンタrの値が、予め定められた第一ラウンド数(ここでは、ROUND NUM=31)に対して、r=(ROUND NUM)+1の関係にあるか否かを判断する(S16)。ステップS16において、r=(ROUND NUM)+1の関係にある場合には、ステップS19に進み、r=(ROUND NUM)+1の関係にない場合には、ステップS17に進む。
ステップS17では、ラウンド定数生成部123、第一ラウンド鍵生成部124及び撹拌部126において、第一ブロック暗号fEを用いて、定数ラウンド値、鍵ラウンド値及び平文ラウンド値を算出し、定数ラウンド値記憶領域112、鍵ラウンド値記憶領域113及び平文ラウンド値記憶領域114に記憶されている情報を更新する。
次に、全体制御部121は、ラウンドカウンタrの値に「1」をインクリメントして、ステップS16に戻って処理を繰り返す。
また、ステップS19では、全体制御部121は、平文ラウンド値記憶領域114に記憶されている平文ラウンド値と、メッセージブロックM’iと、の排他的論理和を算出することで算出値を算出し、算出した算出値で算出値記憶領域115に記憶されている情報を更新する。
そして、全体制御部121は、メッセージカウンタiの値に「1」をインクリメントして(S20)、ステップS14に戻って処理を繰り返す。
一方、ステップS14において、i=kとなっている場合には(ステップS14でYes)、ステップS21において、全体制御部121は、ラウンドのカウンタであるラウンドカウンタrに初期値「0」を代入する。
次に、全体制御部121は、ラウンドカウンタrの値が、予め定められた第二ラウンド数(ここでは、ROUND NUM=31)に対して、r=(ROUND NUM)+1の関係にあるか否かを判断する(S22)。
そして、ステップS22において、r=(ROUND NUM)+1の関係にある場合には(ステップS22でYes)、ステップS25に進み、r=(ROUND NUM)+1の関係にない場合には(ステップS22でNo)、ステップS23に進む。
ステップS23では、ラウンド定数生成部123、第二ラウンド鍵生成部125及び撹拌部126において、第二ブロック暗号f’Eを用いて、定数ラウンド値、鍵ラウンド値及び平文ラウンド値を算出し、定数ラウンド値記憶領域112、鍵ラウンド値記憶領域113及び平文ラウンド値記憶領域114に記憶されている情報を更新する。
次に、全体制御部121は、ラウンドカウンタrの値に「1」をインクリメントして(S24)、ステップS22に戻って処理を繰り返す。
また、ステップS25では、全体制御部121は、平文ラウンド値記憶領域114に記憶されている平文ラウンド値と、メッセージブロックM’kと、の排他的論理和を算出することでハッシュ値を算出し、ハッシュ値記憶領域116に記憶されている情報を更新する。
以上のように、本実施形態においては、512ビットにおけるブロック暗号を用いているため、理論的安全性と実装安全性が保証されたハッシュ関数を提供することができる。
図11は、本発明の第二の実施形態であるハッシュ値生成装置200の概略図である。
ここで、本実施形態においては、256ビットのハッシュ値を生成するようにしている。
図示するように、ハッシュ値生成装置200は、記憶部210と、制御部220と、入力部130と、出力部140と、を備え、第一の実施形態と比較して、記憶部210及び制御部220が異なっているため、以下これらの異なっている点に関連する事項について説明する。
記憶部210は、初期値記憶領域211と、定数ラウンド値記憶領域112と、鍵ラウンド値記憶領域113と、平文ラウンド値記憶領域114と、算出値記憶領域115と、ハッシュ値記憶領域116と、を備え、第一の実施形態と比較して、初期値記憶領域211に記憶されている情報が異なっているため、以下この異なっている点に関連する事項について説明する。
初期値記憶領域211には、ハッシュ値を生成する際の初期値を特定する情報が格納される。
本実施形態においては、ハッシュ値を生成する際の初期値として、定数ラウンド値の初期値と、算出値の初期値と、が記憶される。
ここで、定数ラウンド値の初期値は、例えば、c(−1)=0xffffffffffffffffといった定数が記憶される。
また、算出値の初期値は、H−1=(H−1.0,H−1.1,・・・,H−1.7)であり、H−1.0=0x00000000、H−1.1=0x00000000、H−1.2=0x00000000、H−1.3=0x00000000、H−1.4=0x00000000、H−1.5=0x00000000、H−1.6=0x00000000、H−1.7=0x00000000、といった定数が記憶される。
なお、定数ラウンド値及び算出値の初期値に使用される定数はこれらに限定されるわけではなく、例えば、疑似乱数生成器等で生成された乱数を使用することも可能である。
制御部220は、全体制御部221と、メッセージブロック化部222と、ラウンド定数生成部223と、第一ラウンド鍵生成部224と、第二ラウンド鍵生成部225と、撹拌部226と、を備える。
全体制御部221は、ハッシュ値生成装置200における処理の全体を制御する。
特に、本実施形態においては、ハッシュ値を算出するメッセージをブロック化したメッセージブロックを管理する処理や、ラウンド定数生成部223、第一ラウンド鍵生成部224、第二ラウンド鍵生成部225及び撹拌部226でのラウンドを管理する処理を行う。
また、全体制御部221は、全てのラウンドを経て撹拌部226において算出された平文ラウンド値と、当該ラウンドでの処理の対象となったメッセージブロックと、の排他的論理和を算出することで、算出値を算出する。
さらに、全体制御部221は、全てのメッセージブロック及び全てのラウンドを経て撹拌部226において算出された平文ラウンド値と、最後のメッセージブロックと、の排他的論理和を算出することで、ハッシュ値を算出する。
メッセージブロック化部222は、ハッシュ値を算出する対象となるメッセージを予め定められたビット長のブロックに分割し、パディングを行う。
ここで、本実施形態では、ハッシュ値を算出する対象となるメッセージを256ビット毎のブロックに分割するようにしているが、このような態様に限定されるわけではない。
また、例えば、本実施形態におけるパディングは、以下のようにして行う。
まず、メッセージブロック化部222は、ハッシュ値を算出する対象となるメッセージのビット数が、256ビットで割り切れる場合には、当該メッセージを256ビット毎に分割することで各々のメッセージブロックを生成するとともに、メッセージブロックを追加して最後のメッセージブロックとする。
そして、メッセージブロック化部222は、この最後のメッセージブロックにおいて、先頭ビットに「1」、先頭ビットの次のビットから数えて191ビットまでに「0」、最後の64ビットにメッセージのビット長、を特定する情報を格納する。
次に、メッセージブロック化部222は、ハッシュ値を算出する対象となるメッセージのビット数が、256ビットで割り切れない場合には、当該メッセージを256ビット毎に分割することで各々のメッセージブロックを生成するとともに、分割した最後尾のメッセージブロックには最後のビットまで「0」を特定する情報を格納することで、256ビットにし、さらに、メッセージブロックを追加して最後のメッセージブロックとする。
そして、メッセージブロック化部122は、この最後のメッセージブロックにおいて、先頭ビットから数えて192ビットまでに「0」、最後の64ビットにメッセージのビット長、を特定する情報を格納する。
なお、本実施形態においては、ハッシュ値を算出するメッセージをMとし、パディングにより、256ビットで割り切れるようなビット長にされたメッセージをM’とし、メッセージブロックの数をk+1(kは1以上の整数)とし、各々のメッセージブロックをM’i(iは、0≦i≦kなる整数)とする。
ラウンド定数生成部223は、各ラウンドにおける定数ラウンド値及びラウンド定数を算出する。
本実施形態においても、ラウンド定数生成部223は、最初のラウンドの場合には、初期値記憶領域211に記憶されている定数ラウンド値の初期値から、または、最初のラウンドではない場合には、定数ラウンド値記憶領域212に記憶されている前ラウンドにおける定数ラウンド値から、線形変換関数fcを用いて、各ラウンドにおける定数ラウンド値を算出する。
例えば、図2に示すように、ラウンド定数生成部223は、前ラウンド(r−1)の定数ラウンド値c(r−1)(r=0のときは、定数ラウンド値の初期値)を関数fLに入力して算出された値の上位ビット(本実施形態では、上位32ビット)と下位ビット(本実施形態では、下位32ビット)を入れ替えることにより、今ラウンド(r)の定数ラウンド値c(r)を算出する。
即ち、上述の(1)式及び(2)式に示されるようにして、前ラウンドの定数ラウンド値c(r−1)(r=0のときは、定数ラウンド値の初期値)から今ラウンドの定数ラウンド値c(r)を算出する。
また、関数fLは、線形フィードバックシフトレジスタ(LFSR)を用いる。
一般に、LFSRは多項式で決定されるが、ここではLFSRを決定する多項式g(x)を、下記の(18)式のように定義する。
但し、g(x)は有限体GF(2)において定義される多項式である。
なお、関数fLの擬似コードは、下記の(19)のように示される。
ここで、「<<X」は、Xビットの左シフトを示し、「>>Y」は、Yビットの右シフトを示し、「^」は、排他的論理和を示し、「&」は、論理積を示し、「|」は、論理和を示す。また、hは、定数ラウンド値c(r−1)における上位ビット(上位32ビット)、lは、定数ラウンド値c(r−1)における下位ビット(下位32ビット)である。
そして、ラウンド定数生成部223は、算出したラウンド(r)での定数ラウンド値c(r)の下位32ビットを、第rラウンドにおけるラウンド定数C(r)として、第一ラウンド鍵生成部224又は第二ラウンド鍵生成部225に出力する。
以下に、R=96の場合におけるC(r)の一例を掲げる。
C(0)=0x3b29b693、C(1)=0x90a58f8a、C(2)=0x472ae357、C(3)=0x42963e28、C(4)=0xd87dc430、C(5)=0x650288d7、C(6)=0x0ead60b6、C(7)=0xfb50532a、C(8)=0x9139bbc3、C(9)=0x299705c5、C(10)=0xef6ad616、C(11)=0xa65c1715、C(12)=0x797d1135、C(13)=0x32fc654e、C(14)=0x21220db8、C(15)=0x607dac22、C(16)=0x848836e0、C(17)=0x4520f9e5、C(18)=0xb9ace29a、C(19)=0xd055aef9、C(20)=0x4d3fb373、C(21)=0x8580f288、C(22)=0x5ba4bdbb、C(23)=0xbd8ff33a、C(24)=0xaa44bf81、C(25)=0x5db3f5f3、C(26)=0xa912fe04、C(27)=0xb2199ea1、C(28)=0x0fc7c10b、C(29)=0xc8667a84、C(30)=0x3f1f042d、C(31)=0xe54fa37c、C(32)=0x57f029af、C(33)=0x51e8c49c、C(34)=0x309ad6ca、C(35)=0x28f96206、C(36)=0x69e76232、C(37)=0xa3e58818、C(38)=0x634bc1a5、C(39)=0x241a197a、C(40)=0x49f94ff8、C(41)=0x3be45cf2、C(42)=0xe333768c、C(43)=0x441d4ad3、C(44)=0x481b935c、C(45)=0x7f2f5b3a、C(46)=0x4f343d06、C(47)=0x93e71c9e、C(48)=0x538a846f、C(49)=0xe4104b62、C(50)=0x8afc58d1、C(51)=0xff1b5dff、C(52)=0x807d5a5f、C(53)=0x38bb3e91、C(54)=0xaa795066、C(55)=0xe2ecfa45、C(56)=0xa9e54199、C(57)=0x4f65a079、C(58)=0x0c193f7e、C(59)=0xf940c888、C(60)=0x9be8c4e3、C(61)=0x21d56b4d、C(62)=0xc42f2a96、C(63)=0x8755ad35、C(64)=0xd46ae335、C(65)=0xb6da8dcf、C(66)=0x957dc5b9、C(67)=0x70e60e27、C(68)=0x55f716e4、C(69)=0x074e71f0、C(70)=0x38862be6、C(71)=0xb6b5feda、C(72)=0xe218af99、C(73)=0xdad7fb69、C(74)=0x4cb4f709、C(75)=0x04059dd2、C(76)=0x5d89ac52、C(77)=0xbb9a4e52、C(78)=0xb2f0f825、C(79)=0x45e50053、C(80)=0xcbc3e094、C(81)=0xd3424821、C(82)=0x4055f227、C(83)=0x225350f2、C(84)=0x6e0db8ea、C(85)=0x22c17ad2、C(86)=0x7ce0aac4、C(87)=0x2089d252、C(88)=0x3754e27c、C(89)=0x29ab7052、C(90)=0xdd5389f0、C(91)=0xa6adc149、C(92)=0xb1986ead、C(93)=0x313b3c3f、C(94)=0xc661bab4、C(95)=0xc4ecf0fd。
第一ラウンド鍵生成部224は、各ラウンドにおける鍵ラウンド値及びラウンド鍵を算出する処理を行う。
例えば、第一ラウンド鍵生成部224による鍵ラウンド値の算出は、上述の図3に示す第一鍵ラウンド値変換関数fKを用いて行われる。
図3に示すように、第一鍵ラウンド値変換関数fKは、第r−1ラウンドの鍵ラウンド値k(r−1)(但し、r=0の場合は、算出値記憶領域115に記憶されている算出値、または、初期値記憶領域211に記憶されている算出値の初期値)を8分割(本実施形態においては、各々32ビット)した分割データであるk0 (r−1)、k1 (r−1)、k2 (r−1)、k3 (r−1)、k4 (r−1)、k5 (r−1)、k6 (r−1)、k7 (r−1)を、それぞれ、k0 (r)、k1 (r)、k2 (r)、k3 (r)、k4 (r)、k5 (r)、k6 (r)、k7 (r)に変換し、変換したこれらの値を連結することで、第rラウンドの鍵ラウンド値k(r)を生成する関数である。
なお、第一鍵ラウンド値変換関数fKを用いた処理に関しては、ビット数が異なるだけで、第一の実施形態と同様であるため、詳細な説明は省略する。
次に、第一ラウンド鍵生成部224で使用するF関数である関数FKについて説明する。
本実施形態における関数FKも、上述の(5)式に示すように、非線形変換γKと、線形変換λkと、の合成変換を行う関数であり、線形変換λkは、バイト置換πKと、行列変換θKと、からなる。
ここで、関数FKへの入力をX、関数FKからの出力をYとして説明する。
本実施形態においては、X及びYは、64ビットのデータである。
まず、非線形変換γKでは、値Xを8ビット毎のサブデータ(s0,s1,・・・,s7)に分割して、分割した各々のサブデータを、下記の(20)式に示すように、置換テーブルSboxを用いて非線形変換を行う。ここで、変換後のサブデータをs’0,s’1,・・・,s’7とする。
なお、置換テーブルSboxは、例えば、上記の(7)で示される。
次に、行列変換θKでは、上記の非線形変換γKでの変換後のサブデータ(s’0,s’1,・・・,s’7)を4行2列の行列にして、下記の(21)式に示すように、変換行列Aとの有限体GF(28)上での乗算を行うことで、変換を行う。ここで、変換後のサブデータをs”0,s”1,・・・,s”7とする。
ここで、変換行列Aは、ある列を入力列とし、当該入力列に対して変換行列Aによる変換を行った後の値の列を出力列とした場合に、入力列及び出力列に含まれる項の内、値が「0」ではない項が、5個以上になるような変換であれば、どのような変換行列を用いてもよい。
次に、バイト置換πKでは、下記の(22)式に示すように、行列変換θKで変換されたサブデータ(s”0,s”1,・・・,s”7)のうちの半分のデータの入れ替えを行う。なお、変換後のサブデータをy0,y1,・・・,y7とする。
そして、以上のようにして算出されたサブデータ(y0,y1,・・・,y7)を(23)式のように連結することで、関数FKの出力Yとする。
以上の関数FKでは、後述する関数FRと比較して、一つの入力に対して一回の処理で出力を行うため、計算量が少なくてすみ、軽実装が可能となる。
図11に戻り、第二ラウンド鍵生成部225は、各ラウンドにおける鍵ラウンド値及びラウンド鍵を算出する処理を行う。
例えば、第二ラウンド鍵生成部225による鍵ラウンド値の算出は、図4に示すような第二鍵ラウンド値変換関数f’Kを用いて行われる。
図4に示すように、第二鍵ラウンド値変換関数f’Kは、第r−1ラウンドの鍵ラウンド値k(r−1)(但し、r=0の場合は、算出値記憶領域115に記憶されている算出値、または、初期値記憶領域111に記憶されている算出値の初期値)を8分割(本実施形態では、各々32ビット)した分割データであるk0 (r−1)、k1 (r−1)、k2 (r−1)、k3 (r−1)、k4 (r−1)、k5 (r−1)、k6 (r−1)、k7 (r−1)を、それぞれ、k0 (r)、k1 (r)、k2 (r)、k3 (r)、k4 (r)、k5 (r)、k6 (r)、k7 (r)に変換し、変換したこれらの値を連結することで、第rラウンドの鍵ラウンド値k(r)を生成する関数である。
なお、第二鍵ラウンド値変換関数f’Kを用いた処理に関しては、ビット数が異なるだけで、第一の実施形態と同様であるため、詳細な説明は省略する。
次に、第二ラウンド鍵生成部225で使用するF関数である関数FRについて説明する。
関数FRは、上述の(13)式に示すように、非線形変換γRと、バイト置換πRと、行列変換θRと、の合成変換を4回(4段分)行う関数である。
ここで、関数FRへの入力をX、関数FRからの出力をYとして説明する。
本実施形態においては、X及びYは、64ビットのデータである。
まず、非線形変換γRでは、値Xを8ビット毎のサブデータ(s0,s1,・・・,s7)に分割して、分割した各々のサブデータを、下記の(24)式に示すように、置換テーブルS−boxを用いて非線形変換を行う。ここで、変換後のサブデータをs’0,s’1,・・・,s’15とする。
なお、置換テーブルS−boxは、例えば、上記の(7)で示されるものを使用すればよい。
次に、バイト置換πRでは、下記の(25)式に示すように、非線形変換γRで変換されたサブデータ(s’0,s’1,・・・,s’7)を2行4列の行列として、各々の列に含まれる各々の行のデータが各々異なる列に配置されるように、データの入れ替えを行う。なお、(25)式は一例であって、各々の列に含まれる各々の行のデータが各々異なる列に配置されるものであれば、他の入れ替え方式を採用することも可能である。
また、変換後のサブデータをs”0,s”1,・・・,s”7とする。
次に、行列変換θRでは、下記の(26)式に示すように、上記のバイト置換πRでの変換後のサブデータ(s”0,s”1,・・・,s”7)を要素とする2行4列の行列と、変換行列Bと、の有限体GF(28)上での乗算を行うことで、変換を行う。ここで、変換後のサブデータをy0,y1,・・・,y7とする。
ここで、変換行列Bは、ある列を入力列とし、当該入力列に対して変換行列Bによる変換を行った後の値の列を出力列とした場合に、入力列及び出力列に含まれる項の内、値が「0」ではない項が、3個以上になるような変換であれば、どのような変換行列を用いてもよい。
そして、このようにして算出されたサブデータ(y0,y1,・・・,y7)を、(27)式に示すように、サブデータ(s0,s1,・・・,s7)として、非線形変換γR、バイト置換πR及び行列変換θRによる変換を3回(合計4回)行うことで、算出されるサブデータ(y0,y1,・・・,y7)を(27)式のように連結することで、関数FRの出力Yとする。
以上の関数FRでは、前述の関数FKと比較して、一つの入力に対して4回の処理で出力を行うため、安全性を高めることができる。なお、この4回の回数に関しては、適宜変更可能である。
図11に戻り、撹拌部226は、各ラウンドにおける平文ラウンド値を算出する処理を行う。
例えば、撹拌部226による平文ラウンド値の算出は、図5に示すような平文ラウンド値変換関数fRを用いて行われる。
図5に示すように、平文ラウンド値変換関数fRは、第r−1ラウンドの平文ラウンド値x(r−1)(但し、r=0の場合は、メッセージブロック化部222でブロック化されたメッセージブロックM’i)を8分割(本実施形態では、各々32ビット)した分割データであるx0 (r−1)、x1 (r−1)、x2 (r−1)、x3 (r−1)、x4 (r−1)、x5 (r−1)、x6 (r−1)、x7 (r−1)を、それぞれ、x0 (r)、x1 (r)、x2 (r)、x3 (r)、x4 (r)、x5 (r)、x6 (r)、x7 (r)に変換し、変換したこれらの値を連結することで、第rラウンドの平文ラウンド値x(r)を生成する関数である。
なお、平文ラウンド値変換関数fRを用いた処理に関しては、ビット数が異なるだけで、第一の実施形態と同様であるため、詳細な説明は省略する。
また、撹拌部226で使用するF関数である関数FRについては、上述の第二ラウンド鍵生成部225で使用するF関数である関数FRと同様であるため、説明を省略する。
本実施形態におけるハッシュ値の算出処理についても、図7と同様に行うことが可能である。
まず、ハッシュ値生成装置200では、入力部130を介して、ハッシュ値を生成するメッセージMの入力を受け付け、ハッシュ値生成装置200の全体制御部221が、メッセージブロック化部222にメッセージMを入力する。
そして、メッセージブロック化部222では、メッセージMをパディングして、256ビット毎のメッセージブロック(M’0,・・・,M’k;kは1以上の整数)に分割する。
次に、全体制御部221は、初期値記憶領域211に記憶されている算出値の初期値H−1と、メッセージブロック化部222でブロック化されたメッセージブロックMi’のうち、最初のメッセージブロックM’0と、を第一ブロック暗号fEに入力することで、平文ラウンド値h0を算出する。
ここで、第一ブロック暗号fEを用いた処理は、ラウンド定数生成部223、第一ラウンド鍵生成部224及び撹拌部226で行われる。
そして、全体制御部221は、算出した平文ラウンド値h0と、メッセージブロックM’0と、の排他的論理和を算出することで、算出値を求め、求めた算出値と、次のメッセージブロックM’1と、をブロック暗号fEに入力することで、平文ラウンド値h1を算出する。なお、算出された算出値については、算出値記憶領域115に記憶される。
このような処理を、最後のメッセージブロックM’kの直前のメッセージブロックM’k−1まで繰り返すことで、平文ラウンド値hk−1を算出する。
そして、全体制御部221は、平文ラウンド値hk−1と、メッセージブロックM’k−1と、の排他的論理和で算出される算出値と、最後のメッセージブロックM’kと、を第二ブロック暗号f’Eに入力することにより、平文ラウンド値hkを算出する。
ここで、第二ブロック暗号f’Eを用いた処理は、ラウンド定数生成部223、第二ラウンド鍵生成部225及び撹拌部226で行われる。
そして、全体制御部221は、平文ラウンド値hkと、最後のメッセージブロックM’kと、の排他的論理和でハッシュ値Hkを算出する。
このようなハッシュ値Hkは、ハッシュ値記憶領域216に記憶される。
ここで、第一ブロック暗号fEでの処理及び第二ブロック暗号f’Eでの処理については、ビット数は異なるが、図8及び図9での処理と同様であるため、説明を省略する。
以上のように、本実施形態によれば、256ビットのハッシュ値を算出することができる。
ここで、差分攻撃線形攻撃に対する耐性の指標として、最小のアクティブS−box数を用いた下記の(28)式が用いられる。
この点、AES(Advanced Encryption Standard)型のF関数においては、2段分のアクティブS−box数をBとすると、4段分のアクティブS−box数は、B2となる。このように、S−boxを4段重ねることで安全性を高めるこのような手法をWTS(Wide Trail Strategy)という。
これに対して、例えば、図5に示されているようなFeistel構造では、F関数の出力をX6 (r−1)、X7 (r−1)に加算する処理があるため、単にF関数の段数を増やすWTSを採用することができない。
この点、本発明では、平文ラウンド値変換関数fRで使用するF関数である関数FRにおいて、第二非線形変換γRと、バイト置換πRと、行列変換θRと、の合成変換を4回(4段)行うことで安全性を確保している。
例えば、本発明の第一の実施形態における512ビットのハッシュ値を生成するハッシュ値生成装置100では、2段分の最低アクティブS−box数「B=5」であるため、F関数一つ当たりの最低アクティブS−box数「B2=25」となる。
そして、12段でアクティブなF関数は、最低5つであるため、アクティブS−box数の最小値は、「5×25=125」となる。
従って、最大の差分伝搬の確率は、「125×6(=750)>512」となるため、(28)式を満たし、差分攻撃に対して耐性を有することがわかる。
また、本発明の第二の実施形態における256ビットのハッシュ値を生成するハッシュ値生成装置200では、2段分の最低アクティブS−box数「B=3」であるため、F関数一つ当たりの最低アクティブS−box数「B2=9」となる。
そして、12段でアクティブなF関数は、最低5つであるため、アクティブS−box数の最小値は、「5×9=45」となる。
従って、最大の差分伝搬の確率は、「45×6(=270)>256」となるため、(28)式を満たし、差分攻撃に対して耐性を有することがわかる。
なお、WTSについては、下記の文献2に詳細に記載されている。
文献2:J.Daemen and V. Rijmen, Springer, 2002, February, “The Design of Rijndael”, pp. 123-147
また、以上に記載した第一の実施形態及び第二の実施形態では、それぞれ、512ビット、256ビットのハッシュ値を算出するようにしているが、このような態様に限定されるわけではなく、ビット長を適宜変化させることで、224ビット、384ビット等の他のビット長のハッシュ値を算出することも可能である。
さらに、以上に記載した実施形態においては、ハッシュ値生成装置100、200を図6に示すようなコンピュータ900で実現可能としたが、このような態様に限定されず、例えば、CPUと、発揮性又は不発揮性メモリと、を備える携帯電話端末、非接触型ICカード、商品タグ等の実装規模の小さなデバイスにおいても実現可能である。
また、上述したハッシュ値生成装置100、200は、コンピュータがプログラムを実行することにより実現されるものでなくてもよい。例えば、ASIC(Application Specific Integrated Circuit)やFPGA(Field Programmable Gate Array)等の集積ロジックICによりハード的に実行されるものであってもよいし、あるいは、DSP(Digital Signal Processor)等の計算機によりソフトウェア的に実行されるものであってもよい。
以上に記載した実施形態においては、図5に示すような平文ラウンド値変換関数fRを使用しているが、このような態様に限定されず、関数FRをF関数として使用するものであれば、どのようなものであってもよい。例えば、図12(平文ラウンド値変換関数fR変形例を示す概略図)に示すような平文ラウンド値変換関数fRを使用することも可能である。
図12に示す平文ラウンド値変換関数fRでは、ラウンド鍵K(r)及び第r−1ラウンドの平文ラウンド値(r=0の場合は、メッセージブロックM’i)の内のx4 (r−1)の排他的論理和である値pHと、第r−1ラウンドの平文ラウンド値(r=0の場合は、メッセージブロックM’i)の内のx5 (r−1)の値pLと、を連結した値pをF関数である関数FRに入力した出力値の内の上位ビット(ここでは、上位64ビット)の値qH(qH=FR(x4 (r−1) XOR K(r),x5 (r−1))H)と、下位ビット(ここでは、下位64ビット)の値qL(qL=FR(x4 (r−1) XOR K(r),x5 (r−1))L)と、を算出する。
そして、値pH及び値qHの排他的論理和と、第r−1ラウンドの平文ラウンド値(r=0の場合は、メッセージブロックM’i)の内のx6 (r−1)と、の排他的論理和を算出し、算出した値を第rラウンドの平文ラウンド鍵のx0 (r)とする。
また、値pL及び値qLの排他的論理和と、第r−1ラウンドの平文ラウンド値(r=0の場合は、メッセージブロックM’i)の内のx7 (r−1)と、の排他的論理和を算出し、算出した値を第rラウンドの平文ラウンド値のx1 (r)とする。
図12に示すような平文ラウンド値変換関数fRを用いることで、F関数への入力を出力にフィードフォワードすることで、F関数部分の置換性をくずすことができる。
さらに、図5に示すような平文ラウンド値変換関数fRの替わりに、例えば、図13(平文ラウンド値変換関数fR変形例を示す概略図)に示すような平文ラウンド値変換関数fRを使用することも可能である。
図13に示す平文ラウンド値変換関数fRでは、ラウンド鍵K0 (r)及び第r−1ラウンドの平文ラウンド値(r=0の場合は、メッセージブロックM’i)の内のx4 (r−1)の排他的論理和である値pHと、ラウンド鍵K1 (r)及び第r−1ラウンドの平文ラウンド値(r=0の場合は、メッセージブロックM’i)の内のx5 (r−1)の排他的論理和である値pLと、を連結した値pをF関数である関数FRに入力した出力値の内の上位ビット(ここでは、上位64ビット)の値qH(qH=FR(x4 (r−1) XOR K0 (r),x5 (r−1) XOR K1 (r))H)と、下位ビット(ここでは、下位64ビット)の値qL(qL=FR(x4 (r−1) XOR K(r),x5 (r−1) XOR K1 (r))L)と、を算出する。
ここで、ラウンド鍵K0 (r)は、第rラウンドの鍵ラウンド値の内のk2 (r)を用い、ラウンド鍵K1 (r)は、第rラウンドの鍵ラウンド値の内のk3 (r)を用いる。
図13に示すような平文ラウンド値変換関数fRを用いることで、ラウンド鍵を2倍以上の大きさにすることが可能である。