(57)【要約】【課題】付加情報等の計算のための計算量の増加を回避しつつ、故障利用解析に対して安全な鍵スケジュール演算を実行する鍵スケジュール装置を提供すること。【解決手段】複数のラウンドそれぞれに対応する複数のラウンド鍵を記憶する第１記憶部３２０と、予め定められた処理サイクルごとに、第１記憶部３２０に記憶された複数のラウンド鍵と、複数のラウンド鍵のうち少なくとも１つのラウンド鍵の一部と、のいずれかを表す更新対象鍵を取得し、取得した更新対象鍵に基づいて、取得した更新対象鍵のラウンドの次のラウンドのラウンド鍵を算出する演算部３１１と、処理サイクルごとに、算出されたラウンド鍵で、第１記憶部３２０の更新対象鍵を更新する更新部３１２と、を備えた。【選択図】        図１
2010057066.tif 000002
【特許請求の範囲】
【請求項１】
ブロック暗号方式の各ラウンドで利用するラウンド鍵をスケジュールする鍵スケジュール装置であって、
複数のラウンドそれぞれに対応する複数のラウンド鍵を記憶する第１記憶部と、
予め定められた処理サイクルごとに、前記第１記憶部に記憶された複数のラウンド鍵と、複数のラウンド鍵のうち少なくとも１つのラウンド鍵の一部と、のいずれかを表す更新対象鍵を取得し、取得した前記更新対象鍵に基づいて、取得した前記更新対象鍵のラウンドの次のラウンドのラウンド鍵を算出する演算部と、
前記処理サイクルごとに、算出されたラウンド鍵で、前記第１記憶部の前記更新対象鍵を更新する更新部と、
を備えたことを特徴とする鍵スケジュール装置。
【請求項２】
前記第１記憶部は、ラウンド鍵を構成する要素のうち第１要素と、前記第１要素のラウンドより後のラウンドのラウンド鍵の要素であって、前記第１要素以外の要素に対応する第２要素とを記憶し、
前記演算部は、前記処理サイクルごとに、前記第１要素と前記第２要素とを前記更新対象鍵として取得し、取得した前記第１要素から前記第１要素のラウンドの次のラウンドのラウンド鍵の前記第１要素に対応する要素を算出し、取得した前記第２要素から前記第２要素のラウンドの次のラウンドのラウンド鍵の前記第２要素に対応する要素を算出し、
前記更新部は、算出された前記第１要素に対応する要素で、前記第１記憶部の前記第１要素を更新し、算出された前記第２要素に対応する要素で、前記第１記憶部の前記第２要素を更新すること、
を特徴とする請求項１に記載の鍵スケジュール装置。
【請求項３】
前記第１記憶部は、さらに、入力された秘密鍵をラウンド鍵の初期値として記憶し、
前記演算部は、さらに、最初の前記処理サイクルで、ラウンド鍵の初期値の前記第１要素を前記更新対象鍵として取得し、取得した前記第１要素から最初のラウンドのラウンド鍵の前記第１要素に対応する要素を算出し、
前記更新部は、さらに、ラウンド鍵の初期値の前記第１要素に対して算出された要素で、前記第１記憶部のラウンド鍵の初期値の前記第１要素を更新すること、
を特徴とする請求項２に記載の鍵スケジュール装置。
【請求項４】
前記演算部は、任意のラウンドのラウンド鍵を構成する複数の要素のそれぞれを、複数の前記処理サイクルのいずれかで前記更新対象鍵として取得し、取得した要素に基づいて、取得した要素のラウンドの次のラウンドのラウンド鍵の要素のうち、取得した要素に対応する要素を算出すること、
を特徴とする請求項１に記載の鍵スケジュール装置。
【請求項５】
前記第１記憶部は、ラウンド鍵を構成する要素のうち第１要素と、前記第１要素のラウンドより後のラウンドのラウンド鍵の要素であって、前記第１要素以外の要素に対応する第２要素とを記憶し、
前記第１要素を含むラウンド鍵を構成する要素のうち、前記第２要素に対応する要素を記憶する第２記憶部と、
前記第１記憶部に記憶された前記第１要素と、前記第２記憶部に記憶された前記第２要素に対応する要素と、を出力する出力部と、をさらに備えたこと、
を特徴とする請求項１に記載の鍵スケジュール装置。
【請求項６】
前記演算部は、前記更新対象鍵のラウンドに応じて予め定められたラウンド定数を用いてラウンド鍵を算出すること、
を特徴とする請求項１に記載の鍵スケジュール装置。
【請求項７】
ブロック暗号方式の各ラウンドで利用するラウンド鍵をスケジュールする鍵スケジュール装置であって、
ラウンド鍵を記憶する第１記憶部と、
予め定められた処理サイクルごとに、前記第１記憶部に記憶されたラウンド鍵を取得し、取得したラウンド鍵に基づいて、取得したラウンド鍵のラウンドの１つ後のラウンドのラウンド鍵と、２つ後のラウンドのラウンド鍵とを算出する演算部と、
前記処理サイクルごとに、算出された２つ後のラウンドのラウンド鍵で、前記第１記憶部のラウンド鍵を更新する更新部と、
を備えたことを特徴とする鍵スケジュール装置。
【請求項８】
ブロック暗号方式の各ラウンドで利用するラウンド鍵をスケジュールする鍵スケジュール方法あって、
演算部が、予め定められた処理サイクルごとに、第１記憶部に記憶された複数のラウンドそれぞれに対応する複数のラウンド鍵と、複数のラウンド鍵のうち少なくとも１つのラウンド鍵の一部と、のいずれかを表す更新対象鍵を取得し、取得した前記更新対象鍵に基づいて、取得した前記更新対象鍵のラウンドの次のラウンドのラウンド鍵を算出する演算ステップと、
更新部が、前記処理サイクルごとに、算出されたラウンド鍵で、前記第１記憶部の前記更新対象鍵を更新する更新ステップと、
を備えたことを特徴とする鍵スケジュール方法。
【請求項９】
ブロック暗号方式の各ラウンドで利用するラウンド鍵をスケジュールする鍵スケジュール装置で実行される鍵スケジュールプログラムであって、
前記鍵スケジュール装置を、
予め定められた処理サイクルごとに、第１記憶部に記憶された複数のラウンドそれぞれに対応する複数のラウンド鍵と、複数のラウンド鍵のうち少なくとも１つのラウンド鍵の一部と、のいずれかを表す更新対象鍵を取得し、取得した前記更新対象鍵に基づいて、取得した前記更新対象鍵のラウンドの次のラウンドのラウンド鍵を算出する演算部と、
前記処理サイクルごとに、算出されたラウンド鍵で、前記第１記憶部の前記更新対象鍵を更新する更新部と、
として機能させるための鍵スケジュールプログラム。
【請求項１０】
ブロック暗号方式の各ラウンドで利用するラウンド鍵をスケジュールする鍵スケジュール方法であって、
演算部が、予め定められた処理サイクルごとに、第１記憶部に記憶されたラウンド鍵を取得し、取得したラウンド鍵に基づいて、取得したラウンド鍵のラウンドの１つ後のラウンドのラウンド鍵と、２つ後のラウンドのラウンド鍵とを算出する演算ステップと、
更新部が、前記処理サイクルごとに、算出された２つ後のラウンドのラウンド鍵で、前記第１記憶部のラウンド鍵を更新する更新ステップと、
を備えたことを特徴とする鍵スケジュール方法。
【請求項１１】
ブロック暗号方式の各ラウンドで利用するラウンド鍵をスケジュールする鍵スケジュール装置で実行される鍵スケジュールプログラムであって、
前記鍵スケジュール装置を、
予め定められた処理サイクルごとに、第１記憶部に記憶されたラウンド鍵を取得し、取得したラウンド鍵に基づいて、取得したラウンド鍵のラウンドの１つ後のラウンドのラウンド鍵と、２つ後のラウンドのラウンド鍵とを算出する演算部と、
前記処理サイクルごとに、算出された２つ後のラウンドのラウンド鍵で、前記第１記憶部のラウンド鍵を更新する更新部と、
として機能させるための鍵スケジュールプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、故障利用解析に対して安全な、共通鍵暗号方式の鍵スケジュールを実行する装置、方法およびプログラムに関する。
【背景技術】
【０００２】
通信内容の秘匿などを目的として広範に用いられている秘密鍵ブロック暗号方式として、ＡＥＳ（Advanced Encryption Standard）が知られている。
【０００３】
近年、１２８ビットの秘密鍵を用いるＡＥＳに対して、９ラウンド目で使用するラウンド鍵の計算時に計算誤りを生じさせることで、ラウンド鍵の算出の元となる秘密鍵を導出する故障利用解析が報告されている（例えば、非特許文献１参照）。
【０００４】
故障利用解析に対する対策としては、（ｉ）予め計算したラウンド鍵を記憶して使用することで計算誤りが混入する恐れをなくす、（ｉｉ）パリティ情報などの付加情報を利用して計算誤りを検出または訂正する、（ｉｉｉ）同一の計算を複数回実行して計算結果を比較することで計算誤りを検出する、などが知られている（例えば、非特許文献２参照）。
【０００５】
【非特許文献１】Ｊ．Ｔａｋａｈａｓｈｉ，Ｔ．Ｆｕｋｕｎａｇａ，Ｋ．Ｙａｍａｋｏｓｈｉ，“ＤＦＡ，Ｍｅｃｈａｎｉｓｍ ｏｎ ｔｈｅ ＡＥＳ Ｋｅｙ Ｓｃｈｅｄｕｌｅ”，Ｆａｕｌｔ Ｄｉａｇｎｏｓｉｓ ａｎｄ Ｔｏｌｅｒａｎｃｅ ｉｎ Ｃｒｙｐｔｏｇｒａｐｈｙ，ｐｐ．６２−７５，ＩＥＥＥ Ｃｏｍｐｕｔｅｒ Ｓｏｃｉｅｔｙ，２００７．
【非特許文献２】Ｃ．−Ｎ．Ｃｈｅｎ，Ｓ．−Ｍ．Ｙｅｎ，“Ｄｉｆｆｅｒｅｎｔｉａｌ Ｆａｕｌｔ Ａｎａｌｙｓｉｓ ｏｎ ＡＥＳ Ｋｅｙ Ｓｃｈｅｄｕｌｅ ａｎｄ Ｓｏｍｅ Ｃｏｕｎｔｅｒｍｅａｓｕｒｅｓ”，Ｉｎｆｏｒｍａｔｉｏｎ Ｓｅｃｕｒｉｔｙ ａｎｄ Ｐｒｉｖａｃｙ，８ｔｈ Ａｕｓｔｒａｌａｓｉａｎ Ｃｏｎｆｅｒｅｎｃｅ，ＡＣＩＳＰ ２００３，ｐｐ．１１８−１２９，Ｌｅｃｔｕｒｅ Ｎｏｔｅｓ ｉｎ Ｃｏｍｐｕｔｅｒ Ｓｃｉｅｎｃｅ ２７２７，Ｓｐｒｉｎｇｅｒ−Ｖｅｒｌａｇ．
【発明の開示】
【発明が解決しようとする課題】
【０００６】
しかしながら、（ｉ）の対策を用いる場合には、予め計算した鍵を記憶する安全な記憶領域が必要となる。さらに、秘密鍵が更新される場合には、ラウンド鍵を誤りなく計算して記憶しなおさなければならない。（ｉｉ）の対策を用いる場合には、付加情報を計算するための計算量および検証のための計算量が増加するという問題があった。（ｉｉｉ）の対策を用いる場合には、同一の回路を利用して計算を複数回実行するときには計算時間が増加するという問題や、複数の計算結果を比較するための演算等が必要になるため計算量が増加するという問題があった。なお、（ｉｉｉ）の対策を用いて、複数の回路を利用して複数回の計算を並行して実行すれば、計算時間や計算量の増加を抑止しうるが、回路規模が増加するという別の問題が生じる。
【０００７】
本発明は、上記に鑑みてなされたものであって、付加情報等の計算のための計算量の増加を回避しつつ、故障利用解析に対して安全な鍵スケジュール演算を実行することができる装置、方法およびプログラムを提供することを目的とする。
【課題を解決するための手段】
【０００８】
上述した課題を解決し、目的を達成するために、本発明は、ブロック暗号方式の各ラウンドで利用するラウンド鍵をスケジュールする鍵スケジュール装置であって、複数のラウンドそれぞれに対応する複数のラウンド鍵を記憶する第１記憶部と、予め定められた処理サイクルごとに、前記第１記憶部に記憶された複数のラウンド鍵と、複数のラウンド鍵のうち少なくとも１つのラウンド鍵の一部と、のいずれかを表す更新対象鍵を取得し、取得した前記更新対象鍵に基づいて、取得した前記更新対象鍵のラウンドの次のラウンドのラウンド鍵を算出する演算部と、前記処理サイクルごとに、算出されたラウンド鍵で、前記第１記憶部の前記更新対象鍵を更新する更新部と、を備えたことを特徴とする。
【０００９】
また、本発明は、ブロック暗号方式の各ラウンドで利用するラウンド鍵をスケジュールする鍵スケジュール装置であって、ラウンド鍵を記憶する第１記憶部と、予め定められた処理サイクルごとに、前記第１記憶部に記憶されたラウンド鍵を取得し、取得したラウンド鍵に基づいて、取得したラウンド鍵のラウンドの１つ後のラウンドのラウンド鍵と、２つ後のラウンドのラウンド鍵とを算出する演算部と、前記処理サイクルごとに、算出された２つ後のラウンドのラウンド鍵で、前記第１記憶部のラウンド鍵を更新する更新部と、を備えたことを特徴とする。
【００１０】
また、本発明は、上記装置を実行することができる方法およびプログラムである。
【発明の効果】
【００１１】
本発明によれば、計算量の増加を回避しつつ、故障利用解析に対して安全な鍵スケジュール演算を実行することができるという効果を奏する。
【発明を実施するための最良の形態】
【００１２】
以下に添付図面を参照して、この発明にかかる装置、方法およびプログラムの最良な実施の形態を詳細に説明する。
【００１３】
（第１の実施の形態）
ブロック暗号方式で暗号化処理を行う際に用いる鍵スケジュール装置に、本発明を適用した例を説明する。ここで、ブロック暗号方式とは、方式ごとに定められたビット長ごとに、暗号処理の対象となる平文をブロック分割して、分割されたブロックごとに暗号化処理を行う方式である。ブロック暗号方式は、ラウンドとよばれる単位の処理を繰り返し行い、平文のブロックから暗号文のブロックを計算する。各ラウンドは、前のラウンドが出力するデータブロック（最初のラウンドでは平文ブロック）と、予め保持している鍵データから鍵スケジュール装置において計算されるラウンド鍵とを入力として、次のラウンドが利用するデータブロック（最後のラウンドでは暗号文ブロック）を出力する。
【００１４】
以下では、１２８ビットの秘密鍵を用いるＡＥＳの鍵スケジュール装置として実現した場合の例を説明するが、適用可能な秘密鍵は１２８ビットに限られるものではない。１２８ビットの秘密鍵を用いるＡＥＳでは、平文のブロックは１２８ビットであり、ラウンド数は１０である。
【００１５】
第１の実施の形態にかかる鍵スケジュール装置は、ＡＥＳによる暗号化処理の各ラウンドで利用するラウンド鍵を算出するときに、所定の処理サイクルの１サイクルで複数のラウンドのラウンド鍵を算出する。ここで、所定の処理サイクルとは、１ラウンド分の処理を行う単位をあらわす。例えば、１クロックごとに１ラウンド分の処理を行うハードウェアを構成する場合には処理サイクルは１クロックであり、２クロックごとに１ラウンド分の処理を行うハードウェア構成をする場合には処理サイクルは２クロックである。これにより、上記のような故障利用解析によって９ラウンド目のラウンド鍵の計算を誤らせたとしても、その前後の８ラウンド目または１０ラウンド目のラウンド鍵にも計算誤りが生じうることにより、秘密鍵の導出が困難となる。
【００１６】
図１は、第１の実施の形態にかかる鍵スケジュール装置１００の構成を示すブロック図である。図１に示すように、鍵スケジュール装置１００は、スケジュール部３１０と、第１記憶部３２０と、第２記憶部３３０とを備えている。また、鍵スケジュール装置１００は、鍵スケジュール装置１００で算出されたラウンド鍵を用いてデータを暗号化する暗号化装置２００と接続されている。
【００１７】
鍵スケジュール装置１００および暗号化装置２００は、例えば、ＡＥＳにしたがってデータを暗号化する回路であるＡＥＳ暗号化回路に含まれる鍵スケジュール回路、および、データ暗号化回路として実現することができる。
【００１８】
第１記憶部３２０は、複数のラウンドに対応する複数のラウンド鍵を記憶するレジスタである。第１記憶部３２０は、１２８ビット（１６バイト）のラウンド鍵を４バイトごとに記憶する４つのレジスタ３２０ａ〜３２０ｄから構成される。
【００１９】
レジスタ３２０ａ〜３２０ｄには、後述する更新部３１２によって互いに異なるラウンドのラウンド鍵が記憶される。具体的には、レジスタ３２０ａおよび３２０ｂは、レジスタ３２０ｃおよび３２０ｄより１つ進んだラウンドのラウンド鍵が記憶される。
【００２０】
第２記憶部３３０は、レジスタ３２０ａおよび３２０ｂに記憶されているラウンド鍵の１つ前のラウンドの対応するラウンド鍵を記憶するレジスタである。第２記憶部３３０は、レジスタ３２０ａおよび３２０ｂにそれぞれ対応するラウンド鍵を記憶するレジスタ３３０ａおよび３３０ｂから構成される。
【００２１】
レジスタ３３０ａおよび３３０ｂを備えることにより、鍵スケジュール装置１００の出力がラウンドごとに揃うように調節することができる。すなわち、レジスタ３３０ａおよび３３０ｂは、後述する出力部３１３が、暗号化装置２００に同一のラウンドのラウンド鍵の全部を出力するときに参照される。
【００２２】
スケジュール部３１０は、第１記憶部３２０に記憶された複数のラウンドのラウンド鍵を参照して、次のラウンドのラウンド鍵を順次算出する鍵スケジュール演算処理を実行する。スケジュール部３１０は、詳細な構成として、演算部３１１と、更新部３１２と、出力部３１３とを備えている。
【００２３】
演算部３１１は、所定の処理サイクルで、第１記憶部３２０に記憶されたラウンド鍵の次のラウンドのラウンド鍵を算出する。例えば、鍵スケジュール装置１００をハードウェア回路で実現する場合、演算部３１１は、同期を取るためのクロック信号の周期（クロック周期）を所定の処理サイクルとすることができる。また、例えば、第５の実施の形態（後述）のように、鍵スケジュール装置１００の処理をプログラムにより実現する場合、演算部３１１は、当該プログラムで定められた所定の処理（ステップ）を実行する周期を所定の処理サイクルとすることができる。
【００２４】
演算部３１１は、各処理サイクルで、第１記憶部３２０に記憶されたラウンド鍵のうち、更新する対象となるラウンド鍵を表す更新対象鍵を取得し、更新対象鍵に対する次のラウンドのラウンド鍵を算出する。本実施の形態では、演算部３１１は、第１記憶部３２０に記憶された複数のラウンドのラウンド鍵それぞれを更新対象鍵としてラウンド鍵を算出する。
【００２５】
更新部３１２は、算出されたラウンド鍵で、第１記憶部３２０に記憶された更新対象鍵を更新する。
【００２６】
出力部３１３は、第１記憶部３２０のレジスタ３２０ｃおよび３２０ｄに記憶されたラウンド鍵と、第２記憶部３３０のレジスタ３３０ａおよび３３０ｂに記憶されたラウンド鍵とを、暗号化装置２００に出力する。これにより、暗号化装置２００は、同一のラウンドのラウンド鍵を同時に取得することができる。なお、暗号化装置２００が、ラウンド鍵が計算されるタイミングの相違を調整するように構成してもよい。この場合は、レジスタ３３０ａおよび３３０ｂは不要となる。
【００２７】
次に、鍵スケジュール装置１００を実現する回路例について図２を用いて説明する。図２は、第１の実施の形態の鍵スケジュール装置１００の一例を示す回路図である。
【００２８】
同図に示すように、鍵スケジュール装置１００は、上述のレジスタ３２０ａ〜３２０ｄと、レジスタ３３０ａおよび３３０ｂとの他に、排他的論理和回路３０２ａ〜３０２ｄと、選択器３０３ａ〜３０３ｅと、ＲｏｔＷｏｒｄ演算部３０４と、ＳｕｂＢｙｔｅ演算部３０５と、ＡｄｄＲｃｏｎ演算部３０６とを含んでいる。
【００２９】
なお、同図では、Ｒｉ（ｉ＝０〜１５）は、レジスタ３２０ａ〜３２０ｄに記憶される４バイトのデータを４分割した１バイト（８ビット）のデータを表すものとする。
【００３０】
排他的論理和回路３０２ａ〜３０２ｄは、ビットごとの排他的論理和を計算する。
【００３１】
選択器３０３ａ〜３０３ｄは、鍵スケジュール装置１００への入力と、排他的論理和回路３０２ａ〜３０２ｄの出力とを、クロック信号に応じて選択して出力する。鍵スケジュール装置１００への入力とは、ラウンド鍵の演算に用いる鍵として入力される、ラウンド鍵の初期状態（初期値）である秘密鍵を意味する。また、同図に示すように、本実施の形態では、１２８ビット（１６バイト）の秘密鍵を４バイトずつ分割したデータが、選択器３０３ａ〜３０３ｄにそれぞれ入力される。
【００３２】
選択器３０３ｅは、クロック信号に応じて、レジスタ３２０ｄが保持する値、または排他的論理和回路３０２ｄが出力する値のいずれかを選択して出力する回路である。
【００３３】
選択器３０３ａ〜３０３ｅは、事前に設定された情報または外部から指示された命令等にしたがって、いずれの値を選択するかを決定する。選択器３０３ａ〜３０３ｅによるクロックごとの選択方法の詳細については後述する。
【００３４】
ＲｏｔＷｏｒｄ演算部３０４は、４バイトのデータ「ｋｉ，１２ｋｉ，１３ｋｉ，１４ｋｉ，１５」を入力として、バイトの順番を入れ替えたデータ「ｋｉ，１３ｋｉ，１４ｋｉ，１５ｋｉ，１２」を出力する。なお、記号「ｋｉ，ｊ」は、ｉラウンド目のラウンド鍵の（ｊ＋１）バイト目のデータを表す。そして、例えばデータ「ｋｉ，１２ｋｉ，１３ｋｉ，１４ｋｉ，１５」は、各１バイトのデータである「ｋｉ，１２」、「ｋｉ，１３」、「ｋｉ，１４」、および「ｋｉ，１５」をこの順序で連結した４バイトのデータを表す。
【００３５】
ＳｕｂＢｙｔｅ演算部３０５は、４バイトのデータを入力として、入力された４バイトの各バイトにＡＥＳの仕様で定められた非線形演算を施して出力する。
【００３６】
ＡｄｄＲＣｏｎ演算部３０６は、４バイトのデータを入力として、ＡＥＳの仕様でラウンドごとに定められたラウンド定数を入力された４バイトに加算（排他的論理和演算）して出力する。
【００３７】
上述のように、本実施の形態では、レジスタ３２０ａおよび３２０ｂに保持されるラウンド鍵は、レジスタ３２０ｃおよび３２０ｄに保持されるラウンド鍵よりも１ラウンド分進んだラウンド鍵となる。
【００３８】
次に、このように構成された鍵スケジュール装置１００による鍵スケジュール演算処理について説明する。図３は、第１の実施の形態における鍵スケジュール演算処理の各クロックで出力されるデータの一例を示す図である。
【００３９】
以下に、最初のクロックである時刻Ｃ０から、１０ラウンド目のラウンド鍵を算出するクロックである時刻Ｃ１１までの各クロックでの処理の詳細について説明する。
【００４０】
（時刻Ｃ０）選択器３０３ａから３０３ｄは、それぞれ鍵スケジュール装置１００の入力として受け付けた４バイトの鍵「ｋ０，０ｋ０，１ｋ０，２ｋ０，３」、「ｋ０，４ｋ０，５ｋ０，６ｋ０，７」、「ｋ０，８ｋ０，９ｋ０，１０ｋ０，１１」、および「ｋ０，１２ｋ０，１３ｋ０，１４ｋ０，１５」を選択する。レジスタ３２０ａから３２０ｄは、クロック周期の終わりに、図３のＣ０に対応する行に示すような値をそれぞれ保持する。
【００４１】
（時刻Ｃ１）レジスタ３２０ａから３２０ｄは保持している値を出力する。選択器３０３ａと３０３ｂは、排他的論理和回路３０２ａと３０２ｂの出力を選択して出力する。このように、ラウンド鍵を算出する最初のクロックでは、入力された鍵の先頭８バイトに相当する要素のみが選択され、後述するようにこの先頭８バイトのみが次のラウンド鍵に更新される。すなわち、この場合は、先頭８バイトに相当する要素が更新対象鍵となる。
【００４２】
選択器３０３ｃと３０３ｄは、鍵スケジュール装置１００の入力として受け付けた４バイトの鍵「ｋ０，８ｋ０，９ｋ０，１０ｋ０，１１」および「ｋ０，１２ｋ０，１３ｋ０，１４ｋ０，１５」をそれぞれ選択する。
【００４３】
選択器３０３ｅは、レジスタ３２０ｄが保持する値を選択して出力する。このとき、レジスタ３２０ｄに保持される「ｋ０，１２ｋ０，１３ｋ０，１４ｋ０，１５」は、ＲｏｔＷｏｒｄ演算部３０４、ＳｕｂＢｙｔｅ演算部３０５、およびＡｄｄＲＣｏｎ演算部３０６で変換されて排他的論理和回路３０２ａに送られ、レジスタ３２０ａに保持される「ｋ０，０ｋ０，１ｋ０，２ｋ０，３」を「ｋ１，０ｋ１，１ｋ１，２ｋ１，３」に更新する。更新された「ｋ１，０ｋ１，１ｋ１，２ｋ１，３」は、排他的論理和回路３０２ｂに送られ、レジスタ３２０ｂに保持される「ｋ０，４ｋ０，５ｋ０，６ｋ０，７」を「ｋ１，４ｋ１，５ｋ１，６ｋ１，７」に更新する。
【００４４】
一方、レジスタ３２０ｃと３２０ｄに保持される「ｋ０，８ｋ０，９ｋ０，１０ｋ０，１１」と「ｋ０，１２ｋ０，１３ｋ０，１４ｋ０，１５」は同一の値に更新される。すなわち、これらのレジスタに保持されるデータの値は変化しない。更新された値は、クロック周期の終わりに、図３に示すようにレジスタ３２０ａから３２０ｄに保持される。レジスタ３３０ａと３３０ｂは、レジスタ３２０ａと３２０ｂと同一の値が保持される。
【００４５】
（時刻Ｃ２）レジスタ３２０ａから３２０ｄおよびレジスタ３３０ａから３３０ｂは、保持している値を出力する。選択器３０３ａから３０３ｄは、排他的論理和回路３０２ａから３０２ｄの出力を選択して出力する。選択器３０３ｅは、排他的論理和回路３０２ｄが出力する値を選択して出力する。レジスタ３２０ｂに保持される「ｋ１，４ｋ１，５ｋ１，６ｋ１，７」は、排他的論理和回路３０２ｃに送られ、レジスタ３２０ｃに保持される「ｋ０，８ｋ０，９ｋ０，１０ｋ０，１１」を「ｋ１，８ｋ１，９ｋ１，１０ｋ１，１１」に更新する。更新された「ｋ１，８ｋ１，９ｋ１，１０ｋ１，１１」は、排他的論理和回路３０２ｄに送られ、レジスタ３２０ｄに保持される「ｋ０，１２ｋ０，１３ｋ０，１４ｋ０，１５」を「ｋ１，１２ｋ１，１３ｋ１，１４ｋ１，１５」に更新する。更新された「ｋ１，１２ｋ１，１３ｋ１，１４ｋ１，１５」は、ＲｏｔＷｏｒｄ演算部３０４、ＳｕｂＢｙｔｅ演算部３０５、およびＡｄｄＲＣｏｎ演算部３０６で変換されて排他的論理和回路３０２ａに送られ、レジスタ３２０ａに保持される「ｋ１，０ｋ１，１ｋ１，２ｋ１，３」を「ｋ２，０ｋ２，１ｋ２，２ｋ２，３」に更新する。
【００４６】
更新された「ｋ２，０ｋ２，１ｋ２，２ｋ２，３」は、排他的論理和回路３０２ｂに送られ、レジスタ３２０ｂに保持される「ｋ１，４ｋ１，５ｋ１，６ｋ１，７」を「ｋ２，４ｋ２，５ｋ２，６ｋ２，７」に更新する。レジスタ３３０ａと３３０ｂに保持される値「ｋ１，０ｋ１，１ｋ１，２ｋ１，３」と「ｋ１，４ｋ１，５ｋ１，６ｋ１，７」、および、排他的論理和回路３０２ｃと３０２ｄの出力「ｋ１，８ｋ１，９ｋ１，１０ｋ１，１１」と「ｋ１，１２ｋ１，１３ｋ１，１４ｋ１，１５」は、１ラウンド目のラウンド鍵として鍵スケジュール装置１００から出力される。更新された値は、クロック周期の終わりに、図３に示すようにレジスタ３２０ａから３２０ｄに保持される。レジスタ３３０ａと３３０ｂは、レジスタ３２０ａと３２０ｂと同一の値が保持される。
【００４７】
時刻Ｃ１０まで同様の処理が繰り返され、９ラウンド目のラウンド鍵「ｋ９，０ｋ９，１ｋ９，２ｋ９，３」、「ｋ９，４ｋ９，５ｋ９，６ｋ９，７」、「ｋ９，８ｋ９，９ｋ９，１０ｋ９，１１」、および「ｋ９，１２ｋ９，１３ｋ９，１４ｋ９，１５」が出力され、図３に示すようにレジスタ３２０ａ（および３３０ａ）、レジスタ３２０ｂ（および３３０ｂ）、レジスタ３２０ｃ、およびレジスタ３２０ｄに、それぞれ「ｋ１０，０ｋ１０，１ｋ１０，２ｋ１０，３」、「ｋ１０，４ｋ１０，５ｋ１０，６ｋ１０，７」、「ｋ９，８ｋ９，９ｋ９，１０ｋ９，１１」、および「ｋ９，１２ｋ９，１３ｋ９，１４ｋ９，１５」が保持される。
【００４８】
（時刻Ｃ１１）レジスタ３２０ａから３２０ｄおよびレジスタ３３０ａから３３０ｂは、保持している値を出力する。選択器３０３ａから３０３ｄは、排他的論理和回路３０２ａから３０２ｄの出力を選択して出力する。選択器３０３ｅは、排他的論理和回路３０２ｄが出力する値を選択して出力する。レジスタ３２０ｂに保持される「ｋ１０，４ｋ１０，５ｋ１０，６ｋ１０，７」は、排他的論理和回路３０２ｃに送られ、レジスタ３２０ｃに保持される「ｋ９，８ｋ９，９ｋ９，１０ｋ９，１１」を「ｋ１０，８ｋ１０，９ｋ１０，１０ｋ１０，１１」に更新する。
【００４９】
更新された「ｋ１０，８ｋ１０，９ｋ１０，１０ｋ１０，１１」は、排他的論理和回路３０２ｄに送られ、レジスタ３２０ｄに保持される「ｋ９，１２ｋ９，１３ｋ９，１４ｋ９，１５」を「ｋ１０，１２ｋ１０，１３ｋ１０，１４ｋ１０，１５」に更新する。レジスタ３３０ａと３３０ｂに保持される「ｋ１０，０ｋ１０，１ｋ１０，２ｋ１０，３」と「ｋ１０，４ｋ１０，５ｋ１０，６ｋ１０，７」、および、更新された「ｋ１０，８ｋ１０，９ｋ１０，１０ｋ１０，１１」と「ｋ１０，１２ｋ１０，１３ｋ１０，１４ｋ１０，１５」は、１０ラウンド目のラウンド鍵として鍵スケジュール装置１００から出力される。レジスタ３２０ａおよび３２０ｂに保持される値は、更新された「ｋ１０，１２ｋ１０，１３ｋ１０，１４ｋ１０，１５」に基づいて、実際には使用されない値に更新されて保持される。例えば、上記と同様の処理により、１１ラウンド目に相当する値に更新されて保持される。図３では、使用されないことを示すために、この値を記号「---」で表している。
【００５０】
このようにして鍵スケジュール演算処理を実行することにより、非特許文献１などで開示されている故障利用解析で秘密鍵を導出することが困難となる。すなわち、９ラウンド目のラウンド鍵に計算誤りを生じさせるためには、時刻Ｃ９またはＣ１０で計算を誤らせる必要がある。しかし、このとき８ラウンド目のラウンド鍵の一部である「ｋ８，８ｋ８，９ｋ８，１０ｋ８，１１ｋ８，１２ｋ８，１３ｋ８，１４ｋ８，１５」、または、１０ラウンド目のラウンド鍵の一部である「ｋ１０，０ｋ１０，１ｋ１０，２ｋ１０，３ｋ１０，４ｋ１０，５ｋ１０，６ｋ１０，７」にも計算誤りが生じる可能性があるため、故障利用解析により秘密鍵を求めることが困難となる。
【００５１】
また、上記非特許文献２のように、付加情報の計算や、計算結果の比較などのような、ラウンド鍵以外の情報のための計算が不要であるため、計算量の増大を抑止することができる。また、１１クロック（時刻Ｃ１１）で１０ラウンド目までのラウンド鍵が算出できるため、１０クロックで１０ラウンド目までのラウンド鍵を算出する従来の方法と比較したラウンド鍵を計算するための計算量の増加も最小限にすることができる。
【００５２】
これまでは、レジスタ３２０ａおよび３２０ｂが、レジスタ３２０ｃおよび３２０ｄよりも１ラウンド分進んだラウンド鍵を保持するような鍵スケジュール装置について説明した。同様の手法により、レジスタ３２０ａが、レジスタ３２０ｂ、３２０ｃ、および３２０ｄよりも１ラウンド分進んだラウンド鍵を保持するような鍵スケジュール装置、または、レジスタ３２０ａ、３２０ｂ、および３２０ｃが、レジスタ３２０ｄよりも１ラウンド分進んだラウンド鍵を保持する鍵スケジュール装置の構成が可能である。
【００５３】
このように、第１の実施の形態にかかる鍵スケジュール装置では、ＡＥＳによる暗号化処理の各ラウンドで利用するラウンド鍵を算出するときに、１クロックで複数のラウンドのラウンド鍵を算出するように鍵スケジュール演算処理を実行することができる。このため、付加情報等の計算のための計算量の増加を回避しつつ、故障利用解析に対して安全な鍵スケジュール演算を実行することができる。
【００５４】
（第２の実施の形態）
第１の実施の形態にかかる鍵スケジュール装置では、１６バイトのラウンド鍵を４バイト単位で分割し、先頭の８バイトが、末尾の８バイトより１ラウンド進むようにラウンド鍵を算出していた。第２の実施の形態にかかる鍵スケジュール装置は、分割した４バイトをさらに１バイトごとに分割し、先頭から奇数番目のバイトが、偶数番目のバイトより１ラウンド進むようにラウンド鍵を算出する。
【００５５】
図４は、第２の実施の形態にかかる鍵スケジュール装置５００の構成を示すブロック図である。図４に示すように、鍵スケジュール装置５００は、スケジュール部５１０と、第１記憶部５２０と、第２記憶部５３０とを備えている。
【００５６】
第２の実施の形態では、上述のように１バイト単位でラウンド鍵の更新を制御するようにスケジュール部５１０と、第１記憶部５２０と、第２記憶部５３０とを構成した点が、第１の実施の形態と異なっている。以下では、第２の実施の形態の鍵スケジュール装置５００を実現する回路例である図５を用いて、鍵スケジュール装置５００の機能について説明する。図５は、第２の実施の形態の鍵スケジュール装置５００の一例を示す回路図である。
【００５７】
同図に示すように、鍵スケジュール装置５００は、第１記憶部５２０を構成するレジスタ５２０ａ〜５２０ｐと、第２記憶部５３０を構成するレジスタ５３０ａ〜５３０ｈと、レジスタ５０１ｙおよび５０１ｚと、排他的論理和回路５０２ａ〜５０２ｐと、選択器５０３ａ〜５０３ｐと、選択器５０３ｑ〜５０３ｔと、ＲｏｔＷｏｒｄ演算部３０４と、ＳｕｂＢｙｔｅ演算部３０５と、ＡｄｄＲｃｏｎ演算部５０６とを含んでいる。
【００５８】
レジスタ５２０ａから５２０ｄは、第１の実施の形態におけるレジスタ３２０ａに対応し、ラウンド鍵の先頭４バイトをバイトごとに保持するレジスタである。同様に、レジスタ５２０ｅから５２０ｈ、レジスタ５２０ｉから５２０ｌ、およびレジスタ５２０ｍから５２０ｐは、それぞれ第１の実施の形態におけるレジスタ３２０ｂ、レジスタ３２０ｃ、およびレジスタ３２０ｄに対応する。
【００５９】
レジスタ５３０ａから５３０ｈは、第１の実施の形態におけるレジスタ３３０ａと３３０ｂと同様に、鍵スケジュール装置５００の出力が、ラウンドごとに揃うように調節するために用いられる。
【００６０】
レジスタ５０１ｙと５０１ｚは、特定の時刻で計算されるラウンド鍵のラウンドに差分を生じさせるために用いられる。
【００６１】
排他的論理和回路５０２ａから５０２ｐは、第１の実施の形態における排他的論理和回路３０２ａから３０２ｄをバイトごとに分割した回路であり、２つの１バイトの入力に対して、ビットごとに排他的論理和を計算した結果を出力する。
【００６２】
選択器５０３ａから５０３ｐは、第１の実施の形態における選択器３０３ａから３０３ｄをバイトごとに分割した回路であり、排他的論理和回路５０２ａから５０２ｐの出力、または鍵スケジュール装置５００の入力のいずれかを、クロック信号に応じて選択して出力する。
【００６３】
選択器５０３ｑと５０３ｓは、レジスタ５２０ｍと５２０ｏの出力、または鍵スケジュール装置５００の入力のいずれかを、クロック信号に応じて選択して出力する回路である。
【００６４】
選択器５０３ｒと５０３ｔは、排他的論理和回路５０２ｎと５０２ｐの出力、または鍵スケジュール装置５００の入力のいずれかを、クロック信号に応じて選択して出力する回路である。
【００６５】
ＲｏｔＷｏｒｄ演算部３０４、およびＳｕｂＢｙｔｅ演算部３０５は、第１の実施の形態の鍵スケジュール装置１００の回路図である図２と同様であるため同一の符号を付し、説明は省略する。
【００６６】
ＡｄｄＲＣｏｎ演算部５０６は、ＡＥＳの仕様でラウンドごとに定められたラウンド定数を４バイトの入力に加算（排他的論理和演算）して出力する。ただし、以下に説明する第２の実施の形態では、ＡｄｄＲＣｏｎ演算部５０６に入力される４バイトの入力は異なる複数のラウンドに対応するので、対応するラウンドの定数を適切に加算するように構成する。すなわち、ＡｄｄＲＣｏｎ演算部５０６は、４バイトを構成する各バイトのラウンドを判定し、各バイトごとに、判定したラウンドに対するラウンド定数を加算する。
【００６７】
次に、このように構成された鍵スケジュール装置５００による鍵スケジュール演算処理について説明する。図６は、第２の実施の形態における鍵スケジュール演算処理の各クロックで出力されるデータの一例を示す図である。
【００６８】
以下に、最初のクロックである時刻Ｃ０から、１０ラウンド目のラウンド鍵を算出するクロックである時刻Ｃ１１までの各クロックでの処理の詳細について説明する。
【００６９】
（時刻Ｃ０）選択器５０３ａから５０３ｐ、および選択器５０３ｑと５０３ｓは、それぞれ鍵スケジュール装置５００の入力として受け付けた各バイトの鍵「ｋ０，０」、「ｋ０，１」、「ｋ０，２」、「ｋ０，３」、「ｋ０，４」、「ｋ０，５」、「ｋ０，６」、「ｋ０，７」、「ｋ０，８」、「ｋ０，９」、「ｋ０，１０」、「ｋ０，１１」、「ｋ０，１２」、「ｋ０，１３」、「ｋ０，１４」、「ｋ０，１５」、「ｋ０，１２」、「ｋ０，１４」を選択する。レジスタ５２０ａから５２０ｐ、およびレジスタ５０１ｙと５０１ｚは、クロック周期の終わりに、図６に示すようにそれぞれの値を保持する。
【００７０】
（時刻Ｃ１）レジスタ５２０ａから５２０ｐ、およびレジスタ５０１ｙと５０１ｚは保持している値を出力する。選択器５０３ａ、５０３ｃ、５０３ｅ、５０３ｇ、５０３ｉ、５０３ｋ、５０３ｍ、および５０３ｏは、それぞれ排他的論理和回路５０２ａ、５０２ｃ、５０２ｅ、５０２ｇ、５０２ｉ、５０２ｋ、５０２ｍ、および５０２ｏの出力を選択して出力する。選択器５０３ｂ、５０３ｄ、５０３ｆ、５０３ｈ、５０３ｊ、５０３ｌ、５０３ｎ、５０３ｐは、鍵スケジュール装置５００の入力として受け付けた各バイトの鍵ｋ０，１」、「ｋ０，３」、「ｋ０，５」、「ｋ０，７」、「ｋ０，９」、「ｋ０，１１」、「ｋ０，１３」、「ｋ０，１５」を選択する。選択器５０３ｑおよび５０３ｓは、それぞれレジスタ５２０ｍおよび５２０ｏが保持する値を選択して出力する。選択器５０３ｒおよび５０３ｔは、それぞれ鍵スケジュール装置５００の入力として受け付けた各バイトの鍵「ｋ０，１２」および「ｋ０，１４」を選択して出力する。
【００７１】
このとき、選択器５０３ｒと５０３ｔが出力した「ｋ０，１３」および「ｋ０，１５」は、ＲｏｔＷｏｒｄ演算部３０４、およびＳｕｂＢｙｔｅ演算部３０５で変換されたのち、ＡｄｄＲＣｏｎ演算部５０６で１ラウンド目に対応する定数が加算されて、排他的論理和回路５０２ａと５０２ｃに送られ、レジスタ５２０ａと５２０ｃに保持される「ｋ０，０」および「ｋ０，２」をそれぞれ「ｋ１，０」および「ｋ１，２」に更新する。
【００７２】
更新された「ｋ１，０」および「ｋ１，２」は、排他的論理和回路５０２ｅと５０２ｇに送られ、レジスタ５２０ｅおよび５２０ｇにそれぞれ保持される「ｋ０，４」および「ｋ０，６」をそれぞれ「ｋ１，４」および「ｋ１，６」に更新する。同様に、レジスタ５２０ｉ、５２０ｋ、５２０ｍ、および５２０ｏにそれぞれ保持される「ｋ０，８」、「ｋ０，１０」、「ｋ０，１２」、および「ｋ０，１４」は、「ｋ１，８」、「ｋ１，１０」、「ｋ１，１２」、および「ｋ１，１４」にそれぞれ更新される。
【００７３】
一方、レジスタ５２０ｂ、５２０ｄ、５２０ｆ、５２０ｈ、５２０ｊ、５２０ｌ、５２０ｎ、５２０ｏ、５０１ｙ、および５０１ｚにそれぞれ保持される「ｋ０，１」、「ｋ０，３」、「ｋ０，５」、「ｋ０，７」、「ｋ０，９」、「ｋ０，１１」、「ｋ０，１３」、「ｋ０，１５」、「ｋ０，１２」、および「ｋ０，１４」は、同一の値に更新される。
【００７４】
更新された値は、クロック周期の終わりに、図６に示すようにレジスタ５２０ａから５２０ｐ（Ｒ０〜Ｒ１５に対応）、およびレジスタ５０１ｙと５０１ｚ（Ｔ１２、Ｔ１４に対応）に保持される。
【００７５】
レジスタ５３０ａから５３０ｈは、更新された「ｋ１，０」、「ｋ１，２」、「ｋ１，４」、「ｋ１，６」、「ｋ１，８」、「ｋ１，１０」、「ｋ１，１２」、および「ｋ１，１４」を保持する。
【００７６】
（時刻Ｃ２）レジスタ５２０ａから５２０ｐ、レジスタ５０１ｙ、およびレジスタ５０１ｚは保持している値を出力する。選択器５０３ａから５０３ｐは、それぞれ排他的論理和回路５０２ａから５０２ｐの出力を選択して出力する。選択器５０３ｑおよび５０３ｓは、それぞれレジスタ５２０ｍおよび５２０ｏが出力する値を選択して出力する。選択器５０３ｒおよび５０３ｔは、それぞれ排他的論理和回路５０２ｎおよび５０２ｐの出力を選択して出力する。
【００７７】
レジスタ５０１ｙと５０１ｚに保持される「ｋ０，１２」および「ｋ０，１４」は、ＲｏｔＷｏｒｄ演算部３０４、およびＳｕｂＢｙｔｅ演算部３０５で変換されたのち、ＡｄｄＲＣｏｎ演算部５０６で１ラウンド目に対応する定数が加算されて、排他的論理和回路５０２ｄと５０２ｂに送られ、レジスタ５２０ｄおよび５２０ｂにそれぞれ保持される「ｋ０，３」および「ｋ０，１」を、それぞれ「ｋ１，３」および「ｋ１，１」に更新する。更新された「ｋ１，１」および「ｋ１，３」は、排他的論理和回路５０２ｆと５０２ｈに送られ、レジスタ５２０ｆおよび５２０ｈにそれぞれ保持される「ｋ０，５」および「ｋ０，７」をそれぞれ「ｋ１，５」および「ｋ１，７」に更新する。同様に、レジスタ５２０ｊ、５２０ｌ、５２０ｎ、および５２０ｐにそれぞれ保持される「ｋ０，９」、「ｋ０，１１」、「ｋ０，１３」、および「ｋ０，１５」は、それぞれ「ｋ１，９」、「ｋ１，１１」、「ｋ１，１３」、および「ｋ１，１５」に更新される。
【００７８】
さらに、更新された「ｋ１，１３」および「ｋ１，１５」は、それぞれ選択器５０３ｒおよび５０３ｓによって選択されて出力され、ＲｏｔＷｏｒｄ演算部３０４、およびＳｕｂＢｙｔｅ演算部３０５で変換されたのち、ＡｄｄＲＣｏｎ演算部５０６で２ラウンド目に対応する定数が加算されて、排他的論理和回路５０２ａと５０２ｃに送られる。そして、レジスタ５２０ａおよび５２０ｃにそれぞれ保持される「ｋ１，０」および「ｋ１，２」を、それぞれ「ｋ２，０」および「ｋ２，２」に更新する。更新された「ｋ２，０」および「ｋ２，２」は、排他的論理和回路５０２ｅと５０２ｇに送られ、レジスタ５２０ｅおよび５２０ｇにそれぞれ保持される「ｋ１，４」および「ｋ１，６」を、それぞれ「ｋ２，４」および「ｋ２，６」に更新する。同様に、レジスタ５２０ｉ、５２０ｋ、５２０ｍ、および５２０ｏにそれぞれ保持される「ｋ１，８」、「ｋ１，１０」、「ｋ１，１２」、および「ｋ１，１４」は、それぞれ「ｋ２，８」、「ｋ２，１０」、「ｋ２，１２」、および「ｋ２，１４」に更新される。
【００７９】
更新された「ｋ１，１」、「ｋ１，３」、「ｋ１，５」、「ｋ１，７」、「ｋ１，９」、「ｋ１，１１」、「ｋ１，１３」、および「ｋ１，１５」は、レジスタ５３０ａから５３０ｈに保持される「ｋ１，０」、「ｋ１，２」、「ｋ１，４」、「ｋ１，６」、「ｋ１，８」、「ｋ１，１０」、「ｋ１，１２」、および「ｋ１，１４」とともに１ラウンド目のラウンド鍵として出力される。
【００８０】
更新された値は、クロック周期の終わりに、図６に示すようにレジスタ５２０ａから５２０ｐおよびレジスタ５０１ｙと５０１ｚに保持される。レジスタ５３０ａから５３０ｈには、それぞれ「ｋ２，０」、「ｋ２，２」、「ｋ２，４」、「ｋ２，６」、「ｋ２，８」、「ｋ２，１０」、「ｋ２，１２」、および「ｋ２，１４」が保持される。
【００８１】
時刻Ｃ１０まで同様の処理が繰り返され、９ラウンド目のラウンド鍵「ｋ９，０ｋ９，１ｋ９，２ｋ９，３ｋ９，４ｋ９，５ｋ９，６ｋ９，７ｋ９，８ｋ９，９ｋ９，１０ｋ９，１１ｋ９，１２ｋ９，１３ｋ９，１４ｋ９，１５」が出力され、図６に示すようにレジスタ５２０ａから５２０ｐ、レジスタ５０１ｙ、およびレジスタ５０１ｚに、それぞれ「ｋ１０，０」、「ｋ９，１」、「ｋ１０，２」、「ｋ９，３」、「ｋ１０，４」、「ｋ９，５」、「ｋ１０，６」、「ｋ９，７」、「ｋ１０，８」、「ｋ９，９」、「ｋ１０，１０」、「ｋ９，１１」、「ｋ１０，１２」、「ｋ９，１３」、「ｋ１０，１４」、「ｋ９，１５」、「ｋ９，１２」、および「ｋ９，１４」が保持される。
【００８２】
（時刻Ｃ１１）レジスタ５２０ａから５２０ｐ、レジスタ５０１ｙ、およびレジスタ５０１ｚは保持している値を出力する。選択器５０３ａから５０３ｐは、排他的論理和回路５０２ａから５０２ｐの出力を選択して出力する。選択器５０３ｑと５０３ｓは、レジスタ５２０ｍと５２０ｏが出力する値を選択して出力する。選択器５０３ｒと５０３ｔは、排他的論理和回路５０２ｎと５０２ｐの出力を選択して出力する。
【００８３】
レジスタ５０１ｙと５０１ｚにそれぞれ保持される「ｋ９，１２」および「ｋ９，１４」は、ＲｏｔＷｏｒｄ演算部３０４、およびＳｕｂＢｙｔｅ演算部３０５で変換されたのち、ＡｄｄＲＣｏｎ演算部５０６で１０ラウンド目に対応する定数が加算されて、排他的論理和回路５０２ｄと５０２ｂに送られ、レジスタ５２０ｄおよび５２０ｂにそれぞれ保持される「ｋ９，３」および「ｋ９，１」を、それぞれ「ｋ１０，３」および「ｋ１０，１」に更新する。更新された「ｋ１０，１」および「ｋ１０，３」は、それぞれ排他的論理和回路５０２ｆと５０２ｈに送られ、レジスタ５２０ｆおよび５２０ｈにそれぞれ保持される「ｋ９，５」および「ｋ９，７」を、それぞれ「ｋ１０，５」および「ｋ１０，７」に更新する。同様に、レジスタ５２０ｊ、５２０ｌ、５２０ｎ、および５２０ｐにそれぞれ保持される「ｋ９，９」、「ｋ９，１１」、「ｋ９，１３」、および「ｋ９，１５」は、それぞれ「ｋ１０，９」、「ｋ１０，１１」、「ｋ１０，１３」、および「ｋ１０，１５」に更新される。
【００８４】
さらに、更新された「ｋ１０，１３」および「ｋ１０，１５」は、選択器５０３ｒと５０３ｓによって選択されて出力され、ＲｏｔＷｏｒｄ演算部３０４、およびＳｕｂＢｙｔｅ演算部３０５で変換される。しかし、ＡｄｄＲＣｏｎ演算部５０６では１１ラウンド目に対応する定数が定められていないため、以降のデータは無効となり、レジスタ５２０ａ、５２０ｃ、５２０ｅ、５２０ｇ、５２０ｉ、５２０ｋ、５２０ｍ、および５２０ｏに実際には使用されない値に更新される。
【００８５】
更新された「ｋ１０，１」、「ｋ１０，３」、「ｋ１０，５」、「ｋ１０，７」、「ｋ１０，９」、「ｋ１０，１１」、「ｋ１０，１３」、および「ｋ１０，１５」は、レジスタ５３０ａから５３０ｈに保持される「ｋ１０，０」、「ｋ１０，２」、「ｋ１０，４」、「ｋ１０，６」、「ｋ１０，８」、「ｋ１０，１０」、「ｋ１０，１２」、および「ｋ１０，１４」とともに、１０ラウンド目のラウンド鍵として出力される。
【００８６】
第２の実施の形態で、９ラウンド目のラウンド鍵に計算誤りを生じさせるためには、時刻Ｃ９またはＣ１０で計算を誤らせる必要がある。しかし、このとき８ラウンド目のラウンド鍵の一部「ｋ８，１ｋ８，３ｋ８，５ｋ８，７ｋ８，９ｋ８，１１ｋ８，１３ｋ８，１５」、または１０ラウンド目のラウンド鍵の一部「ｋ１０，０ｋ１０，２ｋ１０，４ｋ１０，６ｋ１０，８ｋ１０，１０ｋ１０，１２ｋ１０，１４」にも計算誤りが生じる可能性があり、非特許文献１などで開示されている故障利用解析により秘密鍵を求めることは困難となる。
【００８７】
これまでは、例えば最初の４バイトに着目すると、レジスタ５２０ａおよび５２０ｃが、レジスタ５２０ｂおよび５２０ｄよりも１ラウンド分進んだラウンド鍵を保持するような鍵スケジュール装置について説明した。ラウンドを進めるレジスタの組み合わせはこれに限られるものではなく、図６の回路例と同様の手法を適用できるものであればどのような組合せでもよい。
【００８８】
例えば、以下の組み合わせが可能である。
（１）レジスタ５２０ｂと５２０ｄが、レジスタ５２０ａと５２０ｃよりも１ラウンド分進む
（２）レジスタ５２０ａが、レジスタ５２０ｂ、５２０ｃ、および５２０ｄよりも１ラウンド分進む
（３）レジスタ５２０ｂが、レジスタ５２０ａ、５２０ｃ、および５２０ｄよりも１ラウンド分進む
（４）レジスタ５２０ｃが、レジスタ５２０ａ、５２０ｂ、および５２０ｄよりも１ラウンド分進む
（５）レジスタ５２０ｄが、レジスタ５２０ａ、５２０ｂ、および５２０ｃよりも１ラウンド分進む
（６）レジスタ５２０ｂ、５２０ｃ、および５２０ｄが、レジスタ５２０ａよりも１ラウンド分進む
（７）レジスタ５２０ａ、５２０ｃ、および５２０ｄが、レジスタ５２０ｂよりも１ラウンド分進む
（８）レジスタ５２０ａ、５２０ｂ、および５２０ｄが、レジスタ５２０ｃよりも１ラウンド分進む
（９）レジスタ５２０ａ、５２０ｂ、および５２０ｃが、レジスタ５２０ｄよりも１ラウンド分進む
【００８９】
（変形例）
上記第２の実施の形態では、あるクロック周期で、レジスタ５０１ｙと５０１ｚに保持される情報に基づいてレジスタ５２０ｂと５２０ｄ、５２０ｆと５２０ｈ、５２０ｊと５２０ｌ、および５２０ｎと５２０ｐに保持される８バイトの情報が順番に更新される。また、レジスタ５２０ｎと５２０ｐから更新された情報に基づいてレジスタ５２０ａと５２０ｃ、５２０ｅと５２０ｇ、５２０ｉと５２０ｋ、および５２０ｍと５２０ｏに保持される８バイトの情報が順番に更新される。そのため、データパスが長くなりクロック周波数を十分に高めることができなかった。
【００９０】
そこで、第２の実施の形態の変形例では、クロック周期内でのデータの更新を分割することでクロック周波数を高めることができる鍵スケジュール装置について説明する。図７は、第２の実施の形態の変形例にかかる鍵スケジュール装置５５０の一例を示す回路図である。
【００９１】
図７に示すように、本変形例では、第２の実施の形態の鍵スケジュール装置５００の選択器５０３ａから５０３ｐの代わりに（図５参照）、三入力一出力の選択器５５３ａから５５３ｐを利用して鍵スケジュール演算処理を実行する。そして、このような選択器５５３ａから５５３ｐを用いることにより、あるクロック周期では、８バイトの情報の一部のみを選択して更新するように構成する。
【００９２】
図８は、本変形例における鍵スケジュール演算処理の各クロックで出力されるデータの一例を示す図である。同図は、例えば、レジスタ５２０ａと５２０ｃ、５２０ｅと５２０ｇ、５２０ｉと５２０ｋ、および５２０ｍと５２０ｏに保持される８バイトの情報を、２つのクロック周期（例えば、時刻Ｃ１と時刻Ｃ２）に分けて更新する例を示している。
【００９３】
このように構成することにより、１クロック周期で８バイト分の情報を選択して更新する第２の実施の形態と比較して、データパスを短くしてクロック周波数を高めることができる。
【００９４】
以上のように、第２の実施の形態にかかる鍵スケジュール装置では、ラウンド鍵を１バイトごとに分割し、先頭から奇数番目のバイトが、偶数番目のバイトより１ラウンド進むようにラウンド鍵を算出する。これにより、付加情報等の計算のための計算量の増加を回避しつつ、故障利用解析に対して安全な鍵スケジュール演算を実行することができる。
【００９５】
（第３の実施の形態）
第３の実施の形態にかかる鍵スケジュール装置は、連続する２つのラウンドのラウンド鍵を同一クロックで算出する。
【００９６】
図９は、第３の実施の形態にかかる鍵スケジュール装置７００の構成を示すブロック図である。図９に示すように、鍵スケジュール装置７００は、スケジュール部７１０と、第１記憶部７２０と、第２記憶部７３０とを備えている。
【００９７】
第３の実施の形態では、上述のように、連続する２つのラウンドのラウンド鍵を同一クロックで算出するようにスケジュール部７１０と、第１記憶部７２０と、第２記憶部７３０とを構成した点が、第１の実施の形態と異なっている。以下では、第３の実施の形態の鍵スケジュール装置７００を実現する回路例である図１０を用いて、鍵スケジュール装置７００の機能について説明する。図１０は、第３の実施の形態の鍵スケジュール装置７００の一例を示す回路図である。
【００９８】
同図に示すように、鍵スケジュール装置７００は、第１記憶部７２０を構成するレジスタ７２０ａ〜７２０ｄと、第２記憶部７３０を構成するレジスタ７３０ａ〜７３０ｈと、排他的論理和回路７０２ａ〜７０２ｈと、選択器７０３ａ〜７０３ｄと、ＲｏｔＷｏｒｄ演算部３０４ａおよび３０４ｂと、ＳｕｂＢｙｔｅ演算部３０５ａおよび３０５ｂと、ＡｄｄＲｃｏｎ演算部３０６ａおよび３０６ｂとを含んでいる。
【００９９】
レジスタ７２０ａから７２０ｄは、第１の実施の形態におけるレジスタ３２０ａから３２０ｄに対応し、１６バイトのラウンド鍵を４バイトごとに分割して保持する。
【０１００】
レジスタ７３０ａから７３０ｈは、鍵スケジュール装置７００から出力するラウンド鍵を保持するレジスタである。第３の実施の形態では、１時刻（クロック周期）あたりに２ラウンド分のラウンド鍵が計算される。上述したとおり、データ暗号化回路（暗号化装置２００）は通常１時刻あたりに１ラウンドの暗号化処理を行う。このため、データ暗号化回路が各ラウンドのラウンド鍵を参照できるように、時刻Ｃｉ（ｉ＝１，２，３，４，５）終了時に、レジスタ７３０ａから７３０ｄが第２＊ｉ−１ラウンド目のラウンド鍵を保持し、レジスタ７３０ｅから７３０ｈが第２＊ｉラウンド目のラウンド鍵を保持するように構成する。
【０１０１】
データ暗号化回路を１時刻あたりに２ラウンド分の処理を行うような構成にする場合などには、レジスタ７３０ａから７３０ｈを用いずに、ラウンド鍵を鍵スケジュール装置７００からそのまま出力する構成としてもよい。
【０１０２】
排他的論理和回路７０２ａから７０２ｄ、および排他的論理和回路７０２ｅから７０２ｈは、ビットごとの排他的論理和を計算する。
【０１０３】
選択器７０３ａから７０３ｄは、選択器３０３ａ〜３０３ｄは、鍵スケジュール装置７００への入力と、排他的論理和回路７０２ｅ〜７０２ｈの出力とを、クロック信号に応じて選択して出力する。
【０１０４】
ＲｏｔＷｏｒｄ演算部３０４ａと３０４ｂは、それぞれ第１の実施の形態のＲｏｔＷｏｒｄ演算部３０４と同様の機能を備えている。
【０１０５】
ＳｕｂＢｙｔｅ演算部３０５ａと３０５ｂは、それぞれ第１の実施の形態のＡｄｄＲＣｏｎ演算部３０５と同様の機能を備えている。
【０１０６】
ＡｄｄＲＣｏｎ演算部３０６ａと３０６ｂは、それぞれ第１の実施の形態のＡｄｄＲＣｏｎ演算部３０６と同様の機能を備えている。
【０１０７】
次に、このように構成された鍵スケジュール装置７００による鍵スケジュール演算処理について説明する。図１１は、第３の実施の形態における鍵スケジュール演算処理の各クロックで出力されるデータの一例を示す図である。
【０１０８】
（時刻Ｃ０）選択器７０３ａから７０３ｄは、それぞれ鍵スケジュール装置７００の入力として受け付けた４バイトの鍵「ｋ０，０ｋ０，１ｋ０，２ｋ０，３」、「ｋ０，４ｋ０，５ｋ０，６ｋ０，７」、「ｋ０，８ｋ０，９ｋ０，１０ｋ０，１１」、および「ｋ０，１２ｋ０，１３ｋ０，１４ｋ０，１５」を選択する。レジスタ７２０ａから７２０ｄは、クロック周期の終わりに、図１１に示すようにそれぞれの値を保持する。
【０１０９】
（時刻Ｃ１）レジスタ７２０ａから７２０ｄは、保持している値を出力する。選択器７０３ａから７０３ｄは、それぞれ排他的論理和回路７０２ｅから７０２ｈの出力を選択して出力する。このとき、レジスタ７２０ｄに保持される「ｋ０，１２ｋ０，１３ｋ０，１４ｋ０，１５」は、ＲｏｔＷｏｒｄ演算部３０４ａ、ＳｕｂＢｙｔｅ演算部３０５ａ、およびＡｄｄＲＣｏｎ演算部３０６ａで変換されて排他的論理和回路７０２ａに送られる。排他的論理和回路７０２ａは、レジスタ７２０ａに保持される「ｋ０，０ｋ０，１ｋ０，２ｋ０，３」から「ｋ１，０ｋ１，１ｋ１，２ｋ１，３」を出力して、レジスタ７２０ｅ、排他的論理和回路７０２ｂおよび７０２ｅに送る。
【０１１０】
排他的論理和回路７０２ｂに送られた「ｋ１，０ｋ１，１ｋ１，２ｋ１，３」は、レジスタ７２０ｂに保持される「ｋ０，４ｋ０，５ｋ０，６ｋ０，７」と排他的論理和演算が施され、「ｋ１，４ｋ１，５ｋ１，６ｋ１，７」が出力される。同様に、排他的論理和回路７０２ｃおよび７０２ｄでは、それぞれレジスタ７２０ｃおよび７２０ｄに保持される「ｋ０，８ｋ０，９ｋ０，１０ｋ０，１１」および「ｋ０，１２ｋ０，１３ｋ０，１４ｋ０，１５」に基づいて、「ｋ１，８ｋ１，９ｋ１，１０ｋ１，１１」と「ｋ１，１２ｋ１，１３ｋ１，１４ｋ１，１５」が出力される。
【０１１１】
排他的論理和回路７０２ｄが出力する「ｋ１，１２ｋ１，１３ｋ１，１４ｋ１，１５」は、ＲｏｔＷｏｒｄ演算部３０４ｂ、ＳｕｂＢｙｔｅ演算部３０５ｂ、およびＡｄｄＲＣｏｎ演算部３０６ｂで変換されて排他的論理和回路７０２ｅに送られる。排他的論理和回路７０２ｅは、排他的論理和回路７０２ａが出力する「ｋ１，０ｋ１，１ｋ１，２ｋ１，３」に基づいて「ｋ２，０ｋ２，１ｋ２，２ｋ２，３」を出力して、選択器７０３ａ、レジスタ７３０ｅ、および排他的論理和回路７０２ｆに送る。
【０１１２】
排他的論理和回路７０２ｆに送られた「ｋ２，０ｋ２，１ｋ２，２ｋ２，３」は、排他的論理和回路７０２ｂが出力する「ｋ１，４ｋ１，５ｋ１，６ｋ１，７」と排他的論理和演算が施され、「ｋ２，４ｋ２，５ｋ２，６ｋ２，７」が出力される。同様に、排他的論理和回路７０２ｇおよび７０２ｈでは、それぞれ排他的論理和回路７０２ｃおよび７０２ｄが出力する「ｋ１，８ｋ１，９ｋ１，１０ｋ１，１１」および「ｋ１，１２ｋ１，１３ｋ１，１４ｋ１，１５」に基づいて、それぞれ「ｋ２，８ｋ２，９ｋ２，１０ｋ２，１１」および「ｋ２，１２ｋ２，１３ｋ２，１４ｋ２，１５」が出力される。
【０１１３】
更新された「ｋ２，０ｋ２，１ｋ２，２ｋ２，３」、「ｋ２，４ｋ２，５ｋ２，６ｋ２，７」、「ｋ２，８ｋ２，９ｋ２，１０ｋ２，１１」、および「ｋ２，１２ｋ２，１３ｋ２，１４ｋ２，１５」は、図１１に示すようにレジスタ７２０ａから７２０ｄに保持されるほか、２ラウンド目で利用するラウンド鍵として、レジスタ７３０ｅから７３０ｈに保持される。排他的論理和回路７０２ａから７０２ｄが出力する「ｋ１，０ｋ１，１ｋ１，２ｋ１，３」、「ｋ１，４ｋ１，５ｋ１，６ｋ１，７」、「ｋ１，８ｋ１，９ｋ１，１０ｋ１，１１」、および「ｋ１，１２ｋ１，１３ｋ１，１４ｋ１，１５」は、１ラウンド目で利用するラウンド鍵として、レジスタ７３０ａから７３０ｄに保持される。
【０１１４】
同様の処理により、時刻Ｃ５までに１０ラウンド目までのラウンド鍵が更新されて出力される。
【０１１５】
第３の実施の形態で、９ラウンド目のラウンド鍵に計算誤りを生じさせるためには、時刻Ｃ５で計算を誤らせる必要がある。しかし、このとき１０ラウンド目のラウンド鍵「ｋ１０，０ｋ１０，１ｋ１０，２ｋ１０，３」、「ｋ１０，４ｋ１０，５ｋ１０，６ｋ１０，７」、「ｋ１０，８ｋ１０，９ｋ１０，１０ｋ１０，１１」、および「ｋ１０，１２ｋ１０，１３ｋ１０，１４ｋ１０，１５」にも計算誤りが生じる可能性があり、非特許文献１などで開示されている故障利用解析により秘密鍵を求めることは困難となる。
【０１１６】
なお、これまでは１時刻あたりに２ラウンド分のラウンド鍵を計算する例について説明したが、同様の手法により、１時刻あたりに３ラウンド分以上のラウンド鍵を計算する鍵スケジュール装置を構成することができる。
【０１１７】
このように、第３の実施の形態にかかる鍵スケジュール装置では、連続する２つのラウンドのラウンド鍵を同一の処理サイクルで算出する。これにより、付加情報等の計算のための計算量の増加を回避しつつ、故障利用解析に対して安全な鍵スケジュール演算を実行することができる。
【０１１８】
（第４の実施の形態）
第４の実施の形態にかかる鍵スケジュール装置は、１６バイトのラウンド鍵を４バイト単位に分割し、先頭の４バイトから順に、４バイトに含まれるバイトのうち所定の２バイトについて次のラウンド鍵を算出する。
【０１１９】
図１２は、第４の実施の形態にかかる鍵スケジュール装置９００の構成を示すブロック図である。図１２に示すように、鍵スケジュール装置９００は、スケジュール部９１０と、第１記憶部９２０と、第２記憶部９３０とを備えている。
【０１２０】
第４の実施の形態では、上述のように、４バイトに含まれるバイトのうち所定の２バイトについて、先頭の４バイトから順に次のラウンド鍵を算出するようにスケジュール部９１０と、第１記憶部９２０と、第２記憶部９３０とを構成した点が、第１の実施の形態と異なっている。以下では、第４の実施の形態の鍵スケジュール装置９００を実現する回路例である図１３を用いて、鍵スケジュール装置９００の機能について説明する。図１３は、第４の実施の形態の鍵スケジュール装置９００の一例を示す回路図である。
【０１２１】
同図に示すように、鍵スケジュール装置９００は、第１記憶部９２０を構成するレジスタ９２０ａ〜９２０ｈと、第２記憶部９３０を構成するレジスタ９３０ａ〜９３０ｆと、排他的論理和回路９０２ａ〜９０２ｊと、選択器９０３ａ〜９０３ｔと、ＳｕｂＢｙｔｅ演算部９０５ａおよび９０５ｂと、ＡＮＤ回路９０７ａおよび９０７ｂと、を含んでいる。
【０１２２】
レジスタ９２０ａと９２０ｂは、第１の実施の形態におけるレジスタ３２０ａに対応し、ラウンド鍵の先頭２バイトを保持するレジスタである。同様に、レジスタ９２０ｃと９２０ｄ、レジスタ９２０ｅと９２０ｆ、およびレジスタ９２０ｇから９２０ｈは、それぞれ第１の実施の形態におけるレジスタ３２０ｂ、レジスタ３２０ｃ、およびレジスタ３２０ｄに対応する。
【０１２３】
レジスタ９３０ａから９３０ｆは、第１の実施の形態におけるレジスタ３３０ａと３３０ｂと同様に、鍵スケジュール装置９００の出力がラウンドごとに揃うように調節するために用いられる。
【０１２４】
排他的論理和回路９０２ａから９０２ｈは、第１の実施の形態における排他的論理和回路３０２ａから３０２ｄを２バイトごとに分割した回路であり、２つの２バイトの入力に対して、ビットごとに排他的論理和を計算した結果を出力する。
【０１２５】
排他的論理和回路９０２ｉと９０２ｊは、２つの２バイトの入力について、ビットごとの排他的論理和を計算した結果を出力する。
【０１２６】
選択器９０３ａから９０３ｈは、第１の実施の形態における選択器３０３ａから３０３ｄを２バイトごとに分割した回路であり、それぞれレジスタ９２０ａから９２０ｈの出力、排他的論理和回路９０２ａから９０２ｈの出力、または鍵スケジュール装置９００の入力のいずれかを、クロック信号に応じて選択して出力する回路である。
【０１２７】
選択器９０３ｉから９０３ｎは、それぞれレジスタ９２０ａから９２０ｆの出力である２バイトのデータをバイトごとに分割して、それぞれ０（１バイト）を付加して２バイトに拡張した２つの２バイトのデータのいずれかを、クロック信号に応じて選択して出力する回路である。
【０１２８】
選択器９０３ｏおよび９０３ｐは、それぞれレジスタ９２０ｇおよび９２０ｈの出力である２バイトのデータを分割した２つの１バイトのデータのいずれかを、クロック信号に応じて選択して出力する回路である。
【０１２９】
選択器９０３ｑおよび９０３ｒは、ＡＥＳの仕様でラウンドごとに定められたラウンド定数を、それぞれ排他的論理和回路９０２ｉおよび９０２ｊで加算するために、対応するラウンド定数を切り出す（不要なラウンド定数を切り落とす）ためのマスクを選択する回路である。
【０１３０】
ＳｕｂＢｙｔｅ演算部９０５ａおよび９０５ｂは、それぞれ選択器９０３ｏおよび９０３ｐの出力（１バイト）を入力として、ＡＥＳの仕様で定められるＳｕｂＢｙｔｅ処理を施して、１バイトの値を出力する。
【０１３１】
選択器９０３ｓおよび９０３ｔは、ＳｕｂＢｙｔｅ演算部９０５ａおよび９０５ｂの出力に０（１バイト）を付加して２バイトに拡張した２つの２バイトのデータのいずれかを、クロック信号に応じて選択して出力する回路である。選択器９０３ｓおよび９０３ｔは、第１の実施の形態におけるＲｏｔＷｏｒｄ演算部３０４に相当する。
【０１３２】
ＡＮＤ回路９０７ａと９０７ｂは、２つの２バイトの入力について、ビットごとの積を計算して出力する。
【０１３３】
次に、このように構成された鍵スケジュール装置９００による鍵スケジュール演算処理について説明する。図１４は、第４の実施の形態における鍵スケジュール演算処理の各クロックで出力されるデータの一例を示す図である。
【０１３４】
（時刻Ｃ０）選択器９０３ａから９０３ｈは、それぞれ鍵スケジュール装置９００の入力として受け付けた２バイトの鍵「ｋ０，０ｋ０，１」、「ｋ０，２ｋ０，３」、「ｋ０，４ｋ０，５」、「ｋ０，６ｋ０，７」、「ｋ０，８ｋ０，９」、「ｋ０，１０ｋ０，１１」、「ｋ０，１２ｋ０，１３」、および「ｋ０，１４ｋ０，１５」を選択する。レジスタ９２０ａから９２０ｈは、クロック周期の終わりに、図１４に示すようにそれぞれの値を保持する。
【０１３５】
（時刻Ｃ１）レジスタ９２０ａから９２０ｈは保持している値を出力する。選択器９０３ｏおよび９０３ｐは、それぞれレジスタ９２０ｇおよびレジスタ９２０ｈの出力（２バイト）をバイトごとに分割して得られる下位１バイト「ｋ０，１３」および「ｋ０，１５」をそれぞれ選択して出力する。選択器９０３ｓおよび９０３ｔは、ＳｕｂＢｙｔｅ演算部９０５ａおよび９０５ｂの出力の後ろに０（１バイト）を付加した２バイトの値を選択して出力する。選択器９０３ｑと９０３ｒは、ともにｆｆ００（２バイト）を選択する。選択器９０３ａおよび９０３ｂは、それぞれ排他的論理和回路９０２ａおよび９０２ｂの出力を選択して出力する。選択器９０３ｃから９０３ｈは、それぞれレジスタ９２０ｃから９２０ｈの出力を選択して出力する。選択器９０３ｉから９０３ｎは、それぞれレジスタ９２０ａから９２０ｆの出力（２バイト）をバイトごとに分割して得られる上位１バイトの後ろに０（１バイト）を付加した２バイトの値を選択して出力する。なお、選択器９０３ｉから９０３ｎは、いずれの値を選んでも動作は変わらない。
【０１３６】
レジスタ９２０ｇおよび９２０ｈにそれぞれ保持される「ｋ０，１２ｋ０，１３」と「ｋ０，１４ｋ０，１５」は、バイトごとに分割されたのち、「ｋ０，１３」と「ｋ０，１５」がそれぞれ選択器９０３ｏおよび９０３ｐで選択して出力され、それぞれＳｕｂＢｙｔｅ演算部９０５ａおよび９０５ｂで変換される。そして、それぞれ選択器９０３ｓおよび９０３ｔによって、ＳｕｂＢｙｔｅ演算部９０５ａおよび９０５ｂの出力の後ろに０（１バイト）を付加した２バイトの値として選択され、それぞれ排他的論理和回路９０２ｉおよび９０２ｊで１ラウンド目に対応するラウンド定数が加算されたのち、それぞれ排他的論理和回路９０２ａおよび９０２ｂに送られる（それぞれの下位バイトは０）。
【０１３７】
排他的論理和回路９０２ａおよび９０２ｂでは、それぞれレジスタ９２０ａおよび９２０ｂが保持する「ｋ０，０ｋ０，１」および「ｋ０，２ｋ０，３」が、「ｋ１，０ｋ０，１」および「ｋ１，２ｋ０，３」にそれぞれ更新される。レジスタ９２０ｃから９２０ｈにそれぞれ保持される「ｋ０，４ｋ０，５」、「ｋ０，６ｋ０，７」、「ｋ０，８ｋ０，９」、「ｋ０，１０ｋ０，１１」、「ｋ０，１２ｋ０，１３」、および「ｋ０，１４ｋ０，１５」は、同じ値に更新される。レジスタ９２０ａから９２０ｈは、クロック周期の終わりに、図１４に示すようにそれぞれの値を保持する。
【０１３８】
（時刻Ｃ２）レジスタ９２０ａから９２０ｈは保持している値を出力する。選択器９０３ｏおよび９０３ｐは、それぞれレジスタ９２０ｇおよびレジスタ９２０ｈの出力（２バイト）をバイトごとに分割して得られる上位１バイト「ｋ０，１２」および「ｋ０，１４」を選択して出力する。選択器９０３ｓおよび９０３ｔは、ＳｕｂＢｙｔｅ演算部９０５ｂおよび９０５ａの出力の前に０（１バイト）を付加した２バイトの値を選択して出力する。選択器９０３ｑおよび９０３ｒは、ともに００ｆｆ（２バイト）を選択する。選択器９０３ａから９０３ｄは、それぞれ排他的論理和回路９０２ａから９０２ｄの出力を選択して出力する。選択器９０３ｅから９０３ｈは、それぞれレジスタ９２０ｅから９２０ｈの出力を選択して出力する。選択器９０３ｉから９０３ｎは、それぞれレジスタ９２０ａから９２０ｆの出力（２バイト）をバイトごとに分割して得られる上位１バイトの後ろに０（１バイト）を付加した２バイトの値を選択して出力する。なお、選択器９０３ｋから９０３ｎは、いずれの値を選んでも動作は変わらない。
【０１３９】
レジスタ９２０ｇおよび９２０ｈにそれぞれ保持される「ｋ０，１２ｋ０，１３」と「ｋ０，１４ｋ０，１５」は、バイトごとに分割されたのち、「ｋ０，１２」と「ｋ０，１４」が、それぞれ選択器９０３ｏおよび９０３ｐで選択して出力され、それぞれＳｕｂＢｙｔｅ演算部９０５ａおよび９０５ｂで変換される。そして、それぞれ選択器９０３ｓおよび９０３ｔによって、ＳｕｂＢｙｔｅ演算部９０５ｂおよび９０５ａの出力の前に０（１バイト）を付加した２バイトの値として選択され、それぞれ排他的論理和回路９０２ｉおよび９０２ｊで１ラウンド目に対応するラウンド定数が加算されたのち、排他的論理和回路９０２ａと９０２ｂに送られる（それぞれの下位バイトは０）。
【０１４０】
排他的論理和回路９０２ａおよび９０２ｂでは、それぞれレジスタ９２０ａおよび９２０ｂが保持する「ｋ１，０ｋ０，１」と「ｋ１，２ｋ０，３」が、「ｋ１，０ｋ１，１」と「ｋ１，２ｋ１，３」にそれぞれ更新される。選択器９０３ｉおよび９０３ｊでそれぞれ選択された「ｋ１，００」（「ｋ１，０」に「０」を付加した２バイトのデータ）と「ｋ１，２０」（「ｋ１，２」に「０」を付加した２バイトのデータ）は、それぞれ排他的論理和回路９０２ｃおよび９０２ｄで、レジスタ９２０ｃおよび９２０ｄが保持する「ｋ０，２ｋ０，３」および「ｋ０，４ｋ０，５」から、それぞれ「ｋ１，２ｋ０，３」および「ｋ１，４ｋ０，５」に更新される。レジスタ９２０ｅから９２０ｈに保持される「ｋ０，８ｋ０，９」、「ｋ０，１０ｋ０，１１」、「ｋ０，１２ｋ０，１３」、および「ｋ０，１４ｋ０，１５」は、同じ値に更新される。レジスタ９２０ａから９２０ｈは、クロック周期の終わりに、図１４に示すようにそれぞれの値を保持する。
【０１４１】
同様の処理により、時刻Ｃ４までラウンド鍵が更新される。時刻Ｃ５では、図１４に示すようにラウンド鍵を更新するとともに、レジスタ９３０ａから９３０ｆに保持される「ｋ１，０ｋ１，１」、「ｋ１，２ｋ１，３」、「ｋ１，４ｋ１，５」、「ｋ１，６ｋ１，７」、「ｋ１，８ｋ１，９」、および「ｋ１，１０ｋ１，１１」と、選択器９０３ｇおよび９０３ｈそれぞれの出力「ｋ１，１２ｋ１，１３」および「ｋ１，１４ｋ１，１５」とを１ラウンド目で用いるラウンド鍵として出力する。
【０１４２】
同様の処理により、さらに時刻Ｃ４１までラウンド鍵が更新され出力される。
【０１４３】
第４の実施の形態で、９ラウンド目のラウンド鍵に計算誤りを生じさせるためには、時刻Ｃ３６から時刻Ｃ４０で計算を誤らせる必要がある。しかし、このとき８ラウンド目のラウンド鍵「ｋ８，０ｋ８，１ｋ８，２ｋ８，３」、「ｋ８，４ｋ８，５ｋ８，６ｋ８，７」、「ｋ８，８ｋ８，９ｋ８，１０ｋ８，１１」、および「ｋ８，１２ｋ８，１３ｋ８，１４ｋ８，１５」の一部、または、１０ラウンド目のラウンド鍵「ｋ１０，０ｋ１０，１ｋ１０，２ｋ１０，３」、「ｋ１０，４ｋ１０，５ｋ１０，６ｋ１０，７」、「ｋ１０，８ｋ１０，９ｋ１０，１０ｋ１０，１１」、および「ｋ１０，１２ｋ１０，１３ｋ１０，１４ｋ１０，１５」の一部にも計算誤りが生じる可能性があり、非特許文献１などで開示されている故障利用解析により秘密鍵を求めることは困難となる。
【０１４４】
なお、これまで説明した回路例と同様の手法により、レジスタ９２０ａ内の２つのバイトの更新順序を入れ替える鍵スケジュール装置や、レジスタ９２０ａの更新内容をレジスタ９２０ｃの更新に用いるタイミングを遅らせる鍵スケジュール装置を構成可能である。
【０１４５】
このように、第４の実施の形態にかかる鍵スケジュール装置では、１６バイトのラウンド鍵を４バイト単位に分割し、先頭の４バイトから順に、４バイトに含まれるバイトのうち所定の２バイトについて次のラウンド鍵を算出することができる。これにより、付加情報等の計算のための計算量の増加を回避しつつ、故障利用解析に対して安全な鍵スケジュール演算を実行することができる。
【０１４６】
（第５の実施の形態）
第１の実施の形態から第４の実施の形態では、鍵スケジュール装置を実現する回路の構成と動作を説明した。第５の実施の形態では、鍵スケジュール装置を実現するための鍵スケジュール演算処理を実行するプログラムについて説明する。
【０１４７】
なお、以下では、第２の実施の形態の鍵スケジュール装置を実現する鍵スケジュールプログラムについて説明する。その他の実施の形態についても、同様の手法によって対応する鍵スケジュールプログラムを構成することができる。
【０１４８】
図１５は、第５の実施の形態にかかる鍵スケジュール装置１１００のハードウェア構成の一例を示すブロック図である。図１５に示すように、鍵スケジュール装置１１００は、入出力部１１０１と、制御部１１０２と、演算装置１１０３と、主記憶装置１１０４と、補助記憶装置１１０５と、を主なハードウェア構成として備えている。
【０１４９】
入出力部１１０１は、データの入出力が可能な入出力装置やネットワーク回線に接続され、データを入出力するとともに、暗号化実行の命令を受け付ける。また、入出力部１１０１は、暗号化結果を表示するための情報を出力する。
【０１５０】
制御部１１０２は、入出力部１１０１から入力データとともに暗号化実行の命令を受け付けたときに、補助記憶装置１１０５に記憶されるプログラムとデータに基づいてデータの暗号化を実行するように、演算装置１１０３と主記憶装置１１０４に命令を発行する。
【０１５１】
演算装置１１０３は、制御部１１０２の命令に基づいて受け付けたデータを入力として、コピー、反転、シフト演算、和、積、および排他的論理和演算などのビット演算や、加算、乗算、剰余算などの算術演算を行う。制御部１１０２、および演算装置１１０３は、ＣＰＵ（Central Processing Unit）などによって構成することができる。
【０１５２】
主記憶装置１１０４は、補助記憶装置１１０５が記憶するデータや演算装置１１０３が処理したデータを一時的に記憶する。主記憶装置１１０４は、補助記憶装置１１０５よりも高速にデータの入出力が可能であり、処理を高速化する目的で使用される。主記憶装置１１０４は、例えば、RAM（Random  Access  Memory）などにより構成することができる。
【０１５３】
補助記憶装置１１０５は、暗号処理のプログラムや変数を記憶する。暗号処理に用いる秘密鍵は、補助記憶装置１１０５に記憶してもよいし、暗号化処理を実行するごとに入出力部１１０１から受け付けてもよい。補助記憶装置１１０５は、例えば、ＨＤＤ（Hard  Disk  Drive）などにより構成することができる。
【０１５４】
なお、鍵スケジュール装置１１００で実行される鍵スケジュールプログラムは、インストール可能な形式又は実行可能な形式のファイルでＣＤ−ＲＯＭ（Compact Disk Read Only Memory）、フレキシブルディスク（ＦＤ）、ＣＤ−Ｒ（Compact Disk Recordable）、ＤＶＤ（Digital Versatile Disk）等のコンピュータで読み取り可能な記録媒体に記録されて提供される。
【０１５５】
また、鍵スケジュール装置１１００で実行される鍵スケジュールプログラムを、インターネット等のネットワークに接続されたコンピュータ上に格納し、ネットワーク経由でダウンロードさせることにより提供するように構成してもよい。また、鍵スケジュール装置１１００で実行される鍵スケジュールプログラムをインターネット等のネットワーク経由で提供または配布するように構成してもよい。
【０１５６】
また、鍵スケジュールプログラムを、ＲＯＭ等に予め組み込んで提供するように構成してもよい。
【０１５７】
鍵スケジュール装置１１００で実行される鍵スケジュールプログラムは、上述したスケジュール部を含むモジュール構成となっており、実際のハードウェアとしてはＣＰＵ（制御部）が上記記憶媒体から鍵スケジュールプログラムを読み出して実行することにより上記スケジュール部が主記憶装置１１０４上にロードされ、主記憶装置１１０４上に生成されるようになっている。
【０１５８】
次に、鍵スケジュール演算処理で利用される各種データを記憶するための主記憶装置１１０４の構成について説明する。図１６は、主記憶装置１１０４に確保される領域の構成例を示す図である。図１６に示すように、主記憶装置１１０４は、鍵スケジュール演算処理のために、それぞれ４バイト（３２ビット）であるＭｅｍＡ［ｉ］、ＭｅｍＢ［ｉ］、ＭｅｍＣ［ｉ］、ＭｅｍＤ［ｉ］、およびＭｅｍＴ［ｊ］（ｉ＝０，１，２，３、ｊ＝０，１）の各領域を確保する。
【０１５９】
ＭｅｍＡ［ｉ］とＭｅｍＢ［ｉ］は、ラウンド鍵の一部を記憶する領域である。ＭｅｍＢ［ｉ］は、ＭｅｍＡ［ｉ］に記憶されるラウンド鍵よりも１つ先のラウンドに対応するラウンド鍵を記憶する。ＭｅｍＣ［ｉ］は、ＭｅｍＡ［ｉ］とＭｅｍＢ［ｉ］の排他的論理和を計算した結果を記憶する。ＭｅｍＤ［ｉ］は、各ステップの初めにＭｅｍＢ［ｉ］が記憶するデータをコピーし、同一ステップで計算されたＭｅｍＡ［ｉ］との排他的論理和を計算した結果を記憶する。ＭｅｍＴ［ｊ］は、次のステップでラウンド鍵を更新するための情報を一時的に記憶する。
【０１６０】
次に、このように構成された第５の実施の形態にかかる鍵スケジュール装置１１００による鍵スケジュール演算処理について図１７を用いて説明する。図１７は、第５の実施の形態における鍵スケジュール演算処理の全体の流れを示すフローチャートである。
【０１６１】
まず、主記憶装置１１０４上に生成されたスケジュール部は、主記憶装置１１０４上に、図１６で示したような各領域を確保し、所定の値で初期化する。そして、スケジュール部は、入力された秘密鍵を所定の領域に保存する（ステップＳ１７０１）。
【０１６２】
次に、スケジュール部は、１ラウンド目のラウンド鍵の一部を算出する（ステップＳ１７０２）。さらに、スケジュール部は、前のステップで算出したラウンドのラウンド鍵の残りの部分および次のラウンドのラウンド鍵の一部を算出する（ステップＳ１７０３）。
【０１６３】
次に、スケジュール部は、１０ラウンド目のラウンド鍵の一部まで算出したか否かを判断する（ステップＳ１７０４）。算出していない場合は（ステップＳ１７０４：ＮＯ）、さらに処理を繰り返す（ステップＳ１７０３）。算出した場合は（ステップＳ１７０４：ＹＥＳ）、スケジュール部は、１０ラウンド目のラウンド鍵の残りの部分を算出し（ステップＳ１７０５）、鍵スケジュール演算処理を終了する。
【０１６４】
次に、図１７で説明したフローチャートの詳細について図１８から図２４を用いてさらに説明する。図１８から図２４は、各処理サイクル実行後に、主記憶装置１１０４の領域に格納されるデータの一例を示す図である。以下では、第２の実施の形態の時刻Ｃ０からＣ１１にそれぞれ対応するステップＳ０からステップＳ１１までの各処理サイクルでの処理の詳細を説明する。
【０１６５】
なお、以下のステップＳ０が、図１７のステップＳ１７０１に対応する。また、ステップＳ１が、図１７のステップＳ１７０２に対応する。また、ステップＳ２からステップＳ１０が、図１７のステップＳ１７０３からステップＳ１７０４に対応する。さらに、ステップＳ１１が、図１７のステップＳ１７０５に対応する。
【０１６６】
（ステップＳ０（初期化））１６バイト（１２８ビット）の鍵「ｋ０，０ｋ０，１ｋ０，２ｋ０，３」、「ｋ０，４ｋ０，５ｋ０，６ｋ０，７」、「ｋ０，８ｋ０，９ｋ０，１０ｋ０，１１」、および「ｋ０，１２ｋ０，１３ｋ０，１４ｋ０，１５」を受け付けたら、ＭｅｍＣ［ｉ］に４バイトずつ記憶する。ＭｅｍＡ［ｉ］、ＭｅｍＢ［ｉ］、ＭｅｍＤ［ｉ］（ｉ＝０，１，２，３）、およびＭｅｍＴ［１］は、０ｘ００００００００（４バイト）で初期化する。ＭｅｍＴ［０］は、ＭｅｍＣ［３］と０ｘｆｆ００ｆｆ００（４バイト）とのビット積を記憶する。ステップＳ０終了時には、各領域は図１８に示す値を記憶する。
【０１６７】
（ステップＳ１）ＭｅｍＤ［ｉ］に、ＭｅｍＣ［ｉ］と０ｘｆｆ００ｆｆ００（４バイト）とのビット積を上書きする。このとき、ｉ＝１，２，３について、ＭｅｍＤ［ｉ］には、４バイトの「ｋ０，４＊ｉ０ｋ０，４＊ｉ＋２０」が記憶される。
【０１６８】
ＭｅｍＡ［ｉ］に、ＭｅｍＣ［ｉ］と０ｘ００ｆｆ００ｆｆ（４バイト）とのビット積を記憶する。このとき、ｉ＝１，２，３について、ＭｅｍＡ［ｉ］には４バイトの「０ｋ０，４＊ｉ＋１０ｋ０，４＊ｉ＋３」が記憶される。
【０１６９】
ＭｅｍＢ［ｉ］に、ＭｅｍＣ［ｉ］と０ｘｆｆ００ｆｆ００（４バイト）とのビット積を記憶する。このとき、ｉ＝１，２，３について、ＭｅｍＢ［ｉ］には４バイトの「ｋ０，４＊ｉ０ｋ０，４＊ｉ＋２０」が記憶される。
【０１７０】
ＭｅｍＢ［ｉ］を以下のように更新する。ＭｅｍＡ［３］を左に８ビット巡回シフトした値に、各バイトにＡＥＳの仕様で定めるＳｕｂＢｙｔｅ演算を施す。なお、実際には第一バイトと第三バイトにのみＳｕｂＢｙｔｅ演算を施せば十分である。さらに、ＡＥＳの仕様で定める１ラウンド目のラウンド定数を加算（排他的論理和演算）したのち、０ｘｆｆ００ｆｆ００（４バイト）とのビット積を行って得られる値とＭｅｍＢ［０］との排他的論理和演算を計算し、ＭｅｍＢ［０］に上書きする。このとき、ＭｅｍＡ［３］は、４バイトの「０ｋ０，１３０ｋ０，１５」が記憶され、ＭｅｍＢ［０］には４バイトの「ｋ１，００ｋ１，２０」が記憶される。ｉ＝１，２，３について、ＭｅｍＢ［ｉ］を、ＭｅｍＢ［ｉ］とＭｅｍＢ［ｉ−１］との排他的論理和で上書きする。このとき、ｉ＝１，２，３について、ＭｅｍＢ［ｉ］には４バイトの「ｋ１，４＊ｉ０ｋ１，４＊ｉ＋２０」が記憶される。
【０１７１】
ＭｅｍＣ［ｉ］に、ＭｅｍＡ［ｉ］とＭｅｍＢ［ｉ］との排他的論理和を上書きする。このとき、ｉ＝０，１，２，３について、ＭｅｍＣ［ｉ］には４バイトの「ｋ１，４＊ｉｋ０，４＊ｉ＋１ｋ１，４＊ｉ＋２ｋ０，４＊ｉ＋３」が記憶される。
【０１７２】
ＭｅｍＤ［ｉ］に、ＭｅｍＤ［ｉ］とＭｅｍＡ［ｉ］との排他的論理和を上書きする。このとき、ｉ＝０，１，２，３について、ＭｅｍＤ［ｉ］には４バイトの「ｋ０，４＊ｉｋ０，４＊ｉ＋１ｋ０，４＊ｉ＋２ｋ０，４＊ｉ＋３」が記憶される。ＭｅｍＤ［ｉ］の記憶する「ｋ０，０ｋ０，１ｋ０，２ｋ０，３」、「ｋ０，４ｋ０，５ｋ０，６ｋ０，７」、「ｋ０，８ｋ０，９ｋ０，１０ｋ０，１１」、および「ｋ０，１２ｋ０，１３ｋ０，１４ｋ０，１５」を初期鍵として出力する。
【０１７３】
ＭｅｍＴ［１］は、ＭｅｍＣ［３］と０ｘｆｆ００ｆｆ００（４バイト）とのビット積を記憶する。ステップＳ１終了時には、各領域は図１９に示す値を記憶する。
【０１７４】
（ステップＳ２）ＭｅｍＤ［ｉ］に、ＭｅｍＣ［ｉ］と０ｘｆｆ００ｆｆ００（４バイト）とのビット積を上書きする。このとき、ｉ＝１，２，３について、ＭｅｍＤ［ｉ］には４バイトの「ｋ１，４＊ｉ０ｋ１，４＊ｉ＋２０」が記憶される。
【０１７５】
ＭｅｍＡ［ｉ］を以下のように更新する。ＭｅｍＴ［０］を左に８ビット巡回シフトした値に、各バイトにＡＥＳの仕様で定めるＳｕｂＢｙｔｅ演算を施す。なお、実際には第二バイトと第四バイトにのみＳｕｂＢｙｔｅ演算を施せば十分である。さらに、ＡＥＳの仕様で定める１ラウンド目のラウンド定数を加算（排他的論理和演算）したのち、０ｘｆｆ００ｆｆ００（４バイト）とのビット積を行って得られる値とＭｅｍＡ［０］との排他的論理和演算を計算し、ＭｅｍＡ［０］に上書きする。このとき、ＭｅｍＡ［０］には４バイトの「０ｋ１，１０ｋ１，３」が記憶される。ｉ＝１，２，３について、ＭｅｍＡ［ｉ］を、ＭｅｍＡ［ｉ］とＭｅｍＡ［ｉ−１］との排他的論理和で上書きする。このとき、ｉ＝１，２，３について、ＭｅｍＡ［ｉ］には４バイトの「０ｋ１，４＊ｉ＋１０ｋ１，４＊ｉ＋３」が記憶される。
【０１７６】
ＭｅｍＢ［ｉ］を以下のように更新する。ＭｅｍＡ［３］を左に８ビット巡回シフトした値に、各バイトにＡＥＳの仕様で定めるＳｕｂＢｙｔｅ演算を施す。なお、実際には第一バイトと第三バイトにのみＳｕｂＢｙｔｅ演算を施せば十分である。さらに、ＡＥＳの仕様で定める２ラウンド目のラウンド定数を加算（排他的論理和演算）したのち、０ｘｆｆ００ｆｆ００（４バイト）とのビット積を行って得られる値とＭｅｍＢ［０］との排他的論理和演算を計算し、ＭｅｍＢ［０］に上書きする。このとき、ＭｅｍＡ［３］は４バイトの「０ｋ１，１３０ｋ１，１５」が記憶され、ＭｅｍＢ［０］には４バイトの「ｋ２，００ｋ２，２０」が記憶される。ｉ＝１，２，３について、ＭｅｍＢ［ｉ］が記憶する値を、ＭｅｍＢ［ｉ］とＭｅｍＢ［ｉ−１］との排他的論理和で上書きする。このとき、ｉ＝１，２，３について、ＭｅｍＢ［ｉ］には４バイトの「ｋ２，４＊ｉ０ｋ２，４＊ｉ＋２０」が記憶される。
【０１７７】
ＭｅｍＣ［ｉ］に、ＭｅｍＡ［ｉ］とＭｅｍＢ［ｉ］との排他的論理和を上書きする。このとき、ｉ＝０，１，２，３について、ＭｅｍＣ［ｉ］には４バイトの「ｋ２，４＊ｉｋ１，４＊ｉ＋１ｋ２，４＊ｉ＋２ｋ１，４＊ｉ＋３」が記憶される。
【０１７８】
ＭｅｍＤ［ｉ］に、ＭｅｍＤ［ｉ］とＭｅｍＡ［ｉ］との排他的論理和を上書きする。このとき、ｉ＝０，１，２，３について、ＭｅｍＤ［ｉ］には４バイトの「ｋ１，４＊ｉｋ１，４＊ｉ＋１ｋ１，４＊ｉ＋２ｋ１，４＊ｉ＋３」が記憶される。ＭｅｍＤ［ｉ］の記憶する「ｋ１，０ｋ１，１ｋ１，２ｋ１，３」、「ｋ１，４ｋ１，５ｋ１，６ｋ１，７」、「ｋ１，８ｋ１，９ｋ１，１０ｋ１，１１」、および「ｋ１，１２ｋ１，１３ｋ１，１４ｋ１，１５」を１ラウンド目で利用するラウンド鍵として出力する。
【０１７９】
ＭｅｍＴ［０］は、ＭｅｍＣ［３］と０ｘｆｆ００ｆｆ００（４バイト）とのビット積を記憶する。ステップＳ２終了時には、各領域は図２０に示す値を記憶する。
【０１８０】
（ステップＳ３）ＭｅｍＴ［０］とＭｅｍＴ［１］との役割を入れ替えて、ステップＳ２と同様の処理を行い、図２１に示す値に更新し、ＭｅｍＤ［ｉ］の記憶する「ｋ２，０ｋ２，１ｋ２，２ｋ２，３」、「ｋ２，４ｋ２，５ｋ２，６ｋ２，７」、「ｋ２，８ｋ２，９ｋ２，１０ｋ２，１１」、および「ｋ２，１２ｋ２，１３ｋ２，１４ｋ２，１５」を２ラウンド目で利用するラウンド鍵として出力する。
【０１８１】
ステップＳ４からステップＳ１０まで同様の処理を繰り返し、各領域の値を更新するとともに、ラウンド鍵を出力する。なお、図２２および図２３は、それぞれステップＳ９およびステップＳ１０を実行した後の主記憶装置１１０４の領域に記憶される値を示す。
【０１８２】
（ステップＳ１１）ＭｅｍＤ［ｉ］に、ＭｅｍＣ［ｉ］と０ｘｆｆ００ｆｆ００（４バイト）とのビット積を上書きする。このとき、ｉ＝１，２，３について、ＭｅｍＤ［ｉ］には４バイトの「ｋ１０，４＊ｉ０ｋ１０，４＊ｉ＋２０」が記憶される。
【０１８３】
ＭｅｍＡ［ｉ］を以下のように更新する。ＭｅｍＴ［１］を左に８ビット巡回シフトした値に、各バイトにＡＥＳの仕様で定めるＳｕｂＢｙｔｅ演算を施す。なお、実際には第二バイトと第四バイトにのみＳｕｂＢｙｔｅ演算を施せば十分である。さらに、ＡＥＳの仕様で定める１０ラウンド目のラウンド定数を加算（排他的論理和演算）したのち、０ｘｆｆ００ｆｆ００（４バイト）とのビット積を行って得られる値とＭｅｍＡ［０］との排他的論理和演算を計算し、ＭｅｍＡ［０］に上書きする。このとき、ＭｅｍＡ［０］には４バイトの「０ｋ１０，１０ｋ１０，３」が記憶される。ｉ＝１，２，３について、ＭｅｍＡ［ｉ］を、ＭｅｍＡ［ｉ］とＭｅｍＡ［ｉ−１］との排他的論理和で上書きする。このとき、ｉ＝１，２，３について、ＭｅｍＡ［ｉ］には４バイトの「０ｋ１０，４＊ｉ＋１０ｋ１０，４＊ｉ＋３」が記憶される。
【０１８４】
ＭｅｍＢ［ｉ］およびＭｅｍＣ［ｉ］は値を更新しない。なお、ステップＳ１０までと同様の処理を行ってもよいが、更新される値は実際には使用されない。図２４では、使用されないことを示すために、この値を記号「---」で表している。
【０１８５】
ＭｅｍＤ［ｉ］に、ＭｅｍＤ［ｉ］とＭｅｍＡ［ｉ］との排他的論理和を上書きする。このとき、ｉ＝０，１，２，３について、ＭｅｍＤ［ｉ］には４バイトの「ｋ１０，４＊ｉｋ１０，４＊ｉ＋１ｋ１０，４＊ｉ＋２ｋ１０，４＊ｉ＋３」が記憶される。ＭｅｍＤ［ｉ］の記憶する「ｋ１０，０ｋ１０，１ｋ１０，２ｋ１０，３」、「ｋ１０，４ｋ１０，５ｋ１０，６ｋ１０，７」、「ｋ１０，８ｋ１０，９ｋ１０，１０ｋ１０，１１」、および「ｋ１０，１２ｋ１０，１３ｋ１０，１４ｋ１０，１５」を１０ラウンド目で利用するラウンド鍵として出力する。
【０１８６】
ＭｅｍＴ［０］は、ＭｅｍＣ［３］と０ｘｆｆ００ｆｆ００（４バイト）とのビット積を記憶する。ステップＳ１１終了時には、各領域は図２４に示す値を記憶する。
【０１８７】
第５の実施の形態で、９ラウンド目のラウンド鍵に計算誤りを生じさせるためには、ステップＳ９またはステップＳ１０で計算を誤らせる必要がある。しかし、このとき８ラウンド目のラウンド鍵「ｋ８，０ｋ８，１ｋ８，２ｋ８，３」、「ｋ８，４ｋ８，５ｋ８，６ｋ８，７」、「ｋ８，８ｋ８，９ｋ８，１０ｋ８，１１」、および「ｋ８，１２ｋ８，１３ｋ８，１４ｋ８，１５」の一部、または、１０ラウンド目のラウンド鍵「ｋ１０，０ｋ１０，１ｋ１０，２ｋ１０，３」、「ｋ１０，４ｋ１０，５ｋ１０，６ｋ１０，７」、「ｋ１０，８ｋ１０，９ｋ１０，１０ｋ１０，１１」、および「ｋ１０，１２ｋ１０，１３ｋ１０，１４ｋ１０，１５」の一部にも計算誤りが生じる可能性があり、非特許文献１などで開示されている故障利用解析により秘密鍵を求めることは困難となる。
【０１８８】
このように、第５の実施の形態にかかる鍵スケジュール装置では、第２の実施の形態の鍵スケジュール装置と同様の処理をプログラムによって実現することができる。
【産業上の利用可能性】
【０１８９】
以上のように、本発明にかかる装置、方法およびプログラムは、ＡＥＳなどの共通鍵暗号方式の鍵スケジュールを実行する装置、方法およびプログラムに適している。
【図面の簡単な説明】
【０１９０】
【図１】第１の実施の形態にかかる鍵スケジュール装置の構成を示すブロック図である。
【図２】第１の実施の形態の鍵スケジュール装置の一例を示す回路図である。
【図３】第１の実施の形態における鍵スケジュール演算処理の各クロックで出力されるデータの一例を示す図である。
【図４】第２の実施の形態にかかる鍵スケジュール装置の構成を示すブロック図である。
【図５】第２の実施の形態の鍵スケジュール装置の一例を示す回路図である。
【図６】第２の実施の形態における鍵スケジュール演算処理の各クロックで出力されるデータの一例を示す図である。
【図７】第２の実施の形態の変形例にかかる鍵スケジュール装置の一例を示す回路図である。
【図８】第２の実施の形態の変形例における鍵スケジュール演算処理の各クロックで出力されるデータの一例を示す図である。
【図９】第３の実施の形態にかかる鍵スケジュール装置の構成を示すブロック図である。
【図１０】第３の実施の形態の鍵スケジュール装置の一例を示す回路図である。
【図１１】第３の実施の形態における鍵スケジュール演算処理の各クロックで出力されるデータの一例を示す図である。
【図１２】第４の実施の形態にかかる鍵スケジュール装置の構成を示すブロック図である。
【図１３】第４の実施の形態の鍵スケジュール装置の一例を示す回路図である。
【図１４】第４の実施の形態における鍵スケジュール演算処理の各クロックで出力されるデータの一例を示す図である。
【図１５】第５の実施の形態にかかる鍵スケジュール装置のハードウェア構成の一例を示すブロック図である。
【図１６】主記憶装置に確保される領域の構成例を示す図である。
【図１７】第５の実施の形態における鍵スケジュール演算処理の全体の流れを示すフローチャートである。
【図１８】主記憶装置の領域に格納されるデータの一例を示す図である。
【図１９】主記憶装置の領域に格納されるデータの一例を示す図である。
【図２０】主記憶装置の領域に格納されるデータの一例を示す図である。
【図２１】主記憶装置の領域に格納されるデータの一例を示す図である。
【図２２】主記憶装置の領域に格納されるデータの一例を示す図である。
【図２３】主記憶装置の領域に格納されるデータの一例を示す図である。
【図２４】主記憶装置の領域に格納されるデータの一例を示す図である。
【符号の説明】
【０１９１】
１００  鍵スケジュール装置
２００  暗号化装置
３１０  スケジュール部
３１１  演算部
３１２  更新部
３１３  出力部
３２０  第１記憶部
３２０ａ〜３２０ｄ  レジスタ
３３０  第２記憶部
３３０ａ、３３０ｂ  レジスタ
３０２ａ〜３０２ｄ  排他的論理和回路
３０３ａ〜３０３ｅ  選択器
３０４  ＲｏｔＷｏｒｄ演算部
３０５  ＳｕｂＢｙｔｅ演算部
３０６  ＡｄｄＲＣｏｎ演算部
５００  鍵スケジュール装置
５１０  スケジュール部
５２０  第１記憶部
５２０ａ〜５２０ｐ  レジスタ
５３０  第２記憶部
５３０ａ〜５３０ｈ  レジスタ
５０１ｙ、５０１ｚ  レジスタ
５０２ａ〜５０２ｐ  排他的論理和回路
５０３ａ〜５０３ｔ  選択器
５０６  ＡｄｄＲＣｏｎ演算部
５５０  鍵スケジュール装置
５５３ａ〜５５３ｔ  選択器
７００  鍵スケジュール装置
７１０  スケジュール部
７２０  第１記憶部
７２０ａ〜７２０ｄ  レジスタ
７３０  第２記憶部
７３０ａ〜７３０ｈ  レジスタ
７０２ａ〜７０２ｈ  排他的論理和回路
７０３ａ〜７０３ｄ  選択器
９００  鍵スケジュール装置
９１０  スケジュール部
９２０  第１記憶部
９２０ａ〜９２０ｈ  レジスタ
９３０  第２記憶部
９３０ａ〜９３０ｆ  レジスタ
９０２ａ〜９０２ｈ  排他的論理和回路
９０３ａ〜９０３ｔ  選択器
９０５ａ、９０５ｂ  ＳｕｂＢｙｔｅ演算部
９０７ａ、９０７ｂ  ＡＮＤ回路
１１００  鍵スケジュール装置
１１０１  入出力部
１１０２  制御部
１１０３  演算装置
１１０４  主記憶装置
１１０５  補助記憶装置
【図１】
2010057066.tif 000003
【図２】
2010057066.tif 000004
【図３】
2010057066.tif 000005
【図４】
2010057066.tif 000006
【図５】
2010057066.tif 000007
【図６】
2010057066.tif 000008
【図７】
2010057066.tif 000009
【図８】
2010057066.tif 000010
【図９】
2010057066.tif 000011
【図１０】
2010057066.tif 000012
【図１１】
2010057066.tif 000013
【図１２】
2010057066.tif 000014
【図１３】
2010057066.tif 000015
【図１４】
2010057066.tif 000016
【図１５】
2010057066.tif 000017
【図１６】
2010057066.tif 000018
【図１７】
2010057066.tif 000019
【図１８】
2010057066.tif 000020
【図１９】
2010057066.tif 000021
【図２０】
2010057066.tif 000022
【図２１】
2010057066.tif 000023
【図２２】
2010057066.tif 000024
【図２３】
2010057066.tif 000025
【図２４】
2010057066.tif 000026