(57)【特許請求の範囲】
【請求項１】
ブロック暗号により暗号化を行う暗号化部を有し、電子機器に組み込み可能な情報処理装置であって、
少なくとも所定の認証パラメータと前記暗号化部により平文情報を暗号化した第１の暗号化情報とを含む認証対象メッセージを、１２８ビット毎に１以上のブロックに分割する分割手段と、
前記分割手段により分割された１以上のブロックを、所定のアルゴリズムからなるＧＨＡＳＨ関数により前記ブロック毎に順次演算するハッシュ演算手段と、
前記ハッシュ演算手段による演算結果を前記暗号化部により暗号化した第２の暗号化情報を生成し、該第２の暗号化情報から前記第１の暗号化情報の完全性の検証及び前記第１の暗号化情報の復号を行う主体の認証を行うための認証タグを生成する認証タグ生成手段と、を有し、
前記ＧＨＡＳＨ関数は、１２８ビットの所定の配列を用いて、該所定の配列に格納されている情報を１ビット右へシフトさせるためのシフト演算が必要な回数を演算し、該必要な回数分まとめてシフト演算を実行する情報処理装置。
【請求項２】
ＧＦ（２１２８）で表されるガロア体上の既約多項式に対応するビット列について、前記所定の配列に格納されている情報を１ビット右へシフトさせるためのシフト演算が必要な回数に応じて前記ビット列を変換させた変換テーブルを記憶する記憶手段を有し、
前記ＧＨＡＳＨ関数は、前記所定のアルゴリズムにおける前記所定の配列に格納されている情報と前記ビット列との排他的論理和演算について、前記シフト演算が必要な回数の演算結果に応じて、前記変換テーブルの変換後のビット列を用いて、前記所定の配列に格納されている情報と前記変換後のビット列との排他的論理和演算を実行する、請求項１記載の情報処理装置。
【請求項３】
前記ＧＨＡＳＨ関数は、前記所定のアルゴリズムにおける前記所定の配列に格納されている情報とＧＦ（２１２８）で表されるガロア体上の既約多項式に対応するビット列との排他的論理和演算について、前記所定の配列に格納されている情報を１ビット右へシフトさせるためのシフト演算が必要な回数が１回又は２回のいずれかに応じて、前記所定の配列に格納されている情報と前記回数に応じたビット列との排他的論理和演算を実行する、請求項２記載の情報処理装置。
【請求項４】
前記所定の配列は、８ビットの要素が１６個含まれる配列である、請求項１乃至３
の何れか一項に記載の情報処理装置。
【請求項５】
前記所定の配列は、１６ビットの要素が８個含まれる配列である、請求項１乃至３
の何れか一項に記載の情報処理装置。
【請求項６】
前記所定の配列は、３２ビットの要素が４個含まれる配列である、請求項１乃至３
の何れか一項に記載の情報処理装置。
【請求項７】
ブロック暗号により暗号化を行う暗号化部を有し、電子機器に組み込み可能な情報処理装置を、
少なくとも所定の認証パラメータと前記暗号化部により平文情報を暗号化した第１の暗号化情報とを含む認証対象メッセージを、１２８ビット毎に１以上のブロックに分割する分割手段、
前記分割手段により分割された１以上のブロックを、所定のアルゴリズムからなるＧＨＡＳＨ関数により前記ブロック毎に順次演算するハッシュ演算手段、
前記ハッシュ演算手段による演算結果を前記暗号化部により暗号化した第２の暗号化情報を生成し、該第２の暗号化情報から前記第１の暗号化情報の完全性の検証及び前記第１の暗号化情報の復号を行う主体の認証を行うための認証タグを生成する認証タグ生成手段、
として機能させ、
前記ＧＨＡＳＨ関数は、１２８ビットの所定の配列を用いて、該配列に格納されている情報を１ビット右へシフトさせるためのシフト演算が必要な回数を演算し、該必要な回数分まとめてシフト演算を実行するプログラム。
【請求項８】
ブロック暗号により暗号化を行う暗号化部を有し、電子機器に組み込み可能な情報処理装置を、
少なくとも所定の認証パラメータと前記暗号化部により平文情報を暗号化した第１の暗号化情報とを含む認証対象メッセージを、１２８ビット毎に１以上のブロックに分割する分割手段、
前記分割手段により分割された１以上のブロックを、所定のアルゴリズムからなるＧＨＡＳＨ関数により前記ブロック毎に順次演算するハッシュ演算手段、
前記ハッシュ演算手段による演算結果を前記暗号化部により暗号化した第２の暗号化情報を生成し、該第２の暗号化情報から前記第１の暗号化情報の完全性の検証及び前記第１の暗号化情報の復号を行う主体の認証を行うための認証タグを生成する認証タグ生成手段、
として機能させ、
前記ＧＨＡＳＨ関数は、１２８ビットの所定の配列を用いて、該配列に格納されている情報を１ビット右へシフトさせるためのシフト演算が必要な回数を演算し、該必要な回数分まとめてシフト演算を実行するプログラムが格納された記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置、プログラム及び記憶媒体に関する。
【背景技術】
【０００２】
近年、組込機器においてもセキュリティ的な観点から暗号機能を搭載する必要が高まっている。このような暗号機能に用いられる暗号方式として、例えば、共通鍵暗号方式であるＡＥＳ（Advanced Encryption Standard）の利用モードとしてＧＣＭ（Galois/Counter Mode）を用いるＡＥＳ−ＧＣＭが挙げられる。【０００３】
ＡＥＳ−ＧＣＭに用いられる暗号化アルゴリズムεは、秘密鍵Ｋ、イニシャルベクタＩＶ、平文メッセージＰ、認証パラメータＡを入力として、暗号文Ｃ及び認証タグＴを出力する。これを数式で書けば以下のようになる。【０００４】
【数１】
0006044738.tif 000002
ここで、認証パラメータＡは、暗号化されずに、認証にのみ使用されるデータである。【０００５】
上記のようなＡＥＳ−ＧＣＭに用いられる暗号化アルゴリズムεは、ＡＥＳ暗号化関数、ＧＣＴＲ関数及びＧＨＡＳＨ関数で構成される（例えば、非特許文献１参照）。
【先行技術文献】
【非特許文献】
【０００６】
【非特許文献１】NIST: Recommendation for Block Cipher Modes of Operation: Galois/Counter Mode (GCM) and GMAC, NIST Special Publication 800-38D, November, 2007.
【発明の概要】
【発明が解決しようとする課題】
【０００７】
ここで、組込機器においては、汎用的なコンピュータシステムと比べて比較的安価なＣＰＵ（Central Processing Unit）やＭＰＵ（Micro Processing Unit）、ＲＯＭ（Read Only Memory）などが搭載される。したがって、組込機器においては、限られたハードウェア資源の中で演算時間の高速化を図るため、効率的なアルゴリズムで上記の暗号化アルゴリズムεを実装する必要がある。【０００８】
他方、上記の暗号化アルゴリズムεにおいては、認証タグＴの生成などに用いられるＧＨＡＳＨ関数の演算時間が暗号化アルゴリズムε全体の演算時間を大きく左右している。したがって、ＧＨＡＳＨ関数のアルゴリズムを効率化し、ＧＨＡＳＨ関数の演算時間を減少させることで、暗号化アルゴリズムε全体の演算時間を減少させることができる。【０００９】
本発明の一実施形態は、上記の点に鑑みてなされたもので、効率のよいＧＨＡＳＨ関数の演算を行うことを目的とする。
【課題を解決するための手段】
【００１０】
上記目的を達成するため、本発明の一実施形態は、ブロック暗号により暗号化を行う暗号化部を有し、電子機器に組み込み可能な情報処理装置であって、少なくとも所定の認証パラメータと、暗号化部により平文情報を暗号化した第１の暗号化情報とを含む認証対象メッセージを、１２８ビット毎に１以上のブロックに分割し、この分割された１以上のブロックを、１６個の要素からなる８ビットの配列を複数用いて、所定のアルゴリズムからなるＧＨＡＳＨ関数によりブロック毎に順次演算し、演算結果を暗号化部により暗号化した第２の暗号化情報を生成し、認証タグを生成する。
【発明の効果】
【００１１】
本発明の一実施形態によれば、効率のよいＧＨＡＳＨ関数の演算を行うことができる。
【図面の簡単な説明】
【００１２】
【図１】第１の実施形態に係る情報処理装置の一例のハードウェア構成図である。
【図２】第１の実施形態に係る情報処理装置の一例の機能構成図である。
【図３】認証対象メッセージの一例の構成図である。
【図４】第１の実施形態に係る認証タグ生成処理の一例のフローチャートである。
【図５】ＧＨＡＳＨ関数の演算処理の概略を説明するための一例の説明図である。
【図６】第１の実施形態に係るＧＨＡＳＨ関数の演算処理の一例のフローチャート（１／２）である。
【図７】第１の実施形態に係るＧＨＡＳＨ関数の演算処理の一例のフローチャート（２／２）である。
【図８】第２の実施形態に係る情報処理装置の一例の機能構成図である。
【図９】変換テーブルの一例の構成図である。
【図１０】第２の実施形態に係るＧＨＡＳＨ関数の演算処理の一例のフローチャート（１／２）である。
【図１１】第２の実施形態に係るＧＨＡＳＨ関数の演算処理の一例のフローチャート（２／２）である。
【図１２】第３の実施形態に係るＧＨＡＳＨ関数の演算処理の一例のフローチャート（１／２）である。
【図１３】第３の実施形態に係るＧＨＡＳＨ関数の演算処理の一例のフローチャート（２／２）である。
【図１４】第４の実施形態に係るＧＨＡＳＨ関数の演算処理の一例のフローチャート（１／２）である。
【図１５】第４の実施形態に係るＧＨＡＳＨ関数の演算処理の一例のフローチャート（２／２）である。
【図１６】第５の実施形態に係るＧＨＡＳＨ関数の演算処理の一例のフローチャート（１／２）である。
【図１７】第５の実施形態に係るＧＨＡＳＨ関数の演算処理の一例のフローチャート（２／２）である。
【発明を実施するための形態】
【００１３】
以下、本発明の実施形態について添付の図面を参照しながら説明する。なお、本明細書及び図面において、実質的に同一の機能構成を有する構成要素については、同一の符号を付することにより重複した説明を省く。
【００１４】
［第１の実施形態］
＜ハードウェア構成＞
本実施形態における各種処理を実行可能な情報処理装置の一構成例について説明する。図１は、第１の実施形態に係る情報処理装置の一例のハードウェア構成図である。
【００１５】
図１に示すように、情報処理装置１０は、ＭＰＵ１１、ＲＡＭ（Random Access Memory）１２、ＲＯＭ１３、外部Ｉ／Ｆ１４を備える。また、情報処理装置１０のこれら各部は、バスＢを介して相互に接続されている。
【００１６】
ＭＰＵ１１は、ＲＯＭ１３に格納されているプログラムやデータ（例えば、本実施形態を実現するプログラムやデータ）をＲＡＭ１２上に読み出し、処理を実行することで、情報処理装置１０全体の制御や機能を実現する演算装置である。
【００１７】
ＲＡＭ１２は、プログラムやデータを一時的に保持する揮発性の半導体メモリ（記憶装置）である。
【００１８】
ＲＯＭ１３は、電源を切ってもプログラムやデータを保持することができる不揮発性の半導体メモリ（記憶装置）である。
【００１９】
外部Ｉ／Ｆ１４は、外部機器と接続するためのインタフェースである。外部Ｉ／Ｆ１４には、例えばＬＡＮ（Local Area Network）コントローラなどの通信デバイスやＵＳＢ（Universal Serial Bus）メモリなどの補助記憶装置（記憶媒体）が接続される。このため、例えば、補助記憶装置に格納された本実施形態を実現するプログラムやデータが、外部Ｉ／Ｆ１４を介して、ＲＡＭ１２上に読み出されてもよい。
【００２０】
なお、図１に示される本実施形態に係る情報処理装置１０のハードウェア構成は一例であり、情報処理装置１０は、その他の任意のハードウェアを有する構成であってもよい。
【００２１】
ここで、以降では、本実施形態に係る情報処理装置１０は、産業用機器や家電製品などの他の電子機器に内蔵される、いわゆる組み込みシステムであるものとして説明する。したがって、本実施形態に係る情報処理装置１０が備えるＭＰＵ１１、ＲＡＭ１２、ＲＯＭ１３の性能及び容量は、ＰＣ（パーソナルコンピュータ）などの汎用的なコンピュータシステムと比べて、大幅に低性能及び低容量であるものとする。換言すれば、本実施形態に係る情報処理装置１０のハードウェア資源は、汎用的なコンピュータシステムと比べて、制限的であるものとする。
【００２２】
なお、本実施形態に係る情報処理装置１０は、組み込みシステムに限られず、ＰＣなどの汎用的なコンピュータシステムであってもよい。この場合、情報処理装置１０は、例えばＨＤＤ（Hard Disk Drive）などの補助記憶装置、キーボードやマウスなどの入力装置、ディスプレイなどの表示装置を備えていてもよい。
【００２３】
＜機能構成＞
次に、本実施形態に係る情報処理装置１０の機能構成について説明する。図２は、第１の実施形態に係る情報処理装置の一例の機能構成図である。
【００２４】
情報処理装置１０は、暗号化部１１０、分割部１２０、ハッシュ演算部１３０、認証タグ生成部１４０、認証対象メッセージ１０００を有している。
【００２５】
暗号化部１１０は、与えられた秘密鍵Ｋ及びイニシャルベクタＩＶに基づいてＧＣＴＲ関数により、入力された情報を暗号化する。なお、ＧＣＴＲ関数で用いる暗号化関数は、ブロック暗号に用いられる任意の暗号化関数（暗号化エンジン）を用いてよい。すなわち、暗号化関数として、ＡＥＳ−ＧＣＭで用いられるＡＥＳ暗号化関数の他に、例えば、ＤＥＳ（Data Encryption Standard）、トリプルＤＥＳ、Ｃａｍｅｌｌｉａなどで暗号化を行う暗号化関数を用いてもよい。なお、以降、本実施形態に係る情報処理装置１０の暗号化部１１０は、暗号化関数としてＡＥＳ暗号化関数を用いて、ＧＣＴＲ関数の演算を行うものとして説明する。換言すれば、本実施形態に係る情報処理装置１０は、ＡＥＳ−ＧＣＭにより暗号化を行うものとする。
【００２６】
分割部１２０は、認証対象メッセージ１０００を１２８ビット毎のブロックに分割する処理を行う。
【００２７】
ハッシュ演算部１３０は、分割部１２０により１２８ビット毎のブロックに分割された認証対象メッセージ１０００を入力としてＧＨＡＳＨ関数の演算を行う。
【００２８】
認証タグ生成部１４０は、ＧＨＡＳＨ関数の演算結果（ハッシュ値）を暗号化部１１０で暗号化した情報から認証タグＴを生成する。認証タグ生成部１４０は、例えば、暗号化したＧＨＡＳＨ関数のハッシュ値から所定数の上位ビットを抽出することで認証タグＴを生成する。
【００２９】
認証対象メッセージ１０００は、ＧＨＡＳＨ関数への入力データである。認証対象メッセージ１０００は、例えば図３に示されるような構成を有している。なお、認証対象メッセージ１０００は、例えばＲＯＭ１３などの記憶装置に記憶されている。
【００３０】
図３は、認証対象メッセージの一例の構成図である。図３に示される認証対象メッセージ１０００は、認証パラメータＡと、所定のｖビットからなる０と、暗号文Ｃと、所定のｕビットからなる０と、（ｌｅｎ（Ａ））６４で表されるビット列と、（ｌｅｎ（Ｃ））６４で表されるビット列とから構成される。
【００３１】
認証パラメータＡは、暗号化を行う側及び復号を行う側の間で予め定められた暗号化されていない所定の情報である。認証パラメータＡは、暗号化を行う側及び復号を行う側の間で任意に定めることができる情報である。
【００３２】
また、上記におけるｖ及びｕは、それぞれ、以下の式により定義される。
【００３３】
【数２】
0006044738.tif 000003
【００３４】
【数３】
0006044738.tif 000004
ここで、ｌｅｎ（Ａ）及びｌｅｎ（Ｃ）は、それぞれ認証パラメータＡ及び暗号文Ｃのビット列の長さである。また、［ｌｅｎ（Ａ）／１２８］及び［ｌｅｎ（Ｃ）／１２８］は、それぞれｌｅｎ（Ａ）／１２８以上の最小の整数及びｌｅｎ（Ｃ）／１２８以上の最小の整数である。
【００３５】
暗号文Ｃは、暗号化されていない平文情報Ｐを、暗号化部１１０により暗号化した暗号文である。また、（ｌｅｎ（Ａ））６４及び（ｌｅｎ（Ｃ））６４は、それぞれｌｅｎ（Ａ）を６４ビットで表したビット列及びｌｅｎ（Ｃ）を６４ビットで表したビット列である。
【００３６】
上記のような構成の認証対象メッセージ１０００に基づいて認証タグＴを生成することにより、暗号文Ｃを復号する側において、受け取った暗号文Ｃの完全性及び復号側の主体の認証を行うことができる。
【００３７】
＜処理の詳細＞
次に、本実施形態に係る情報処理装置１０の処理の詳細について、図面を参照しつつ説明する。
【００３８】
《認証タグ生成処理》
まず、認証タグ生成処理について説明する。図４は、第１の実施形態に係る認証タグ生成処理の一例のフローチャートである。
【００３９】
分割部１２０は、認証対象メッセージ１０００を１２８ビット毎のブロックに分割する（ステップＳ１０１）。ここで、認証対象メッセージ１０００は、ｍ個のブロックに分割されたものとし、この分割された各ブロックＸｉ（ｉ＝１，・・・，ｍ）と表す。
【００４０】
次に、ハッシュ演算部１３０は、分割部１２０により分割された認証対象メッセージ１０００を入力し、ＧＨＡＳＨ関数により演算を行う（ステップＳ１０２）。ここで、ハッシュ演算部１３０が行うＧＨＡＳＨ関数による演算処理の概略を図５を用いて説明する。図５は、ＧＨＡＳＨ関数の演算処理の概略を説明するための一例の説明図である。
【００４１】
図５において、Ｘ１，Ｘ２，・・・，Ｘｍは、分割部１２０により分割された認証対象メッセージ１０００の各ブロックである。また、Ｙ０は、各ビット成分が０の１２８ビットのビット列である。また、Ｈは、各ビット成分が０の１２８ビットのビット列を、ＡＥＳ暗号化関数により暗号化したビット列（なお、このビット列は１２８ビットである。）である。なお、このＨは、ＧＨＡＳＨ関数のサブキーである。このとき、ハッシュ演算部１３０は、Ｘ１，Ｘ２，・・・，Ｘｍを入力としてＧＨＡＳＨ関数により以下の演算処理を行う。
【００４２】
Ｓｔｅｐ１）ハッシュ演算部１３０は、Ｘ１とＹ０とのビット毎の排他的論理和（＋）を演算する。次に、ハッシュ演算部１３０は、Ｘ１（＋）Ｙ０の演算結果とＨとの乗算（×）を演算する。ここで、乗算演算子（×）は、ガロア体ＧＦ（２１２８）上の乗算演算子である。以上を換言すれば、ハッシュ演算部１３０はＳｔｅｐ１において、Ｙ１＝（Ｘ１（＋）Ｙ０）（×）Ｈを演算する。
【００４３】
なお、ガロア体ＧＦ（２１２８）の元Ｘ及びＹについて、ガロア体ＧＦ（２１２８）上の乗算演算子（×）による演算Ｘ（×）Ｙの演算結果Ｚ１２８は、ｉ＝０，・・・，１２７に対して、以下で定義される式を順次演算することにより得られる。なお、ｂｉは、Ｘの最上位ビットからｉ番目のビットを表す。すなわち、Ｘは、ビット列ｂ０ｂ１・・・ｂ１２７を用いてＸ＝ｂ０ｂ１・・・ｂ１２７と表されるものとする。
【００４４】
【数４】
0006044738.tif 000005
ここで、Ｚ０は各ビット成分が０の１２８ビットのビット列である。また、Ｖ０はＹであり、「＞＞」は、右にビット列をシフトするシフト演算子である。さらに、Ｒは、上位８ビットのビット成分が「１１１００００１」で表され、下位１２０ビットのビット成分がすべて０のビット列である。換言すれば、Ｒは、ガロア体ＧＦ（２１２８）の既約多項式ｘ１２７＋ｘ１２６＋ｘ１２５＋ｘ１２０に対応するビット列である。
【００４５】
Ｓｔｅｐ２）ハッシュ演算部１３０は、Ｘ２とＹ１とのビット毎の排他的論理和（＋）を演算する。次に、ハッシュ演算部１３０は、Ｘ２（＋）Ｙ１の演算結果とＨとの乗算（×）を演算する。以上を換言すれば、ハッシュ演算部１３０はＳｔｅｐ２において、Ｙ２＝（Ｘ２（＋）Ｙ１）（×）Ｈを演算する。
【００４６】
ハッシュ演算部１３０は、以上のような処理すべてのブロックＸ１，Ｘ２，・・・，Ｘｍに対して行う。換言すれば、ハッシュ演算部１３０は、ｉ＝１，・・・，ｍに対し、Ｙｉ＝（Ｙｉ−１（＋）Ｘｉ）（×）Ｈを演算する。そして、最終的に得られるビット列ＹｍがＧＨＡＳＨ関数のハッシュ値である。以上、概略を説明したＧＨＡＳＨ関数の演算処理についての詳細は後述する。
【００４７】
図４の説明に戻る。暗号化部１１０は、予め与えられた秘密鍵Ｋ及びイニシャルベクタＩＶに基づいてＧＣＴＲ関数によりハッシュ値Ｙｍを暗号化する（ステップＳ１０３）。なお、このとき暗号化部１１０が用いるＧＣＴＲ関数は、平文情報Ｐを暗号化して暗号文Ｃを生成した際に用いたＧＣＴＲ関数と同様の秘密鍵Ｋを用いる（ただし、イニシャルカウンタブロック（ＩＣＢ）は異なる）。
【００４８】
続いて、認証タグ生成部１４０は、上記のステップＳ１０３において暗号化した情報から所定の上位ｔビットを抽出することで認証タグＴを生成する（ステップＳ１０４）。ここで、ｔは予め定められた１以上１２８以下の数値である。
【００４９】
以上により、本実施形態に係る情報処理装置１０は、認証パラメータＡと暗号文Ｃを含む認証対象メッセージ１０００を入力としてＧＨＡＳＨ関数のハッシュ値を得る。そして、このハッシュ値を暗号化した後、この暗号化した情報について所定数の上位ビットを抽出することにより認証タグＴを得ることができる。なお、暗号文Ｃを復号する復号側においても同様の処理により認証タグＴを得ることにより、暗号文Ｃの完全性の検証及び復号側の主体の認証を行うことができる。
【００５０】
《ＧＨＡＳＨ関数の演算処理》
次に、図４のステップＳ１０２におけるＧＨＡＳＨ関数の演算処理について、図６及び図７を用いて詳細に説明する。
【００５１】
ステップＳ２０１において、ハッシュ演算部１３０は、ｍ個のブロックに分割された認証対象メッセージ１０００のｉ番目のブロックを表す変数としてｉを準備し、ｉを１に初期化する。また、ハッシュ演算部１３０は、１６個の要素からなる符号なし８ビットの配列Ｙ０［１６］を準備し、それぞれ０で初期化する。すなわち、Ｙ０［０］＝００００００００，・・・，Ｙ０［１５］＝００００００００とする。なお、この配列Ｙ０［１６］は、図５を用いて説明したＧＨＡＳＨ関数の演算処理の概略のＳｔｅｐ１において、最初のブロックＸ１との排他的論理和を演算する被演算子Ｙ０に相当する。
【００５２】
ステップＳ２０２において、ハッシュ演算部１３０は、ｍ個のブロックに分割された認証対象メッセージ１０００のｉ番目のブロックを格納するための１６個の要素からなる符号なし８ビットの配列Ｘｉ［１６］を準備し、この配列Ｘｉ［１６］にｉ番目のブロックを入力する。また、ハッシュ演算部１３０は、この配列Ｘｉ［１６］との排他的論理和を演算する被演算子を格納するための符号なし８ビットの配列Ｙｉ−１［１６］を入力する。ここで、ｉが１のとき、配列Ｙｉ−１［１６］は上記のステップＳ２０１で初期化した配列Ｙ０［１６］である。すなわち、例えば、図５を用いて説明したＳｔｅｐ１では、配列Ｘｉ［１６］には１２８ビットのブロックＸ１を格納して入力し、配列Ｙ０［１６］には１２８ビットのブロックＹ０を格納して入力する。このように、本実施形態に係る情報処理装置１０におけるＧＨＡＳＨ関数の演算処理では、１２８ビットのブロックを１６個の要素からなる８ビットの配列に格納する。これにより、ＧＨＡＳＨ関数の演算処理を配列の１要素毎に繰り返し行うことができる。
【００５３】
ステップＳ２０３において、ハッシュ演算部１３０は、各種ローカル変数や配列の初期化を行う。具体的には、ハッシュ演算部１３０は以下を行う。
・配列Ｘｉ［１６］及び配列Ｙｉ−１［１６］のｊ番目の要素を表す変数ｊを準備し、ｊを０に初期化する。
・ある特定のビットが１であるか否かを判定するために用いる変数ｋを準備し、ｋを２７に初期化する。
・配列Ｘｉ［１６］及び配列Ｙｉ−１［１６］のｊ番目の要素のビット毎の排他的論理和の演算結果を格納する符号なし８ビットの変数ｘを準備し、ｘに、Ｘｉ［０］とＹｉ−１［０］とのビット毎の排他的論理和の演算結果を代入する。すなわち、ｘ＝Ｘｉ［０］＾Ｙｉ−１［０］とする。なお、演算子「＾」は、ビット毎の排他的論理和を示す演算子（＋）である。このように、以降では、ビット毎の排他的論理和を示す演算子を「＾」で表す。
・ＧＨＡＳＨ関数の演算結果を格納するための１６個の要素からなる符号なし８ビットの配列Ｚ［１６］を準備し、それぞれ０で初期化する。すなわち、Ｚ［０］＝００００００００，・・・，Ｚ［１５］＝００００００００とする。このような初期化は、例えば、Ｃ言語におけるｍｅｍｓｅｔ関数を用いてｍｅｍｓｅｔ（Ｚ，０，１６）として行うことができる。
・ガロア体上の乗算演算（×）を行うための符号なし８ビットの配列Ｖ［１６］を準備し、ＧＨＡＳＨ関数のサブキーＨを格納する。これは、例えば、サブキーＨが１６個の要素からなる符号なし８ビットの配列Ｈ［１６］に格納されている場合、Ｃ言語におけるｍｅｍｃｐｙ関数を用いてｍｅｍｃｐｙ（Ｖ，Ｈ，１６）として行うことができる。
【００５４】
ステップＳ２０４において、ハッシュ演算部１３０は、ｘとｋのビット毎の論理積の演算結果が０であるか否かを判定する。ここで、演算子「＆」は、ビット毎の論理積を示す演算子である。ここで、例えばｋが１２８（２７）である場合、ｘ＆ｋが０であるか否かを判定することは、ｘの最上位ビットが０であるか否かを判定することに等しい。同様に、後述する処理においてｋが１ビット右にシフトされた結果、ｋの値が６４（２６）になった場合、ｘ＆ｋが０であるか否かを判定することは、ｘの最上位ビットから１ビット下位のビット（左から２番目のビット）が０であるか否かを判定することに等しい。換言すれば、ｂ０ｂ１・・・ｂ７を８ビットのビット列としてｘ＝ｂ０ｂ１・・・ｂ７と表されるとすれば、ハッシュ演算部１３０は、ｘのビット列を最上位ビットｂ０から順に最下位ｂ７まで、該当のビットが０であるか否かを繰り返し判定する。ハッシュ演算部１３０は、ｘ＆ｋの演算結果が０でない場合、ステップＳ２０５に進み、他方、ｘ＆ｋの演算結果が０である場合、ステップＳ２０６に進む。
【００５５】
ステップＳ２０５において、ハッシュ演算部１３０は、配列Ｚ［１６］と配列Ｖ［１６］の各要素についてそれぞれビット毎の排他的論理和を演算し、演算結果をそれぞれ配列Ｚ［１６］に代入する。具体的には、ハッシュ演算部１３０は、以下の処理を行う。
・Ｚ［０］とＶ［０］とのビット毎の排他的論理和を演算し、演算結果をＺ［０］に代入する。すなわち、Ｚ［０］＝Ｚ［０］＾Ｖ［０］とする。
・Ｚ［１］とＶ［１］とのビット毎の排他的論理和を演算し、演算結果をＺ［１］に代入する。すなわち、Ｚ［１］＝Ｚ［１］＾Ｖ［１］とする。
・・・
・Ｚ［１５］とＶ［１５］とのビット毎の排他的論理和を演算し、演算結果をＺ［１５］に代入する。すなわち、Ｚ［１５］＝Ｚ［１５］＾Ｖ［１５］とする。
以上のように、ハッシュ演算部１３０は、例えば、Ｃ言語におけるｆｏｒ文などの繰り返し処理を用いずに、配列への代入処理に行う。これにより、ｆｏｒ文などの繰り返し処理を行う場合と比較してＧＨＡＳＨ関数の演算速度の高速化を図ることができる。
【００５６】
一般に、ｆｏｒ文などの繰り返し処理を用いる場合、ｆｏｒ文中に記述された処理を行った後、カウンタをインクリメントし、ｆｏｒ文の先頭に戻り、繰り返しを行うか否かの判定を行う。したがって、本実施形態に係る情報処理装置１０のように、汎用的なコンピュータシステムと比較して演算速度が遅い組み込みシステムにおいては、繰り返し処理を用いずに処理を記述した方が演算時間削減の効果が顕著に現れる。
【００５７】
ステップＳ２０６において、ハッシュ演算部１３０は、ｋが１より大きいか否かを判定する。ハッシュ演算部１３０は、ｋが１より大きい場合、ステップＳ２０７に進む。他方、ハッシュ演算部１３０は、ｋが１以下の場合（すなわち、ｋが１である場合）、ステップＳ２０８に進む。
【００５８】
ステップＳ２０７において、ハッシュ演算部１３０は、ｋを１ビット右にシフトするシフト演算を行い、この演算結果をｋに代入する。すなわち、ｋ＞＞＝１とする。これにより、ハッシュ演算部１３０は、上述したステップＳ２０４の処理において、ｘのビット列について、上位ビットから順に１であるか否かを判定することができる。なお、演算子「＞＞＝」は、右シフト演算した結果を代入するための複合代入演算子である。
【００５９】
ステップＳ２０８において、ハッシュ演算部１３０は、ｊが１５より小さいか否かを判定する。ハッシュ演算部１３０は、ｊが１５より小さい場合、ステップＳ２０９に進む。他方、ハッシュ演算部１３０は、ｊが１５以上の場合（すなわち、ｊが１５である場合）、ステップＳ２１４に進む。なお、ｊが１５である場合とは、認証対象メッセージ１０００の分割された１つのブロックＸｉの演算処理が完了した場合である。したがって、後述するステップＳ２１４〜Ｓ２１５の処理において、このときのｉがｍである場合（すなわち、認証対象メッセージ１０００の最後のブロックの演算処理が完了した場合）、ハッシュ値を出力する。他方、ｉがｍより小さい場合は、認証対象メッセージ１０００の次のブロックの演算処理を行う。
【００６０】
ステップＳ２０９において、ハッシュ演算部１３０は、以下の代入処理を行う。
・ｋに２７を代入する。
・ｊの値に１を加算した結果をｊに代入する。換言すれば、ｊの値をインクリメントする。
・ｘに、Ｘｉ［ｊ］とＹｉ−１［ｊ］とのビット毎の排他的論理和の演算結果を代入する。すなわち、ｘ＝Ｘｉ［ｊ］＾Ｙｉ−１［ｊ］とする。
これにより、配列Ｘｉ［１６］及び配列Ｙｉ−１［１６］について、次の要素のＧＨＡＳＨ関数の演算処理を行うことができる。
【００６１】
ステップＳ２１０において、ハッシュ演算部１３０は、Ｖ［１５］と１とのビット毎の論理積の演算結果が０であるか否かを判定する。すなわち、ハッシュ演算部１３０は、Ｖ［１５］の最下位ビットが０であるか否かを判定する。これは、換言すれば、ハッシュ演算部１３０は、Ｖ［０］〜Ｖ［１５］に格納されているビット列を左から順に並べたビット列をＶとすれば、このＶの最下位ビットが０であるか否かを判定することに等しい。ハッシュ演算部１３０は、Ｖ［１５］と１とのビット毎の論理積の演算結果が０でない場合（すなわち、演算結果が１である場合）、ステップＳ２１１に進み、演算結果が０である場合、ステップＳ２１２に進む。
【００６２】
ステップＳ２１１において、ハッシュ演算部１３０は、符号なし８ビットの変数ｒに１６進数「０ｘＥ１」を代入する。換言すれば、ハッシュ演算部１３０は、ｒにビット列「１１１００００１」を代入する。これは、ガロア体ＧＦ（２１２８）の既約多項式ｘ１２７＋ｘ１２６＋ｘ１２５＋ｘ１２０に対応するビット列の上位８ビットに相当する。
【００６３】
ステップＳ２１２において、ハッシュ演算部１３０は、符号なし８ビットの変数ｒに０を代入する。
【００６４】
ステップＳ２１３において、ハッシュ演算部１３０は、配列Ｖ［１６］に対して以下の演算処理及び代入処理を行う。
・Ｖ［１５］を右に１ビットシフト演算した演算結果とＶ［１４］を左に７ビットシフト演算した結果とのビット毎の論理和を演算し、演算結果をＶ［１５］に代入する。すなわち、Ｖ［１５］＝（Ｖ［１５］＞＞１）｜（Ｖ［１４］＜＜７）とする。なお、「＞＞」は右ビットシフト演算子、「＜＜」は左ビットシフト演算子、「｜」はビット毎の論理和演算子を表す。
・Ｖ［１４］を右に１ビットシフト演算した演算結果とＶ［１３］を左に７ビットシフト演算した結果とのビット毎の論理和を演算し、演算結果をＶ［１４］に代入する。すなわち、Ｖ［１４］＝（Ｖ［１４］＞＞１）｜（Ｖ［１３］＜＜７）とする。
・・・
・Ｖ［１］を右に１ビットシフト演算した演算結果とＶ［０］を左に７ビットシフト演算した結果とのビット毎の論理和を演算し、演算結果をＶ［１］に代入する。すなわち、Ｖ［１］＝（Ｖ［１］＞＞１）｜（Ｖ［０］＜＜７）とする。
・Ｖ［０］を右に１ビットシフト演算した演算結果とｒとのビット毎の排他的論理和を演算し、演算結果をＶ［０］に代入する。すなわち、Ｖ［０］＝（Ｖ［０］＞＞１）＾ｒとする。
なお、上記のステップＳ２１３の処理は、Ｖ［０］〜［１５］に格納されているビット列を左から順に並べたビット列をＶとすれば、このＶのビット列を右に１ビットシフト演算し、この演算結果の上位８ビットとｒとの排他的論理和を演算することに等しい。また、ｒが０である場合、排他的論理和による演算結果は、Ｖのビット列を右に１ビットシフトさせた演算結果と等しい。換言すれば、（Ｖ＞＞１）＾ｒ＝（Ｖ＞＞１）である。
【００６５】
以上のステップＳ２１３の処理についてもステップＳ２０５と同様に、ハッシュ演算部１３０は、例えば、Ｃ言語におけるｆｏｒ文などの繰り返し処理を用いずに行う。これにより、ｆｏｒ文などの繰り返し処理を行う場合と比較してＧＨＡＳＨ関数の演算速度の高速化を図ることができる。
【００６６】
ここで、ハッシュ演算部１３０は、上記のステップＳ２１３の処理の後、ステップＳ２０４の処理へ戻る。これにより、ハッシュ演算部１３０は、現在着目しているｘ＝ｂ０ｂ１・・・ｂ７のあるビットｂｌの次のビットｂｌ＋１についてＧＨＡＳＨ関数の演算を行う（ただし、ｌ＜７）。なお、ｌ＝７の場合は、配列Ｘｉ［ｊ］及び配列Ｙｉ−１［ｊ］の次の要素をビット毎の排他的論理和で演算した演算結果の最上位ビットについてＧＨＡＳＨ演算を行う（ただし、ｊ＜１５）。
【００６７】
ステップＳ２１４において、ハッシュ演算部１３０は、以下の代入処理を行う。
・ｉの値に１を加算した結果をｉに代入する。換言すれば、ｉの値をインクリメントする。
・Ｙｉ−１［０］にＺ［０］を代入する。すなわち、Ｙｉ−１［０］＝Ｚ［０］とする。
・Ｙｉ−１［１］にＺ［１］を代入する。すなわち、Ｙｉ−１［１］＝Ｚ［１］とする。
・・・
・Ｙｉ−１［１５］にＺ［１５］を代入する。すなわち、Ｙｉ−１［１５］＝Ｚ［１５］とする。
【００６８】
ステップＳ２１５において、ハッシュ演算部１３０は、ｉの値がｍより大きいか否かを判定する。ハッシュ演算部１３０は、ｉの値がｍより大きい場合（すなわち、ｉがｍ＋１の場合）、処理を終了させる。このとき、ハッシュ演算部１３０は、配列Ｙｉ−１［１６］（すなわち、配列Ｙｍ［１６］）をハッシュ値として出力する。他方、ハッシュ演算部１３０は、ｉの値がｍ以下の場合、ステップＳ２０２の処理に戻る。すなわち、ハッシュ演算部１３０は、ステップＳ２０２において、認証対象メッセージ１０００の次のブロックＸｉを代入した配列Ｘｉ［１６］と、ステップＳ２１４で得た配列Ｙｉ―１［１６］を入力としてＧＨＡＳＨ関数の演算処理を行う。
【００６９】
なお、上記において図６及び図７を用いて説明したＧＨＡＳＨ関数の演算処理は、ＡＥＳ−ＧＣＭによる平文メッセージＰの暗号化（又は暗号文Ｃの復号）処理と並列に行うことができる。換言すれば、ＧＨＡＳＨ関数の演算処理は、認証対象メッセージ１０００がすべて揃っていなくても（例えば、暗号文Ｃが作成途中などであっても）、認証対象メッセージ１０００に少なくとも１２８ビットのデータが含まれていれば、１２８ビットずつ処理を行うことができる。このことは、以降において説明するＧＨＡＳＨ関数の演算処理においても同様である。
【００７０】
以上のように、本実施形態に係る情報処理装置１０は、ＧＨＡＳＨ関数の演算処理において、配列の各要素に対する演算処理及び代入処理を行うための繰り返し処理を用いず処理を行う。したがって、繰り返し処理に伴う変数のインクリメントやジャンプ処理、判定処理を省くことでハードウェア資源を効率的に使用することができ、処理の高速化を図ることができる。これは、本実施形態に係る情報処理装置１０のように、コスト的制約が伴うことにより汎用的なコンピュータシステムに比べて比較的低価格のＭＰＵ１１等が搭載される組込み機器において特に実益があるものと考えられる。なお、本実施形態に係る情報処理装置１０のＧＨＡＳＨ関数は、配列の要素への代入処理を、繰り返し処理を用いずに逐次処理（順次処理）として処理する。このため、プログラム容量は若干増えるものの、同スペックのＭＰＵ１１を用いた場合、ＧＨＡＳＨ関数の演算処理は約２〜４倍程度高速化される。
【００７１】
［第２の実施形態］
次に、第２の実施形態に係る情報処理装置１０について説明する。本実施形態においては、ＧＨＡＳＨ関数の演算処理において、配列Ｖ［１６］を１ビットずつシフトさせるのではなく、必要なビット数をまとめてシフトさせることが第１の実施形態と相違する。また、配列Ｖ［１６］を複数ビットシフトさせた場合に用いるｒ（ガロア体ＧＦ（２１２８）上の既約多項式に対応するビット列）の変換テーブルを使用する。
【００７２】
＜機能構成＞
次に、本実施形態に係る情報処理装置１０の機能構成について説明する。図８は、第２の実施形態に係る情報処理装置の一例の機能構成図である。本実施形態に係る情報処理装置１０の機構構成は、変換テーブル２０００を有する点が第１の実施形態の情報処理装置１０と相違する。
【００７３】
変換テーブル２０００は、図９に示されるデータ構成を有している。図９では、変換テーブル２０００は、２５６個の要素からなる符号なし１６ビットの配列Ｒｍａｐ［２５６］で定義されている。この変換テーブル２０００は、ＧＨＡＳＨ関数の演算処理において配列Ｖ［１６］を何ビットシフトさせる必要があるのかに応じて、ｒの値を変換テーブル２０００の対応する要素に変換するためのものである。
【００７４】
＜処理の詳細＞
次に、本実施形態に係る情報処理装置１０の処理の詳細について説明する。なお、本実施形態に係る情報処理装置１０は、ＧＨＡＳＨ関数の演算処理が第１の実施形態と相違する。
【００７５】
《ＧＨＡＳＨ関数の演算処理》
上記で説明した図４のステップＳ１０２における本実施形態に係るＧＨＡＳＨ関数の演算処理について、図１０及び図１１を用いて詳細に説明する。なお、上記第１の実施形態に係る情報処理装置１０において実行されるＧＨＡＳＨ関数の演算処理（図６及び図７）との相違点は、ステップＳ３０１〜ステップＳ３０８に示す処理である。そこで、以下では、ステップＳ３０１〜ステップＳ３０８に示す処理について説明する。
【００７６】
ステップＳ３０１において、ハッシュ演算部１３０は、各種ローカル変数や配列の初期化を行う。具体的には、ハッシュ演算部１３０は、第１の実施形態における図６のステップＳ２０３の処理に加えて、以下の処理を行う。
・配列Ｖ［１６］をシフト演算するためのシフト数をカウントする変数ｓＢｉｔを準備し、ｓＢｉｔを０に初期化する。
【００７７】
ステップＳ３０２において、ハッシュ演算部１３０は、ｓＢｉｔが０より大きいか否かを判定する。すなわち、ハッシュ演算部１３０は、配列Ｖ［１６］をシフト演算する必要があるか否かを判定する。ハッシュ演算部１３０は、ｓＢｉｔが０より大きい場合（すなわち、シフト演算する必要がある場合）、ステップＳ３０３に進む。他方、ハッシュ演算部１３０は、ｓＢｉｔが０である場合（すなわち、シフト演算する必要がない場合）、ステップＳ２０５に進む。
【００７８】
ステップＳ３０３において、ハッシュ演算部１３０は、ｓＢｉｔが７より大きいか否かを判定する。これは、配列Ｖ［１６］のシフト演算を８ビット以下ずつ行わせるためである。したがって、例えばｓＢｉｔの値が１０である場合、ハッシュ演算部１３０は、８ビットのシフト演算と２ビットのシフト演算を配列Ｖ［１６］に対して行う。
【００７９】
ステップＳ３０４において、ハッシュ演算部１３０は、配列Ｖ［１６］を右にシフトさせるビット数ｐとして８を代入する。
【００８０】
ステップＳ３０５において、ハッシュ演算部１３０は、配列Ｖ［１６］を右にシフトさせるビット数ｐとしてｓＢｉｔの値を代入する。
【００８１】
ステップＳ３０６において、ハッシュ演算部１３０は、以下の処理を行う。
・ｓＢｉｔからｐを減算した結果をｓＢｉｔに代入する。すなわち、ｓＢｉｔ＝ｓＢｉｔ−ｐとする。
・配列Ｖ［１６］を左にシフトさせるビット数ｑとして、８−ｐを代入する。すなわち、ｑ＝８−ｐとする。
・配列Ｖ［１６］の最上位１６ビット（すなわち、Ｖ［０］及びＶ［１］にそれぞれ格納されるビット列）とビット毎の排他的論理和を演算するｒについて、変換テーブル２０００を用いて対応する値を代入する。具体的には、ｒ＝Ｒｍａｐ［（Ｖ［１５］＜＜ｑ）＆０ｘＦＦ］とする。
【００８２】
ここで、例えば、ｐ＝１である場合、ｑ＝７であるから、（Ｖ［１５］＜＜ｑ）の演算結果の１つの候補は１２８である。したがって、このとき、ｒ＝Ｒｍａｐ［１２８］＝０ｘＥ１００となる。これは、ガロア体ＧＦ（２１２８）上の既約多項式に対応するビット列の上位１６ビットに対応する。なお、ｐ＝１である場合の（Ｖ［１５］＜＜ｑ）の演算結果の他の候補は０である。この場合、ｒ＝Ｒｍａｐ［０］＝０ｘ００００となる。
【００８３】
同様に、ｐ＝２である場合、ｑ＝６であるから、（Ｖ［１５］＜＜ｑ）の演算結果の値の１つの候補は１９２である。したがって、このとき、ｒ＝Ｒｍａｐ［１９２］＝０ｘ９１８０となる。これは、ガロア体ＧＦ（２１２８）上の既約多項式に対応するビット列の上位１６ビットと、このビット列を右に１ビットシフトしたビット列との排他的論理和を演算した演算結果と一致する。なお、ｐ＝２である場合の（Ｖ［１５］＜＜ｑ）の演算結果の他の候補は、０，６４，１２８である。これらは、それぞれＶ［１５］の下位２ビットが００，０１，１０である。
【００８４】
なお、ｐが３以上の場合も同様の方法により演算することができる。このように、変換テーブル２０００は、配列Ｖ［１６］をシフトさせるビット数に応じて、対応するｒの値が定義されたテーブルである。
【００８５】
ステップＳ３０７において、ハッシュ演算部１３０は、配列Ｖ［１６］に対して以下の演算処理及び代入処理を行う。
・Ｖ［１５］を右にｐビットシフト演算した演算結果とＶ［１４］を左にｑビットシフト演算した結果とのビット毎の論理和を演算し、演算結果をＶ［１５］に代入する。すなわち、Ｖ［１５］＝（Ｖ［１５］＞＞ｐ）｜（Ｖ［１４］＜＜ｑ）とする。
・・・
・Ｖ［２］を右にｐビットシフト演算した演算結果とＶ［１］を左にｑビットシフト演算した結果とのビット毎の論理和を演算し、演算結果をＶ［２］に代入する。すなわち、Ｖ［２］＝（Ｖ［２］＞＞ｐ）｜（Ｖ［１］＜＜ｑ）とする。
・Ｖ［１］を右にｐビットシフト演算した演算結果とＶ［０］を左にｑビットシフト演算した結果とのビット毎の論理和を演算し、この演算結果とｒの下位８ビットとの排他的論理和を演算した結果をＶ［１］に代入する。すなわち、Ｖ［１］＝（（Ｖ［１］＞＞ｐ）｜（Ｖ［０］＜＜ｑ））＾（ｕｉｎｔ８＿ｔ）（ｒ＆０ｘＦＦ）とする。ここで、「（ｕｉｎｔ８＿ｔ）」は、ｒ＆０ｘＦＦを符号なし８ビットに型変換するためのキャスト演算子である。
・Ｖ［０］を右にｐビットシフト演算した演算結果とｒの上位８ビットとのビット毎の論理和を演算し、演算結果をＶ［０］に代入する。すなわち、Ｖ［０］＝（Ｖ［０］＞＞ｐ）＾（ｕｉｎｔ８＿ｔ）（（ｒ＞＞８）＆０ｘＦＦ））とする。
【００８６】
上記ステップＳ３０６の処理の後、ハッシュ演算部１３０は、ステップＳ３０２に戻る。したがって、なおｓＢｉｔの値が１以上である場合、ハッシュ演算部１３０は、再びステップＳ３０３〜Ｓ３０７の処理を行う。これにより、本実施形態に係る情報処理装置１０のＧＨＡＳＨ関数の演算処理においては、配列Ｖ［１６］のシフト演算を複数ビットまとめて行うことができる。したがって、配列Ｖ［１６］に１ビットずつシフト演算を行うことを繰り返すことに比べて、高速に処理を行うことができる。
【００８７】
ステップＳ３０８において、ハッシュ演算部１３０は、ｓＢｉｔの値に１を加算した結果をｓＢｉｔに代入する。換言すれば、ハッシュ演算部１３０は、ｓＢｉｔの値をインクリメントする。すなわち、第１の実施形態におけるＧＨＡＳＨ関数の演算処理において図７のステップＳ２１０〜ステップＳ２１３の処理に代えて、ステップＳ３０８の処理の処理を行う。これにより、上述したステップＳ３０７の処理において配列Ｖ［１６］をまとめて複数ビットのシフト演算を行うことができる。
【００８８】
以上のように本実施形態に係る情報処理装置１０は、ＧＨＡＳＨ関数の演算処理において、配列のシフト演算を複数ビットまとめて処理する。また、そのためシフト演算するシフト数に応じて、所定の値にｒを変換するための変換テーブルを用いる。このように、複数ビットをまとめてシフト演算を行うことシフト演算の演算回数を減少させることができる。したがって、第１の実施形態に係る情報処理装置１０におけるＧＨＡＳＨ関数の演算処理に比べて、さらに高速化を図ることができる。
【００８９】
［第３の実施形態］
次に、第３の実施形態に係る情報処理装置１０について説明する。本実施形態においては、ＧＨＡＳＨ関数の演算処理において、配列Ｖ［１６］のシフト演算を２ビットシフトさせる処理と１ビットシフトさせる処理とで構成する。これにより、本実施形態に係る情報処理装置１０は、変換テーブル２０００を有することなく、第１の実施形態よりもＧＨＡＳＧ関数の演算処理速度を高速化させることできる。なお、本実施形態に係る情報処理装置１０の機能構成は、第１の実施形態に係る情報処理装置１０の機能構成と同様である。
【００９０】
＜処理の詳細＞
次に、本実施形態に係る情報処理装置１０の処理の詳細について説明する。なお、本実施形態に係る情報処理装置１０は、ＧＨＡＳＨ関数の演算処理が第２の実施形態と相違する。
【００９１】
《ＧＨＡＳＨ関数の演算処理》
上記で説明した図４のステップＳ１０２における本実施形態に係るＧＨＡＳＨ関数の演算処理について、図１２及び図１３を用いて詳細に説明する。なお、上記第２の実施形態に係る情報処理装置１０において実行されるＧＨＡＳＨ関数の演算処理（図１０及び図１１）との相違点は、ステップＳ４０１〜ステップＳ４１２に示す処理である。そこで、以下では、ステップＳ４０１〜ステップＳ４１２に示す処理について説明する。
【００９２】
ステップＳ４０１において、ハッシュ演算部１３０は、ｓＢｉｔが２以上であるか否かを判定する。これにより、ｓＢｉｔが２以上である場合、後述するステップＳ４０２〜ステップＳ４０７の処理を繰り返し行うことで、配列Ｖ［１６］のシフト演算を２ビットずつ行う。ハッシュ演算部１３０は、ｓＢｉｔが２以上である場合、ステップＳ４０２に進む。他方、ハッシュ演算部１３０は、ｓＢｉｔが２未満である場合（すなわち、ｓＢｉｔが０又は１である場合）、ステップＳ４０８に進む。
【００９３】
ステップＳ４０２において、ハッシュ演算部１３０は、配列Ｖ［１６］に対して以下の演算処理及び代入処理を行う。
・Ｖ［１５］と３とのビット毎の論理積の演算結果をｒに代入する。すなわち、ｒ＝Ｖ［１５］＆３とする。換言すれば、ｒに、Ｖ［１５］の下位２ビットの値を代入する。
・Ｖ［１５］を右に２ビットシフト演算した演算結果とＶ［１４］を左に６ビットシフト演算した結果とのビット毎の論理和を演算し、演算結果をＶ［１５］に代入する。すなわち、Ｖ［１５］＝（Ｖ［１５］＞＞２）｜（Ｖ［１４］＜＜６）とする。
・・・
・Ｖ［１］を右に２ビットシフト演算した演算結果とＶ［０］を左に６ビットシフト演算した結果とのビット毎の論理和を演算し、演算結果をＶ［１］に代入する。すなわち、Ｖ［１］＝（Ｖ［１］＞＞２）｜（Ｖ［０］＜＜６）とする。
・Ｖ［０］を右に２ビットシフト演算した演算結果をＶ［０］に代入する。すなわち、Ｖ［０］＝（Ｖ［０］＞＞２）とする。
【００９４】
ステップＳ４０３において、ハッシュ演算部１３０は、ｒの値がいずれであるかを判定する。ハッシュ演算部１３０は、ｒの値が１である場合、ステップＳ４０４に進み、ｒの値が２である場合ステップＳ４０５に進む、ｒの値が３である場合、ステップＳ４０６に進む。
【００９５】
ステップＳ４０４において、ハッシュ演算部１３０は、以下の演算処理及び代入処理を行う。
・Ｖ［１］と０ｘ８０との排他的論理和を演算し、この演算結果をＶ［１］に代入する。すなわち、Ｖ［１］＝Ｖ［１］＾０ｘ８０とする。
・Ｖ［０］と０ｘ７０との排他的論理和を演算し、この演算結果をＶ［０］に代入する。すなわち、Ｖ［０］＝Ｖ［０］＾０ｘ７０とする。
ここで、上記の０ｘ８０及び０ｘ７０は、第２の実施形態における変換テーブル２０００のＲ［６４］の値の下位８ビット及び上位８ビットである。したがって、本実施形態に係るＧＨＡＳＨ関数の演算処理では、変換テーブル２０００を用いずに、変換テーブル２０００の該当の値を直接使用する。換言すれば、本実施形態に係るＧＨＡＳＨ関数では、これらの該当の値をいわゆるマジックナンバーとしてソースコード上に記述する。
【００９６】
ステップＳ４０５において、ハッシュ演算部１３０は、以下の演算処理及び代入処理を行う。
・Ｖ［０］と０ｘＥ１との排他的論理和を演算し、この演算結果をＶ［０］に代入する。すなわち、Ｖ［０］＝Ｖ［０］＾０ｘＥ１とする。
なお、この０ｘＥ１は、第２の実施形態における変換テーブル２０００のＲ［１２８］の値の上位８ビットである。
【００９７】
ステップＳ４０６において、ハッシュ演算部１３０は、以下の演算処理及び代入処理を行う。
・Ｖ［１］と０ｘ８０との排他的論理和を演算し、この演算結果をＶ［１］に代入する。すなわち、Ｖ［１］＝Ｖ［１］＾０ｘ８０とする。
・Ｖ［０］と０ｘ９１との排他的論理和を演算し、この演算結果をＶ［０］に代入する。すなわち、Ｖ［０］＝Ｖ［０］＾０ｘ９１とする。
なお、これらの０ｘ８０及び０ｘ９１は、第２の実施形態における変換テーブル２０００のＲ［１９２］の値の下位８ビット及び上位８ビットである。
【００９８】
ステップＳ４０７において、ハッシュ演算部１３０は、ｓＢｉｔの値を２減算した結果をｓＢｉｔに代入する。その後、ハッシュ演算部１３０は、ステップＳ４０１に戻る。すなわち、ハッシュ演算部１３０は、ｓＢｉｔの値が１以下となるまで、ステップＳ４０２〜Ｓ４０６で説明した配列Ｖ［１６］の２ビットずつのシフト演算処理を行う。
【００９９】
ステップＳ４０８において、ハッシュ演算部１３０は、ｓＢｉｔの値が０より大きいか否かを判定する。すなわち、ハッシュ演算部１３０は、ｓＢｉｔの値が１であるか否かを判定する。ハッシュ演算部１３０は、ｓＢｉｔの値が０より大きい場合、ステップＳ４０９に進む。他方、ハッシュ演算部１３０は、ｓＢｉｔの値が０以下である場合（すなわち、ｓＢｉｔの値が０である場合）、ステップＳ２０６に進む。
【０１００】
ステップＳ４０９において、ハッシュ演算部１３０は、配列Ｖ［１６］に対して以下の演算処理及び代入処理を行う。
・Ｖ［１５］と１とのビット毎の論理積の演算結果をｒに代入する。すなわち、ｒ＝Ｖ［１５］＆１とする。換言すれば、ｒに、Ｖ［１５］の下位１ビットの値を代入する。
・Ｖ［１５］を右に１ビットシフト演算した演算結果とＶ［１４］を左に７ビットシフト演算した結果とのビット毎の論理和を演算し、演算結果をＶ［１５］に代入する。すなわち、Ｖ［１５］＝（Ｖ［１５］＞＞１）｜（Ｖ［１４］＜＜７）とする。
・・・
・Ｖ［１］を右に１ビットシフト演算した演算結果とＶ［０］を左に７ビットシフト演算した結果とのビット毎の論理和を演算し、演算結果をＶ［１］に代入する。すなわち、Ｖ［１］＝（Ｖ［１］＞＞１）｜（Ｖ［０］＜＜７）とする。
・Ｖ［０］を右に１ビットシフト演算した演算結果をＶ［０］に代入する。すなわち、Ｖ［０］＝（Ｖ［０］＞＞１）とする。
【０１０１】
ステップＳ４１０において、ハッシュ演算部１３０は、ｒの値が１であるか否かを判定する。すなわち、ハッシュ演算部１３０は、Ｖ［１５］の最下位ビットが１であるか否かを判定する。ハッシュ演算部１３０は、ｒの値が１である場合、ステップＳ４１１に進む。他方、ｒの値が１でない場合ステップＳ４１２に進む。
【０１０２】
ステップＳ４１１において、ハッシュ演算部１３０は、以下の演算処理及び代入処理を行う。
・Ｖ［０］と０ｘＥ１との排他的論理和を演算し、この演算結果をＶ［０］に代入する。すなわち、Ｖ［０］＝Ｖ［０］＾０ｘＥ１とする。
【０１０３】
ステップＳ４１２おいて、ハッシュ演算部１３０は、ｓＢｉｔに０を代入する。
【０１０４】
以上にように本実施形態に係る情報処理装置１０は、ＧＨＡＳＨ関数の演算処理において配列のシフト演算を２ビットのシフト演算と１ビットのシフト演算とを組み合わせて行う。例えば配列を５ビットシフト演算する必要がある場合は、２ビットのシフト演算を２回と１ビットのシフト演算を１回行う。これにより、第２の実施形態に係る情報処理装置１０のように変換テーブル２０００を有することなく、高速にＧＨＡＳＨ関数の演算処理を行うことができる。
【０１０５】
ＧＨＡＳＨ関数の入力である認証対象メッセージ１０００は、暗号文Ｃが含まれている。したがって、認証対象メッセージ１０００のビット列においてビット成分１が連続して３回以上現れる確率は低いと考えられる。したがって、本実施形態に係る情報処理装置１０が行うＧＨＡＳＨ関数の演算処理では、変換テーブル２０００を用いずに、配列のシフト演算を２ビットのシフト演算と１ビットのシフト演算とを組み合わせて行う。これにより、本実施形態に係る情報処理装置１０では、変換テーブル２０００を記憶するためのＲＯＭ１３の容量を節約でき、かつ、第１の実施形態に係る情報処理装置１０が行うＧＨＡＳＨ関数の演算処理よりも高速化を実現することができる。
【０１０６】
［第４の実施形態］
次に、第４の実施形態に係る情報処理装置１０について説明する。本実施形態においては、ＧＨＡＳＨ関数の演算処理において符号なし８ビットの配列Ｖ［１６］及び配列Ｚ［１６］の代わりに符号なし１６ビットの配列Ｖ［８］及び配列Ｚ［８］を用いる。なお、本実施形態に係る情報処理装置１０の機能構成は、第１の実施形態に係る情報処理装置１０の機能構成と同様である。
【０１０７】
＜処理の詳細＞
次に、本実施形態に係る情報処理装置１０の処理の詳細について説明する。なお、本実施形態に係る情報処理装置１０は、ＧＨＡＳＨ関数の演算処理が第１の実施形態と相違する。
【０１０８】
《ＧＨＡＳＨ関数の演算処理》
上記で説明した図４のステップＳ１０２における本実施形態に係るＧＨＡＳＨ関数の演算処理について、図１４及び図１５を用いて詳細に説明する。なお、上記第１の実施形態に係る情報処理装置１０において実行されるＧＨＡＳＨ関数の演算処理（図６及び図７）との相違点は、ステップＳ５０１〜ステップＳ５０８に示す処理である。そこで、以下では、ステップＳ５０１〜ステップＳ５０８に示す処理について説明する。
【０１０９】
ステップＳ５０１において、ハッシュ演算部１３０は、各種ローカル変数や配列の初期化を行う。具体的には、ハッシュ演算部１３０は以下を行う。
・配列Ｘｉ［１６］及び配列Ｙｉ−１［１６］の要素を表すための変数ｊを準備し、ｊを０に初期化する。
・ある特定のビットが１であるか否かを判定するために用いる変数ｋを準備し、ｋを２１５に初期化する。
・配列Ｘｉ［１６］及び配列Ｙｉ−１［１６］の２ｊ番目の要素のビット毎の排他的論理和の演算結果を８ビット左にシフトさせたビット列と２ｊ＋１番目の要素のビット毎の排他的論理和の演算結果とのビット毎の論理和を格納する符号なし１６ビットの変数ｘを準備する。そして、ｘ＝（（Ｘｉ［０］＾Ｙｉ−１［０］）＜＜８）｜（Ｘｉ［１］＾Ｙｉ−１［１］）とする。
・ＧＨＡＳＨ関数の演算結果を格納するための８個の要素からなる符号なし１６ビットの配列Ｚ［８］を準備し、それぞれ０で初期化する。すなわち、Ｚ［０］＝００００００００００００００００，・・・，Ｚ［７］＝００００００００００００００００とする。
・ガロア体上の乗算演算（×）を行うための符号なし１６ビットの配列Ｖ［８］を準備し、ＧＨＡＳＨ関数のサブキーＨを格納する。具体的には、Ｖ［０］＝（Ｈ［０］＜＜８）｜Ｈ［１］，・・・，Ｖ［７］＝（Ｈ［１４］＜＜８）｜Ｈ［１５］とする。
【０１１０】
ステップＳ５０２において、ハッシュ演算部１３０は、配列Ｚ［８］と配列Ｖ［８］の各要素についてそれぞれビット毎の排他的論理和を演算し、演算結果をそれぞれ配列Ｚ［８］に代入する。具体的には、ハッシュ演算部１３０は、以下の処理を行う。
・Ｚ［０］とＶ［０］とのビット毎の排他的論理和を演算し、演算結果をＺ［０］に代入する。すなわち、Ｚ［０］＝Ｚ［０］＾Ｖ［０］とする。
・Ｚ［１］とＶ［１］とのビット毎の排他的論理和を演算し、演算結果をＺ［１］に代入する。すなわち、Ｚ［１］＝Ｚ［１］＾Ｖ［１］とする。
・・・
・Ｚ［７］とＶ［７］とのビット毎の排他的論理和を演算し、演算結果をＺ［７］に代入する。すなわち、Ｚ［７］＝Ｚ［７］＾Ｖ［７］とする。
【０１１１】
ステップＳ５０３において、ハッシュ演算部１３０は、ｊが７より小さいか否かを判定する。ハッシュ演算部１３０は、ｊが７より小さい場合、ステップＳ５０４に進む。他方、ハッシュ演算部１３０は、ｊが７以上の場合（すなわち、ｊが７である場合）、ステップＳ５０８に進む。なお、ｊが７である場合とは、認証対象メッセージ１０００の分割された１つのブロックＸｉの演算処理が完了した場合である。
【０１１２】
ステップＳ５０４において、ハッシュ演算部１３０は、以下の代入処理を行う。
・ｋに２１５を代入する。
・ｊの値に１を加算した結果をｊに代入する。換言すれば、ｊの値をインクリメントする。
・ｘに、Ｘｉ［２ｊ］とＹｉ−１［２ｊ］とのビット毎の排他的論理和の演算結果を８ビット左にシフトさせたビット列と、Ｘｉ［２ｊ＋１］とＹｉ−１［２ｊ＋１］とのビット毎の排他的論理和の演算結果とのビット毎の論理和の演算結果を代入する。すなわち、ｘ＝（（Ｘｉ［２ｊ］＾Ｙｉ−１［２ｊ］）＜＜８）｜（Ｘｉ［２ｊ＋１］＾Ｙｉ−１［２ｊ＋１］）とする。
【０１１３】
ステップＳ５０５において、ハッシュ演算部１３０は、Ｖ［７］と１とのビット毎の論理積の演算結果が０であるか否かを判定する。すなわち、ハッシュ演算部１３０は、Ｖ［７］の最下位ビットが０であるか否かを判定する。ハッシュ演算部１３０は、Ｖ［７］と１とのビット毎の論理積の演算結果が０でない場合（すなわち、演算結果が１である場合）、ステップＳ５０６に進み、演算結果が０である場合、ステップＳ２１２に進む。
【０１１４】
ステップＳ５０６において、ハッシュ演算部１３０は、符号なし１６ビットの変数ｒに１６進数「０ｘＥ１００」を代入する。換言すれば、ハッシュ演算部１３０は、ｒにビット列「１１１００００１００００００００」を代入する。これは、ガロア体ＧＦ（２１２８）の既約多項式ｘ１２７＋ｘ１２６＋ｘ１２５＋ｘ１２０に対応するビット列の上位１６ビットに相当する。
【０１１５】
ステップＳ５０７において、ハッシュ演算部１３０は、配列Ｖ［８］に対して以下の演算処理及び代入処理を行う。
・Ｖ［７］を右に１ビットシフト演算した演算結果とＶ［６］を左に１５ビットシフト演算した結果とのビット毎の論理和を演算し、演算結果をＶ［７］に代入する。すなわち、Ｖ［７］＝（Ｖ［７］＞＞１）｜（Ｖ［６］＜＜１５）とする。
・Ｖ［６］を右に１ビットシフト演算した演算結果とＶ［５］を左に１５ビットシフト演算した結果とのビット毎の論理和を演算し、演算結果をＶ［６］に代入する。すなわち、Ｖ［６］＝（Ｖ［６］＞＞１）｜（Ｖ［５］＜＜１５）とする。
・・・
・Ｖ［１］を右に１ビットシフト演算した演算結果とＶ［０］を左に１５ビットシフト演算した結果とのビット毎の論理和を演算し、演算結果をＶ［１］に代入する。すなわち、Ｖ［１］＝（Ｖ［１］＞＞１）｜（Ｖ［０］＜＜１５）とする。
・Ｖ［０］を右に１ビットシフト演算した演算結果とｒとのビット毎の排他的論理和を演算し、演算結果をＶ［０］に代入する。すなわち、Ｖ［０］＝（Ｖ［０］＞＞１）＾ｒとする。
なお、上記のステップＳ５０７の処理は、Ｖ［０］〜［７］に格納されているビット列を左から順に並べたビット列をＶとすれば、このＶのビット列を右に１ビットシフト演算し、この演算結果の上位１６ビットとｒとの排他的論理和を演算することに等しい。
【０１１６】
ステップＳ５０８において、ハッシュ演算部１３０は、以下の代入処理を行う。
・ｉの値に１を加算した結果をｉに代入する。換言すれば、ｉの値をインクリメントする。
・Ｙｉ−１［０］に、Ｚ［０］を右に８ビットシフト演算した演算結果の下位８ビットを代入する。すなわち、Ｙｉ−１［０］＝（Ｚ［０］＞＞８）＆０ｘＦＦとする。
・Ｙｉ−１［１］に、Ｚ［０］の下位８ビットを代入する。すなわち、Ｙｉ−１［１］＝Ｚ［０］＆０ｘＦＦとする。
・・・
・Ｙｉ−１［１４］に、Ｚ［７］を右に８ビットシフト演算した演算結果の下位８ビットを代入する。すなわち、Ｙｉ−１［１４］＝（Ｚ［７］＞＞８）＆０ｘＦＦとする。
・Ｙｉ−１［１５］に、Ｚ［７］の下位８ビットを代入する。すなわち、Ｙｉ−１［１５］＝Ｚ［７］＆０ｘＦＦとする。
【０１１７】
以上にように本実施形態に係る情報処理装置１０は、ＧＨＡＳＨ関数の演算処理において符号なし１６ビットの配列Ｖ［８］及び配列Ｚ［８］を用いて処理を行う。これにより、配列Ｖ［８］のシフト演算の処理回数などを減少させることができる。したがって、第４の実施形態に係る情報処理装置１０が行うＧＨＡＳＨ関数の演算時間を高速化させることができる。
【０１１８】
また、配列Ｖ［８］を符号なし１６ビットとすることで、情報処理装置１０のＭＰＵ１６が例えば１６ビットのＭＰＵである場合は、ＧＨＡＳＨ関数の演算時間をさらに高速化させることができる。
【０１１９】
［第５の実施形態］
次に、第５の実施形態に係る情報処理装置１０について説明する。本実施形態においては、ＧＨＡＳＨ関数の演算処理において符号なし８ビットの配列Ｖ［１６］及び配列Ｚ［１６］の代わりに符号なし３２ビットの配列Ｖ［４］及び配列Ｚ［４］を用いる。なお、本実施形態に係る情報処理装置１０の機能構成は、第１の実施形態に係る情報処理装置１０の機能構成と同様である。
【０１２０】
＜処理の詳細＞
次に、本実施形態に係る情報処理装置１０の処理の詳細について説明する。なお、本実施形態に係る情報処理装置１０は、ＧＨＡＳＨ関数の演算処理が第１の実施形態と相違する。
【０１２１】
《ＧＨＡＳＨ関数の演算処理》
上記で説明した図４のステップＳ１０２における本実施形態に係るＧＨＡＳＨ関数の演算処理について、図１６及び図１７を用いて詳細に説明する。なお、上記第１の実施形態に係る情報処理装置１０において実行されるＧＨＡＳＨ関数の演算処理（図６及び図７）との相違点は、ステップＳ６０１〜ステップＳ６０８に示す処理である。そこで、以下では、ステップＳ６０１〜ステップＳ６０８に示す処理について説明する。
【０１２２】
ステップＳ６０１において、ハッシュ演算部１３０は、各種ローカル変数や配列の初期化を行う。具体的には、ハッシュ演算部１３０は以下を行う。
・配列Ｘｉ［１６］及び配列Ｙｉ−１［１６］の要素を表すための変数ｊを準備し、ｊを０に初期化する。
・ある特定のビットが１であるか否かを判定するために用いる変数ｋを準備し、ｋを２３１に初期化する。
・符号なし３２ビットの変数ｘを準備し、ｘ＝（（Ｘｉ［０］＾Ｙｉ−１［０］）＜＜２４）｜（（Ｘｉ［１］＾Ｙｉ−１［１］）＜＜１６）｜（（Ｘｉ［２］＾Ｙｉ−１［２］）＜＜８）｜（Ｘｉ［３］＾Ｙｉ−１［３］）とする。
・ＧＨＡＳＨ関数の演算結果を格納するための４個の要素からなる符号なし３２ビットの配列Ｚ［４］を準備し、それぞれ０で初期化する。すなわち、Ｚ［０］＝０３２，・・・，Ｚ［３］＝０３２とする。
・ガロア体上の乗算演算（×）を行うための符号なし３２ビットの配列Ｖ［４］を準備し、ＧＨＡＳＨ関数のサブキーＨを格納する。具体的には、Ｖ［０］＝（Ｈ［０］＜＜２４）｜（Ｈ［１］＜＜１６）｜（Ｈ［２］＜＜８）｜Ｈ［３］，・・・，Ｖ［３］＝（Ｈ［１２］＜＜２４）｜（Ｈ［１３］＜＜１６）｜（Ｈ［１４］＜＜８）｜Ｈ［１５］とする。
【０１２３】
ステップＳ６０２において、ハッシュ演算部１３０は、配列Ｚ［４］と配列Ｖ［４］の各要素についてそれぞれビット毎の排他的論理和を演算し、演算結果をそれぞれ配列Ｚ［４］に代入する。具体的には、ハッシュ演算部１３０は、以下の処理を行う。
・Ｚ［０］とＶ［０］とのビット毎の排他的論理和を演算し、演算結果をＺ［０］に代入する。すなわち、Ｚ［０］＝Ｚ［０］＾Ｖ［０］とする。
・Ｚ［１］とＶ［１］とのビット毎の排他的論理和を演算し、演算結果をＺ［１］に代入する。すなわち、Ｚ［１］＝Ｚ［１］＾Ｖ［１］とする。
・・・
・Ｚ［３］とＶ［３］とのビット毎の排他的論理和を演算し、演算結果をＺ［３］に代入する。すなわち、Ｚ［３］＝Ｚ［３］＾Ｖ［３］とする。
【０１２４】
ステップＳ６０３において、ハッシュ演算部１３０は、ｊが３より小さいか否かを判定する。ハッシュ演算部１３０は、ｊが３より小さい場合、ステップＳ６０４に進む。他方、ハッシュ演算部１３０は、ｊが３以上の場合（すなわち、ｊが３である場合）、ステップＳ６０８に進む。なお、ｊが３である場合とは、認証対象メッセージ１０００の分割された１つのブロックＸｉの演算処理が完了した場合である。
【０１２５】
ステップＳ６０４において、ハッシュ演算部１３０は、以下の代入処理を行う。
・ｋに２３１を代入する。
・ｊの値に１を加算した結果をｊに代入する。換言すれば、ｊの値をインクリメントする。
・ｘ＝（（Ｘｉ［４ｊ］＾Ｙｉ−１［４ｊ］）＜＜２４）｜（（Ｘｉ［４ｊ＋１］＾Ｙｉ−１［４ｊ＋１］）＜＜１６）｜（（Ｘｉ［４ｊ＋２］＾Ｙｉ−１［４ｊ＋２］）＜＜８）｜（Ｘｉ［４ｊ＋３］＾Ｙｉ−１［４ｊ＋３］）とする。
【０１２６】
ステップＳ６０５において、ハッシュ演算部１３０は、Ｖ［３］と１とのビット毎の論理積の演算結果が０であるか否かを判定する。すなわち、ハッシュ演算部１３０は、Ｖ［３］の最下位ビットが０であるか否かを判定する。ハッシュ演算部１３０は、Ｖ［３］と１とのビット毎の論理積の演算結果が０でない場合（すなわち、演算結果が１である場合）、ステップＳ６０６に進み、演算結果が０である場合、ステップＳ２１２に進む。
【０１２７】
ステップＳ６０６において、ハッシュ演算部１３０は、符号なし１６ビットの変数ｒに１６進数「０ｘＥ１００００００」を代入する。換言すれば、ハッシュ演算部１３０は、ｒに上位８ビットが「１１１００００１」、下位２４ビットが０のビット列を代入する。これは、ガロア体ＧＦ（２１２８）の既約多項式ｘ１２７＋ｘ１２６＋ｘ１２５＋ｘ１２０に対応するビット列の上位３２ビットに相当する。
【０１２８】
ステップＳ６０７において、ハッシュ演算部１３０は、配列Ｖ［４］に対して以下の演算処理及び代入処理を行う。
・Ｖ［３］を右に１ビットシフト演算した演算結果とＶ［２］を左に３１ビットシフト演算した結果とのビット毎の論理和を演算し、演算結果をＶ［３］に代入する。すなわち、Ｖ［３］＝（Ｖ［３］＞＞１）｜（Ｖ［２］＜＜３１）とする。
・Ｖ［２］を右に１ビットシフト演算した演算結果とＶ［１］を左に３１ビットシフト演算した結果とのビット毎の論理和を演算し、演算結果をＶ［２］に代入する。すなわち、Ｖ［２］＝（Ｖ［２］＞＞１）｜（Ｖ［１］＜＜３１）とする。
・Ｖ［１］を右に１ビットシフト演算した演算結果とＶ［０］を左に３１ビットシフト演算した結果とのビット毎の論理和を演算し、演算結果をＶ［１］に代入する。すなわち、Ｖ［１］＝（Ｖ［１］＞＞１）｜（Ｖ［０］＜＜３１）とする。
・Ｖ［０］を右に１ビットシフト演算した演算結果とｒとのビット毎の排他的論理和を演算し、演算結果をＶ［０］に代入する。すなわち、Ｖ［０］＝（Ｖ［０］＞＞１）＾ｒとする。
なお、上記のステップＳ５０７の処理は、Ｖ［０］〜［３］に格納されているビット列を左から順に並べたビット列をＶとすれば、このＶのビット列を右に１ビットシフト演算し、この演算結果の上位３２ビットとｒとの排他的論理和を演算することに等しい。
【０１２９】
ステップＳ６０８において、ハッシュ演算部１３０は、以下の代入処理を行う。
・ｉの値に１を加算した結果をｉに代入する。換言すれば、ｉの値をインクリメントする。
・Ｙｉ−１［０］に、Ｚ［０］を右に２４ビットシフト演算した演算結果の下位８ビットを代入する。すなわち、Ｙｉ−１［０］＝（Ｚ［０］＞＞２４）＆０ｘＦＦとする。
・Ｙｉ−１［１］に、Ｚ［０］を右に１６ビットシフト演算した演算結果の下位８ビットを代入する。すなわち、Ｙｉ−１［１］＝（Ｚ［０］＞＞１６）＆０ｘＦＦとする。
・Ｙｉ−１［２］に、Ｚ［０］を右に８ビットシフト演算した演算結果の下位８ビットを代入する。すなわち、Ｙｉ−１［２］＝（Ｚ［０］＞＞８）＆０ｘＦＦとする。
・Ｙｉ−１［３］に、Ｚ［０］の下位８ビットを代入する。すなわち、Ｙｉ−１［３］＝Ｚ［０］＆０ｘＦＦとする。
・Ｙｉ−１［４］に、Ｚ［１］を右に２４ビットシフト演算した演算結果の下位８ビットを代入する。すなわち、Ｙｉ−１［４］＝（Ｚ［１］＞＞２４）＆０ｘＦＦとする。
・・・
・Ｙｉ−１［１４］に、Ｚ［３］を右に８ビットシフト演算した演算結果の下位８ビットを代入する。すなわち、Ｙｉ−１［１４］＝（Ｚ［３］＞＞８）＆０ｘＦＦとする。
・Ｙｉ−１［１５］に、Ｚ［３］の下位８ビットを代入する。すなわち、Ｙｉ−１［１５］＝Ｚ［３］＆０ｘＦＦとする。
【０１３０】
以上にように本実施形態に係る情報処理装置１０は、ＧＨＡＳＨ関数の演算処理において符号なし３２ビットの配列Ｖ［４］及び配列Ｚ［４］を用いて処理を行う。これにより、配列Ｖ［４］のシフト演算の処理回数などを第４の実施形態よりも減少させることができる。したがって、第５の実施形態に係る情報処理装置１０が行うＧＨＡＳＨ関数の演算時間を第４の実施形態よりも高速化させることができる。
【０１３１】
また、配列Ｖ［４］を符号なし３２ビットとすることで、情報処理装置１０のＭＰＵ１６が例えば３２ビットのＭＰＵである場合は、ＧＨＡＳＨ関数の演算時間をさらに高速化させることができる。
【０１３２】
なお、本実施形態において、分割部１２０は、分割手段の一例である。ハッシュ演算部１３０は、ハッシュ演算手段の一例である。認証タグ生成部１４０は、認証タグ生成手段の一例である。
【０１３３】
本発明は、具体的に開示された上記の実施形態に限定されるものではなく、特許請求の範囲から逸脱することなく、上記の各実施形態を組み合わせたり、種々の変形や変更が可能である。
【０１３４】
本願は、日本国に２０１４年４月１０日に出願された基礎出願２０１４−０８１３３８号に基づくものであり、その全内容はここに参照をもって援用される。
【符号の説明】
【０１３５】
１０    情報処理装置
１１      ＭＰＵ
１２      ＲＡＭ
１３      ＲＯＭ
１４      外部Ｉ／Ｆ
１１０    暗号化部
１２０    分割部
１３０    ハッシュ演算部
１４０    認証タグ生成部
１０００  認証対象メッセージ
２０００  変換テーブル
Ｂ        バス
【図１】
0006044738.tif 000006
【図２】
0006044738.tif 000007
【図３】
0006044738.tif 000008
【図４】
0006044738.tif 000009
【図５】
0006044738.tif 000010
【図６】
0006044738.tif 000011
【図７】
0006044738.tif 000012
【図８】
0006044738.tif 000013
【図９】
0006044738.tif 000014
【図１０】
0006044738.tif 000015
【図１１】
0006044738.tif 000016
【図１２】
0006044738.tif 000017
【図１３】
0006044738.tif 000018
【図１４】
0006044738.tif 000019
【図１５】
0006044738.tif 000020
【図１６】
0006044738.tif 000021
【図１７】
0006044738.tif 000022