(57)【要約】  暗号演算装置１００により実行される暗号演算の一般的な処理手順のフローチャートである。Ｓ１０１で電源がＯＮする。Ｓ１０２では、暗号演算実行プログラムがフェッチされ、メモリ確保等の初期化が行われる。Ｓ１０３では、平文が入力され、平文がＲＡＭなどに格納される。Ｓ１０４では、暗号演算実行プログラムがフェッチされ、レジスタやＲＡＭを使って暗号演算が行われる。Ｓ１０５では、暗号文が取り出される。Ｓ１０６では、ＣＰＵは暗号演算処理を続行するかを判断し、続行の場合はＳ１０２に戻る。以上のＳ１０２〜Ｓ１０６の暗号化処理において、Ｓ１０３とＳ１０４との間に、レジスタ・メモリ入力処理（Ｓ２００）が挿入された。Ｓ２００では、暗号演算（Ｓ１０４）を開始する前に、暗号演算に使用するレジスタやメモリに、暗号演算ごとに変化するデータ（例えば平文）を書き込み、暗号演算を行う。
2009118829.tif 000002
【特許請求の範囲】
【請求項１】
暗号演算によるデータ変換の対象となる変換対象データを入力する処理と、入力された前記変換対象データを暗号演算の実行によりデータ変換する処理とを含む入力変換処理を繰り返し実行する暗号演算装置において、
ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）を用いることにより、それぞれの前記入力変換処理における前記暗号演算の実行前に、前記暗号演算に使用される所定の記憶領域に、前記入力変換処理ごとに変化するデータである変化データを書き込むデータ書込部と、
ＣＰＵを用いることにより、前記データ書込部による前記記憶領域への前記変化データの書き込み後に、前記変化データが書き込まれた前記記憶領域を使用して前記暗号演算を実行する暗号演算実行部と
を備えたことを特徴とする暗号演算装置。
【請求項２】
前記暗号演算は、
変数を使用し、
前記データ書込部は、
ＣＰＵを用いることにより、それぞれの前記入力変換処理における前記暗号演算での前記変数の使用前に、前記変数のデータが格納される記憶領域に、前記入力変換処理ごとに変化する変化データを書き込み、
前記暗号演算実行部は、
ＣＰＵを用いることにより、前記データ書込部による前記変数への前記変化データの書き込み後に、前記変数を使用する前記暗号演算を実行することを特徴とする請求項１記載の暗号演算装置。
【請求項３】
前記暗号演算は、
前記変数を使用する関数を利用し、
前記データ書込部は、
前記関数に使用される前記変数の前記記憶領域に前記変化データを書き込み、
前記暗号演算実行部は、
前記変化データの書き込まれた前記変数を前記関数に適用することにより前記暗号演算を実行することを特徴とする請求項２記載の暗号演算装置。
【請求項４】
前記データ書込部は、
前記変数を生成し、前記変数の生成後に前記変数の前記記憶領域に前記変化データを書き込むとともに前記関数を呼び出し、前記関数に前記変化データの書き込まれた前記変数を行き渡し、
前記暗号演算実行部は、
引き渡された前記変数を前記関数に適用することにより前記暗号演算を実行することを特徴とする請求項３記載の暗号演算装置。
【請求項５】
前記データ書込部は、
前記関数を呼び出し、前記関数を呼び出した後に前記関数の内部処理を実行して前記変数を生成し、生成された前記変数の前記記憶領域に前記変化データを書き込み、
前記暗号演算実行部は、
前記データ書込部による前記関数の内部処理の実行によって前記変化データの書き込まれた前記変数を前記関数に適用することにより前記暗号演算を実行することを特徴とする請求項３記載の暗号演算装置。
【請求項６】
前記変化データは、
（ａ）平文、
（ｂ）暗号文、
（ｃ）前記ＣＰＵにより前記入力変換処理ごとに前記暗号演算の前に生成されるプロセスＩＤ（ＩＤｅｎｔｉｆｉｃａｔｉｏｎ）、
（ｄ）前記ＣＰＵにより生成される現在の時刻を示す時刻データ、
（ｅ）前記ＣＰＵの処理を介して生成される乱数、
のいずれかであることを特徴とする請求項１〜５のいずれかに記載の暗号演算装置。
【請求項７】
暗号演算によるデータ変換の対象となる変換対象データを入力する処理と、入力された前記変換対象データを暗号演算の実行によりデータ変換する処理とを含む入力変換処理を繰り返し実行する暗号演算プログラムにおいて、
それぞれの前記入力変換処理における前記暗号演算の実行前に、前記暗号演算に使用される所定の記憶領域に、前記入力変換処理ごとに変化するデータである変化データを書き込む処理と、
前記記憶領域への前記変化データの書き込み後に、前記変化データが書き込まれた前記記憶領域を使用して前記暗号演算を実行する処理と
をコンピュータに実行させることを特徴とする暗号演算プログラム。
【請求項８】
暗号演算によるデータ変換の対象となる変換対象データを入力する処理と、入力された前記変換対象データを変数を用いた暗号演算の実行によりデータ変換する処理とを含む入力変換処理を繰り返し実行する暗号演算プログラムにおいて、
それぞれの前記入力変換処理における前記暗号演算での前記変数の使用前に、前記変数のデータが格納される記憶領域に、前記入力変換処理ごとに変化する変化データを書き込む処理と、
前記変数の前記記憶領域への前記変化データの書き込み後に、前記変数を使用する前記暗号演算を実行する処理と
をコンピュータに実行させることを特徴とする暗号演算プログラム。
【請求項９】
請求項７記載と請求項８とのいずれかの暗号演算プログラムを記録したコンピュータ読み取り可能な記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、平文を暗号化する暗号演算装置及び暗号演算プログラムに関する。
【背景技術】
【０００２】
従来の「暗号処理装置及び認証アプリケーション」は、マスク演算手法を使い、ＤＥＳ（Ｄａｔａ  Ｅｎｃｒｙｐｔｉｏｎ  Ｓｔａｎｄａｒｄ）、ＡＥＳ（Ａｄｖａｎｃｅｄ  Ｅｎｃｒｙｐｔｉｏｎ  Ｓｔａｎｄａｒｄ）の演算を行っていた。演算に必要な変形換字テーブルやマスクパラメータのデータ値は、パラメータ書き換えコマンドが入力された場合だけ、生成を行っていた（例えば、特許文献１）。これにより、サイドチャネル攻撃に対する安全性が向上され、なおかつ製造コストが低く抑えられた。【０００３】
従来の「暗号処理装置及び認証アプリケーション」ではマスク演算手法により演算を行っていたので、マスクが変わる度に換字テーブルが更新される必要があり、その度に、更新に要する時間が必要となり、全体の演算速度が遅くなっていた。また、マスクを固定化することは、そのマスクが判明した場合、サイドチャネル攻撃によりその秘密鍵を不正に取得されるというセキュリティ上の問題が生じる。さらに、換字テーブルを更新する処理過程を攻撃される恐れがあるという課題も生じる。
【特許文献１】特開２００７−６１８４号公報、第１８頁、第６図および第１９頁、第７図
【発明の開示】
【発明が解決しようとする課題】
【０００４】
本発明は、暗号演算装置が電力解析などのサイドチャネル攻撃に曝されて漏洩する「秘密情報」の量を低減し、サイドチャネル攻撃に対する耐性を向上させるプログラミング技術およびそれを使用した暗号演算装置を提供することを目的とする。
【課題を解決するための手段】
【０００５】
この発明の暗号演算装置は、
暗号演算によるデータ変換の対象となる変換対象データを入力する処理と、入力された前記変換対象データを暗号演算の実行によりデータ変換する処理とを含む入力変換処理を繰り返し実行する暗号演算装置において、
ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）を用いることにより、それぞれの前記入力変換処理における前記暗号演算の実行前に、前記暗号演算に使用される所定の記憶領域に、前記入力変換処理ごとに変化するデータである変化データを書き込むデータ書込部と、
ＣＰＵを用いることにより、前記データ書込部による前記記憶領域への前記変化データの書き込み後に、前記変化データが書き込まれた前記記憶領域を使用して前記暗号演算を実行する暗号演算実行部と
を備えたことを特徴とする。【０００６】
前記暗号演算は、
変数を使用し、
前記データ書込部は、
ＣＰＵを用いることにより、それぞれの前記入力変換処理における前記暗号演算での前記変数の使用前に、前記変数のデータが格納される記憶領域に、前記入力変換処理ごとに変化する変化データを書き込み、
前記暗号演算実行部は、
ＣＰＵを用いることにより、前記データ書込部による前記変数への前記変化データの書き込み後に、前記変数を使用する前記暗号演算を実行することを特徴とする。【０００７】
前記暗号演算は、
前記変数を使用する関数を利用し、
前記データ書込部は、
前記関数に使用される前記変数の前記記憶領域に前記変化データを書き込み、
前記暗号演算実行部は、
前記変化データの書き込まれた前記変数を前記関数に適用することにより前記暗号演算を実行することを特徴とする。【０００８】
前記データ書込部は、
前記変数を生成し、前記変数の生成後に前記変数の前記記憶領域に前記変化データを書き込むとともに前記関数を呼び出し、前記関数に前記変化データの書き込まれた前記変数を行き渡し、
前記暗号演算実行部は、
引き渡された前記変数を前記関数に適用することにより前記暗号演算を実行することを特徴とする。【０００９】
前記データ書込部は、
前記関数を呼び出し、前記関数を呼び出した後に前記関数の内部処理を実行して前記変数を生成し、生成された前記変数の前記記憶領域に前記変化データを書き込み、
前記暗号演算実行部は、
前記データ書込部による前記関数の内部処理の実行によって前記変化データの書き込まれた前記変数を前記関数に適用することにより前記暗号演算を実行することを特徴とする。【００１０】
前記変化データは、
（ａ）平文、
（ｂ）暗号文、
（ｃ）前記ＣＰＵにより前記入力変換処理ごとに前記暗号演算の前に生成されるプロセスＩＤ（ＩＤｅｎｔｉｆｉｃａｔｉｏｎ）、
（ｄ）前記ＣＰＵにより生成される現在の時刻を示す時刻データ、
（ｅ）前記ＣＰＵの処理を介して生成される乱数、
のいずれかであることを特徴とする。【００１１】
この発明の暗号演算プログラムは、
暗号演算によるデータ変換の対象となる変換対象データを入力する処理と、入力された前記変換対象データを暗号演算の実行によりデータ変換する処理とを含む入力変換処理を繰り返し実行する暗号演算プログラムにおいて、
それぞれの前記入力変換処理における前記暗号演算の実行前に、前記暗号演算に使用される所定の記憶領域に、前記入力変換処理ごとに変化するデータである変化データを書き込む処理と、
前記記憶領域への前記変化データの書き込み後に、前記変化データが書き込まれた前記記憶領域を使用して前記暗号演算を実行する処理と
をコンピュータに実行させることを特徴とする。【００１２】
この発明の暗号演算プログラムは、
暗号演算によるデータ変換の対象となる変換対象データを入力する処理と、入力された前記変換対象データを変数を用いた暗号演算の実行によりデータ変換する処理とを含む入力変換処理を繰り返し実行する暗号演算プログラムにおいて、
それぞれの前記入力変換処理における前記暗号演算での前記変数の使用前に、前記変数のデータが格納される記憶領域に、前記入力変換処理ごとに変化する変化データを書き込む処理と、
前記変数の前記記憶領域への前記変化データの書き込み後に、前記変数を使用する前記暗号演算を実行する処理と
をコンピュータに実行させることを特徴とする。【００１３】
この発明の記録媒体は、いずれかの前記暗号演算プログラムを記録したことを特徴とする。
【発明の効果】
【００１４】
本発明により、暗号演算装置のサイドチャネル攻撃に対する耐性を向上させるプログラミング技術およびサイドチャネル攻撃に対する耐性の向上した暗号演算装置を提供することができる。
【発明を実施するための最良の形態】
【００１５】
実施の形態１．
図１〜図７を参照して実施の形態１における暗号演算装置１００を説明する。【００１６】
以下の実施の形態では、暗号演算装置１００が平文（変換対象データ）を入力し、入力された平文を暗号化（データ変換）する場合を説明している。しかし、暗号化と復号とは互いに逆の処理であるので、暗号演算装置１００は、平文を暗号化する場合に限らず、暗号文（変換対象データ）を復号（データ変換）する場合にも適用可能であることは、以下の説明から明らかである。以下の説明では、暗号化、暗号演算等は広く解釈されるべきである。暗号化、暗号演算等は、平文が暗号文への変換対象である場合は平文を「暗号化」することを意味し、暗号文が平文への変換対象である場合は、暗号文を「復号」、「復号演算」等を意味するものとする。【００１７】
図１は、コンピュータで実現される暗号演算装置１００のハードウェア資源の一例を示す図である。図１において、暗号演算装置１００は、プログラムを実行するＣＰＵ１５０（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）を備えている。ＣＰＵ１５０は、レジスタ１５１を備えている。ＣＰＵ１５０は、バス１５３を介してＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）１６０、通信部１７０、記憶可能なＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）１８０と接続されている。ＣＰＵ１５０は、これらのハードウェアデバイスを制御する。【００１８】
ＲＡＭ１６０は、揮発性メモリの一例である。ＲＯＭ１８０は、不揮発性メモリの一例である。これらは、記憶装置あるいは記憶部、格納部の一例であり、暗号演算に使用する記憶領域を有する。通信部１７０は、入力部、入力装置の一例である。また、通信部１７０出力部、出力装置の一例である。【００１９】
ＲＯＭ１８０には、後述する各種のプログラムが記憶されている。これらのプログラムは、ＣＰＵ１５０により読み出され実行される。これらの各種プログラムには、以下に述べる実施の形態の説明において「〜部」として説明する機能を実行するプログラムが含まれている。【００２０】
また、以下に述べる実施の形態の説明においては、データや信号値は、レジスタ１５１、ＲＡＭ１６０のメモリ、ＲＯＭ１８０のメモリに記録される。【００２１】
また、以下に述べる実施の形態の説明において、「〜部」として説明するものは、「手段」、「〜回路」、「〜機器」であってもよく、また、「〜ステップ」、「〜手順」、「〜処理」であってもよい。すなわち、「〜部」として説明するものは、ＲＯＭ１８０に記憶されたファームウェアで実現されても構わない。或いは、ソフトウェアのみ、或いは、素子・デバイス・基板・配線などのハードウェアのみ、或いは、ソフトウェアとハードウェアとの組み合わせ、さらには、ファームウェアとの組み合わせで実現されても構わない。ファームウェアとソフトウェアは、プログラムとして、ＲＯＭ１８０に記憶されている。上記のようにプログラムは、ＣＰＵ１５０により読み出され、ＣＰＵ１５０により実行される。すなわち、プログラムは、以下に述べる「〜部」としてコンピュータを機能させる。あるいは、プログラムは、以下に述べる「〜部」の手順や方法をコンピュータに実行させる。【００２２】
ＣＰＵ１５０は、各種演算や制御コードを判断する。ＣＰＵ１５０の内部には、演算時にデータを格納するレジスタ１５１がある。ＲＡＭ１６０は、レジスタ１５１に入りきらないデータを一時的に格納する。ＲＯＭ１８０は、プログラムやデータなどを不揮発で格納できる。通信部１７０は、外部との通信を行う。バス１５３は、これらの構成要素をつなぎ、データ伝送を行う。ＲＯＭ１８０には、暗号演算実行プログラム１８１、認証処理プログラム１８２、応用アプリケーションプログラム１８３などのプログラムと、消去することのないデータを蓄積するデータ蓄積部１８４や、必要に応じてデータを書き換える書換可能データ蓄積部１８５がある。その他に、暗号演算装置１００には暗号演算を行うことを目的としたハードウェアのコプロセッサなどが実装される場合があるが、本実施の形態１に直接関連しないので説明は省略する。【００２３】
（暗号プログラムの一般的な処理）
一般に、暗号演算では、ＣＰＵ１５０が暗号演算実行プログラム１８１をフェッチしながら、レジスタ１５１やＲＡＭ１６０を使い、通信部１７０を介して外部より入力された平文を暗号文に変換する。暗号演算に必要なテーブルデータや鍵データは、データ蓄積部１８４、書換可能データ蓄積部１８５に格納されているので、これらのデータも必要に応じて使われる。演算が終了すると、結果である暗号文が外部に取り出される。【００２４】
（ブロック構成）
図２は、実施の形態２の暗号演算装置１００のブロック図である。暗号演算装置１００は、データ書込部１１０と、暗号演算実行部１２０と、平文が格納される平文格納部１３０、レジスタ、暗号演算に使用する記憶領域１４０を備える。データ書込部１１０、暗号演算実行部１２０は、図１の暗号演算実行プログラム１８１に対応する。平文格納部１３０は、図１のＲＡＭ１６０に対応する。記憶領域１４０は、図１のレジスタ１５１、ＲＡＭ１６０、ＲＯＭ１８０などに対応する。データ書込部１１０は、後述のように、ＣＰＵを用いることにより、暗号演算の前に、記憶領域１４０に平文を書き込む。また、暗号演算実行部１２０は、ＣＰＵを用いることにより、データ書込部１１０による記憶領域１４０への平文の書き込み後に、記憶領域１４０を使用して暗号演算を実行する。データ書込部１１０、暗号演算実行部１２０については、動作の説明で後述する。【００２５】
（ＩＣカード）
図３は、実施の形態１の暗号演算装置１００の典型的な実施形態のひとつであるＩＣ（Ｉｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）カード１を示す。ＩＣカード１の内部には、ＩＣが埋め込まれている。ＩＣカード１は、外部とのＩ／Ｆ（ＩｎｔｅｒＦａｃｅ）を司る端子１１を持つ。端子１１には、ＧＮＤ端子、電力を供給する端子、データ通信端子、データ書込端子などがある。ＩＣカード１は、図１に示したハードウェア資源を有する。以下の説明では、暗号演算装置１００をＩＣカード１と想定して説明する。【００２６】
（一般的な暗号化処理）
図４は、一般的な処理手順のフローチャートである。図４を参照して、暗号演算の一般的な処理手順を説明する。Ｓ１００では、処理が開始される。Ｓ１０１では、端子１１に電源が供給され、電源がＯＮする。Ｓ１０２では、暗号演算実行プログラム１８１がフェッチされ、メモリの確保などの初期化が行われる。Ｓ１０３では、ＣＰＵ１５０は端子１１から平文が入力されるのを待ち、平文が入力されると平文をＲＡＭ１６０などに格納する。Ｓ１０４では、暗号演算実行プログラム１８１がフェッチされ、レジスタ１５１やＲＡＭ１６０を使って暗号演算が行われる。Ｓ１０５では、演算結果である暗号文が取り出される。Ｓ１０６では、ＣＰＵ１５０は、暗号演算処理を続行するかを判断し、続行の場合、処理はＳ１０２に戻り、以下同様に処理される。続行を取りやめる場合は、処理はＳ１０７に移り、電源がＯＦＦされる。
そして、Ｓ１０８で終了する。【００２７】
（暗号演算装置１００の特徴）
図５は、ＩＣカード１（暗号演算装置１００）により実行される暗号処理の特徴を示すフローチャートである。図中のＳ２００以外は、図４と同一である。実施の形態１のＩＣカード１の暗号処理では、図４におけるＳ１０３（平文入力処理）とＳ１０４（暗号演算）との間に、レジスタ・メモリ入力処理（Ｓ２００）が挿入されている。【００２８】
（Ｓ２００の内容）
図５に示すように、ＩＣカード１は、平文（変換対象データ）を入力する処理（Ｓ１０３）と、入力された平文を暗号演算の実行により暗号化（データ変換）する処理（Ｓ１０４）とを含む暗号化処理（入力変換処理）を繰り返し実行する（図５の破線で囲まれた範囲）。
（１）Ｓ２００において、データ書込部１１０は、ＣＰＵ１５０を用いることにより、それぞれの暗号化処理における暗号演算（Ｓ１０４）の実行前に、この暗号演算に使用されるレジスタ１５１やメモリ（ＲＡＭ、ＲＯＭ）等の所定の記憶領域１４０に、暗号化処理（暗号演算）ごとに変化する「変化データ」を書き込む。図５の場合は、「変化データ」として、平文を書き込む例を示している。ここで、暗号化処理ごとに変化する「変化データ」とは、図５の破線部のループごとに、前回のデータ書き込み（Ｓ２００）のデータと、今回のデータ書き込み（Ｓ２００）のデータとが、異なることを意味する。例えば、データ書込部１１０は、図５の破線部のループごとに、Ｓ２００において「異なるデータ」（変化データ）を所定の記憶領域に書き込む。
（２）Ｓ１０４において、暗号演算実行部１２０は、ＣＰＵ１５０を用いることにより、データ書込部１１０による記憶領域１４０への前記所定のデータの書き込み後に、記憶領域１４０を使用して暗号演算を実行する。【００２９】
すなわち、Ｓ２００では、データ書込部１１０が、暗号演算（Ｓ１０４）で使用され、書き換えられるレジスタ、メモリに、平文の一部ないし全部をデータ（変化データ）として書き込む。このような処理を入れることで、暗号演算（Ｓ１０４）で使用されるすべてのレジスタ及びメモリは、暗号演算実行部１２０による暗号演算の開始前に、毎回変わる平文で満たされることになる。つまり、暗号処理（Ｓ１０４）で使用されるレジスタやメモリの直前の状態は、暗号演算の度ごとに異なることになる。これにより、図６、図７に示す効果を得ることができる。図６、図７を用いてＳ２００を追加した場合の効果を説明する。なお、暗号演算に使用されるレジスタ、メモリの記憶領域は予め設定されているので、データ書込部１１０は、書き込むべき記憶領域を特定可能である。【００３０】
次に、図４と図５のフローを比較し、サイドチャネル攻撃の一種である電力解析を行った一例を示し、その効果について述べる。【００３１】
図６は、図４のフローと図５のフローとに対する電力解析の結果の比較を示している。
「（Ａ）レジスタ入力なし」のグラフが図４のフローの結果を示している。
「（Ｂ）レジスタ入力あり」のグラフが図５のフローの結果を示している。
これらのグラフは、図４、図５の動作をＣＰＵ１５０に実行させ、その消費電力を測定し、電力解析を行った結果である。グラフ上部の８本のトレースが、電力解析の結果である。
「（Ａ）レジスタ入力なし」では、円で囲まれた範囲Ａには形状を同じくしたトレースが観測される。これが漏洩した「秘密情報」に関するものである。ピークの高さが漏洩する「秘密情報」の量に依存して変化する。一方、範囲Ａに対応する範囲Ｂを見るとわかるように、「（Ｂ）レジスタ入力あり」の場合は、漏洩した「秘密情報」に関わるトレースは観測されていない。つまり、図６は、図５の「レジスタ・メモリ入力処理」（Ｓ２００）の処理を追加することで、漏洩する「秘密情報」の量を減少できたことを示している。なお、グラフ下部のトレースは、観測した消費電力、トリガ信号、クロック信号を示している。【００３２】
図７は、図６に示した現象を模式的に表した図である。
（ａ）と（ｃ）とが「（Ａ）レジスタ入力なし」の模式図である。
（ｂ）と（ｄ）が「（Ｂ）レジスタ入力あり」の模式図である。
あるレジスタの１ビットに着目して、時刻ｔ０に「秘密情報」に関わるデータが書き込まれるとする。【００３３】
（レジスタ入力なし：（ａ），（ｃ））
「（Ａ）レジスタ入力なし」では、初期化処理Ｓ１０１でレジスタのビット値が０に初期化される。よって、初期化後から時刻ｔ０の以前までは、信号レベルは０である。その後、時刻ｔ０で「秘密情報」に関わるデータが書き込まれる。「秘密情報」に関わるデータは、０であるか、１であるかわからないので、（ａ）では２つの信号レベルを表示している。（ｃ）は、平文を変えて多数回電力トレースを測定し、それらの平均をとった場合を示している。（ｃ）では、時刻ｔ０以前の信号レベルは０であるので、平均電力トレースでも信号レベルは０である。時刻ｔ０以降では、１信号の電力トレースでは０であるか、１であるかわからないので、その平均は理論上０．５となる。しかし、実際のデバイスの消費電力は、０と１の状態で消費電力が若干違っている。このため、０．５＋Δに相当する電力トレースが得られる。【００３４】
（レジスタ入力あり：（ｂ），（ｄ））
一方、（ｂ）の「（Ｂ）レジスタ入力あり」の場合、初期化処理Ｓ１０１のあとに、平文入力処理Ｓ１０２、レジスタ・メモリ入力処理Ｓ２００があるので、レジスタには平文の一部が保持されている。よって、（ｂ）に示すように、時刻ｔ０の以前も、以降も、信号レベルは０であるか、１であるかわからない。そのため、（ｂ）では、２つの信号レベルを模式的に書いている。（ｄ）は、この電力トレースを、平文を変えて多数測定して平均を求めた場合を示している。
（ｄ）では、時刻ｔ０の以前でも、以降でも、１信号の電力トレースでは０であるか、１であるかわからないので、その平均は理論上０．５となる。しかし、実際のデバイスでは消費電力は０と１の状態で消費される電力が若干違っているので、０．５＋Δに相当する電力トレースが得られる。【００３５】
電力解析の手法によれば、時刻ｔ０以後の期待値で電力トレースを分類し、その差分を求める。期待値が１の場合と、期待値が０の場合では、実際のデバイスでは消費電力が若干違っている。そのため、その平均電力トレースは、「０．５＋Δ１」と「０．５＋Δ０」とでは若干異なっており、その差が漏洩する「秘密情報」として観測されることになる。
（ｃ）では、時刻ｔ０以前では、０に固定されているので、期待値による差分は観測されないが、時刻ｔ０以降ではその差分が観測される。一方、（ｄ）では、時刻ｔ０以前では状態０と状態１とが混在したトレースの差分が得られ、また、時刻ｔ０以降では状態０と状態１がきれいに分離した状態でのトレースの差分が得られることになる。時刻ｔ０の前後の電力トレースの差は、（ｃ）、（ｄ）を見ればわかるように、（ｄ）のほうがはるかに小さくなる。その結果、図６のようなデータが得られる。【００３６】
（トランジスタ遷移の場合）
話を簡略化するために、状態１と状態０とで消費電力が違う場合を説明したが、電力を消費するのが、状態が１から０に変化する場合（例えば論理回路を構成するトランジスタの状態遷移）、および、状態が０から１に変化する場合であっても同様に説明することができる。この時は、状態が１から０に変化する場合と、状態が１から０に変化する場合ではＣＰＵ内部のトランジスタにより消費される電力に若干の違いがあるからである。このように、レジスタ、あるいはメモリに暗号演算前に平文を満たすことで、トランジスタの状態遷移についても電力解析からの攻撃に対抗することができる。【００３７】
本実施の形態１では、暗号演算の前に、暗号演算に使用されるすべてのレジスタ、メモリに、１回の暗号演算ごとに変化する平文を、暗号演算開始以前に入力したので、レジスタ、メモリのデータの状態の固定化を回避でき、そのレジスタ、メモリに暗号演算途中の「秘密情報」含むデータが上書きされる。その結果、レジスタ、メモリのデータの書き込み前後のデータの状態をともに不定状態とすることができる。このため、サイドチャネル攻撃に曝されて漏洩する「秘密情報」の量を低減し、サイドチャネル攻撃に対する耐性を向上させることができる。【００３８】
また、マスクを使用しないので、マスクを交換する必要もなく、処理時間に影響を与えないという効果もある。【００３９】
（レジスタに書き込むデータ）
以上の実施の形態１では、１回の暗号演算ごとに変化するデータとして平文を挙げた。しかし、平文は一例である。平文に限らず、１回の暗号演算ごとに変化するデータ（変化データ）であれば、レジスタ等に書き込まれるデータは、プロセスＩＤ（ＩＤｅｎｔｉｆｉｃａｔｉｏｎ）や、ＣＰＵ１５０により生成される現在の時刻などでもよい。また、暗号文を復号する場合（暗号演算装置１００が復号装置の場合）は、変換対象データとして入力された暗号文を「１回の暗号演算ごとに変化するデータ」としてレジスタ等に書き込んでもよい。また、暗号演算装置１００が暗号化装置の場合でも、平文から変換された暗号文を変化データとして書き込んでもよい。また、実施の形態２で述べるように、乱数でもよい。【００４０】
本実施の形態１では、暗号演算装置１００の実現形態としてＩＣカード１を挙げたが、一例である。ＣＰＵを用いて暗号演算を行うものであれば、本実施の形態１で述べたサイドチャネル攻撃に曝されて漏洩する「秘密情報」の量を低減することができる。例えば、ワンチップマイコンや、ＰＣ（Ｐｅｒｓｏｎａｌ  Ｃｏｍｐｕｔｅｒ）などで使用されるＣＰＵにも効果がある。【００４１】
実施の形態２．
次に図８、図９を参照して、実施の形態２の暗号演算装置を説明する。実施の形態２は、平文の代わりに乱数をレジスタ等に書き込む実施形態である。図８は、実施の形態２のＩＣカード１（暗号演算装置１００）のハードウェア構成を示す図である。図８は、図１の構成に対して、乱数発生器１９０が追加された構成である。すなわち実施の形態２では、乱数発生器１９０が発生した乱数（Ｒ）が「１回の暗号演算ごとに変化するデータ」として使用される。【００４２】
（乱数の使用）
図９は、実施の形態２の暗号演算のフローを示す。図９は図５のフローチャートの「Ｓ２００」がＳ２０１に置き換わっている。Ｓ２０１は、レジスタ・メモリ入力処理（Ｒ）Ｓ２０１である。Ｓ２０１では、暗号演算（Ｓ１０４）で使用されるすべての書替えるべきレジスタ、メモリに、データ書込部１１０が、乱数発生器１９０がＣＰＵを用いて発生させた乱数、または、その一部を、データとして書き込む。このような処理を入れることで、実施の形態１と同様に、使用されるすべてのレジスタ、メモリは、予測不能な乱数で満たされることになる。つまり、暗号演算（Ｓ１０４）で使用されるレジスタやメモリの直前の状態は、演算の度ごとに異なることになる。【００４３】
従って、実施の形態２における効果は、図６の場合と同様になる。さらに、乱数を使ったことにより、レジスタ、メモリの使用直前の状態が外部から推定できなくなるので、選択的平文攻撃に対する耐性も増すことができる。【００４４】
また、マスクを使用しないので、マスクを交換する必要もなく、処理時間に影響を与えない。【００４５】
実施の形態３．
次に図１０〜図１４を参照して実施の形態３を説明する。実施の形態３は、変数の使用方法に関するものである。ＩＣカード１（暗号演算装置１００）の構成は、実施の形態１と同様である。図１０は、変数の使用を示すフローチャートである。図１０は、図４の暗号演算（Ｓ１０４）の処理内部において、変数を使用する場合を示すフローチャートである。【００４６】
Ｓ１０４の内部処理は、Ｓ５００から始まる。Ｓ５０１で変数が生成される。生成された変数は、Ｓ５０２において、データ書込部１１０により、暗号演算の度ごとに変化するデータ（変化データ）が入力されてから、暗号演算実行部１２０による暗号演算に使用される（Ｓ５０３）。なお、変数に変化データが入力される（書き込まれる）とは、その変数のデータが書き込まれるべき記憶領域に変化データを書き込むことを意味する。暗号演算が終了すると、暗号演算実行部１２０は、変数に使用したメモリを解放して（Ｓ５０４）、Ｓ５０５で変数処理が終わる。「変化データ」は、実施の形態１、実施の形態２で述べたように、平文、乱数、暗号、時刻、プロセスＩＤなどである。【００４７】
図１０で示したように、暗号演算装置１００は、平文（変換対象データ）を入力する処理と、入力された平文（変換対象データ）を変数を用いた暗号演算の実行により暗号化（データ変換）する処理とを含む暗号化処理（入力変換処理）を繰り返し実行する。そして、データ書込部１１０は、ＣＰＵ１５０を用いて、それぞれの暗号化処理における暗号演算（Ｓ５０３）での変数の使用前に、変数に、暗号化処理ごとに変化する平文（変化データの一例）を書き込む。そして、暗号演算実行部１２０は、ＣＰＵ１５０を用いることにより、データ書込部１１０による変数への平文の書き込み後に、変数を使用する暗号演算を実行する。すなわち、データ書込部１１０は、ＣＰＵ１５０を用いることにより、それぞれの暗号化処理（データ変換処理）における暗号演算（Ｓ１０４）での変数の使用前に、変数のデータが格納される記憶領域に、暗号化処理ごとに変化する変化データを書き込む。これにより、変数の状態は、暗号演算の度ごとに異なることになるので、図６で述べた効果が得られる。また、マスクを使用しないので、マスクを交換する必要もなく、処理時間に影響を与えない。【００４８】
（変数使用の具体的な場合）
次に図１１〜図１４を参照して、変数を使用する具体的な場合として、関数を呼び出す場合を説明する。すなわち以下の例は、プログラミングでよく使われる「関数呼出し」に関わるものである。暗号演算では、同様な処理を何回も行うので、効率のよいプログラムとするために関数を作成し、この関数に値を与えて演算を実行する。【００４９】
（関数呼出の一般的なフロー）
図１１は、一般の関数呼出しフローであり、図４のＳ１０４の内部処理を示している。Ｓ３００で、関数呼出が開始される。Ｓ３０１で、関数が呼び出される。この際、関数で使用される値は、「Ｃａｌｌ  ｂｙ  ｖａｌｕｅ（値呼出し）」もしくは「Ｃａｌｌ  ｂｙ  ｒｅｆｅｒｅｎｃｅ（参照呼出し）」で関数に渡される。Ｓ３０２では、関数内部で使用される変数が生成される。生成された変数は初期値が設定される。Ｓ３０３では、関数に渡された値と生成した変数を用いて暗号演算を行う。演算が終了すると、結果をＳ３０４で関数呼出し側に引き渡して、変数を開放し、Ｓ３０５で終了する。【００５０】
（暗号演算装置１００の特徴）
図１２は、実施の形態３の暗号演算装置１００による関数呼出しのフローを示す。図１２は、図１０のＳ１０４の内部処理に相当する。また、図１３は、図１２を説明するための概念図である。【００５１】
図１２、図１３を使用して説明する。
（１）データ書込部１１０は、関数で使用される変数ａ，ｂ，ｃを生成する（Ｓ３０２）。
（２）データ書込部１１０は、生成した変数ａ，ｂ，ｃに１回の暗号演算ごとに変化するデータ（平文またはその一部）を入力する（Ｓ４００）。
（３）データ書込部１１０は、関数を「Ｃａｌｌ  ｂｙ  ｒｅｆｅｒｅｎｃｅ」で呼び出す（Ｓ４０１）。関数呼出しでは、データ書込部１１０は、関数で使用される値ｘ、ｙ（引数）とともに、Ｓ４００にて平文を書き込んだ変数ａ，ｂ，ｃを「Ｃａｌｌ  ｂｙ  ｒｅｆｅｒｅｎｃｅ」で関数に渡す。
（４）暗号演算実行部１２０は、ＣＰＵを用いることにより、変数が引き渡された関数を用いて暗号演算を実行する。Ｓ４００の処理により、関数で使用される直前の関数内部で使用される値、および、変数の状態は、暗号演算の度ごとに異なることになるので、図６で述べた効果が得られる。また、マスクを使用しないので、マスクを交換する必要もなく、処理時間に影響を与えない。【００５２】
図１２の場合は、変数を生成してから関数を呼び出したが、データ書込部１１０が関数を「Ｃａｌｌ  ｂｙ  ｒｅｆｅｒｅｎｃｅ」で呼び出した後に、データ書込部１１０が関数内部で変数を生成し、平文の変数入力処理を行い、その後、暗号演算を行ってもよい。この場合、平文はグローバル変数に格納することで、関数内部から参照することができる。図１４は、関数を呼び出した後に、変数を生成し、変数に平文を書き込むフローチャートである。また、図１５は、図１４を説明するための概念図である。図１４は、図１２の関数呼び出し（Ｓ４０１）を最初にしたフローになっている。
（１）データ書込部１１０は、関数を「Ｃａｌｌ  ｂｙ  ｒｅｆｅｒｅｎｃｅ」で呼び出す（Ｓ４０１）。
（２）次に、データ書込部１１０は、関数内部において変数ａ，ｂ，ｃを生成する（Ｓ３０２）。
（３）データ書込部１１０は、生成した変数ａ，ｂ，ｃに１回の暗号演算ごとに変化するデータ（平文またはその一部）を入力する（Ｓ４００）。
（４）暗号演算実行部１２０は、平文が書き込まれた変数を関数に適用し、この関数を用いて暗号演算を実行する（Ｓ３０３）。前記Ｓ４００の処理により、関数で使用される直前の関数内部で使用される値、および、変数の状態は、暗号演算の度ごとに異なることになるので、図６で述べた効果が得られる。また、マスクを使用しないので、マスクを交換する必要もなく、処理時間に影響を与えない。【００５３】
以上の実施の形態１では、
ＣＰＵがレジスタやメモリを使用して暗号演算を行う装置において、暗号演算を開始する以前に、演算に使用するレジスタやメモリに、暗号演算ごとに変化するデータを書き込み、暗号演算を行うことを特徴とする暗号演算装置を説明した。【００５４】
以上の実施の形態２、３では、
ＣＰＵがレジスタやメモリを使用し、関数を利用した暗号演算を行う装置において、関数を呼び出す前に関数で使用する変数を生成し、その変数に暗号演算ごとに変化するデータを書き込み、その変数および関数で使用される値をＣａｌｌ  ｂｙ  ｒｅｆｅｒｅｎｃｅで関数に引き渡し、暗号演算を行うことを特徴とする暗号演算装置を説明した。【００５５】
以上の実施の形態２、３では、
ＣＰＵがレジスタやメモリを使用し、関数を利用した暗号演算を行う装置において、関数で使用される値をＣａｌｌ  ｂｙ  ｒｅｆｅｒｅｎｃｅで関数に引き渡し、その後、関数内部で使用される変数を生成し、その変数に暗号演算ごとに変化するデータを書き込み、その変数および関数で使用される値を使って暗号演算を行うことを特徴とする暗号演算装置を説明した。【００５６】
以上の実施の形態２、３では、
ＣＰＵがレジスタやメモリを使用し、暗号演算を行う装置において、変数を生成し、その変数に暗号演算ごとに変化するデータを書き込み、その変数を使用して暗号演算を行うことを特徴とする暗号演算装置を説明した。【００５７】
以上の実施の形態１〜３では、
暗号演算ごとに変化するデータは、平文と、暗号文と、プロセスＩＤと、時刻を示す時刻データと、乱数とのいずれかである暗号演算装置を説明した。【００５８】
以上の実施の形態１〜３で説明した暗号演算装置は、暗号演算プログラムとしても実現可能であり、また暗号演算プログラムを記録した「コンピュータにより実行可能な記録媒体」としても実現可能である。また、以上の実施の形態で説明した暗号演算装置の動作をステップとみることで、暗号演算方法として実現することも可能である。
【図面の簡単な説明】
【００５９】
【図１】実施の形態１の暗号演算装置のハードウェア資源の例を示す図。
【図２】実施の形態１の暗号演算装置のブロック図。
【図３】実施の形態１の暗号演算装置の適用例であるＩＣカード。
【図４】実施の形態１の暗号演算の一般的な手順を示すフローチャート。
【図５】実施の形態１の暗号演算装置による暗号演算のフローチャート。
【図６】実施の形態１の暗号演算装置の効果を示す図。
【図７】実施の形態１の暗号演算装置の効果の理由を説明する図。
【図８】実施の形態２の暗号演算装置のハードウェア資源を示す図。
【図９】実施の形態２の暗号演算装置による暗号演算のフローチャート。
【図１０】実施の形態３の変数を使用するフローチャート。
【図１１】実施の形態３の関数を使用するフローチャート。
【図１２】実施の形態３の変数生成後に関数を呼び出すフローチャート。
【図１３】図１２を説明する図。
【図１４】実施の形態３の関数呼び出し後に変数を生成するフローチャート。
【図１５】図１４を説明する図。
【符号の説明】
【００６０】
１  ＩＣカード、１１  端子、１００  暗号演算装置、１１０  データ書込部、１２０  暗号演算実行部、１４０  記憶領域、１５０  ＣＰＵ、１５１  レジスタ、１５３  バス、１６０  ＲＡＭ、１７０  通信部、１８０  ＲＯＭ、１８１  暗号演算実行プログラム、１８２  認証処理プログラム、１８３  応用アプリケーションプログラム、１８４  データ蓄積部、１８５  書換可能データ蓄積部、１９０  乱数発生器。
【図１】
2009118829.tif 000003
【図２】
2009118829.tif 000004
【図３】
2009118829.tif 000005
【図４】
2009118829.tif 000006
【図５】
2009118829.tif 000007
【図６】
2009118829.tif 000008
【図７】
2009118829.tif 000009
【図８】
2009118829.tif 000010
【図９】
2009118829.tif 000011
【図１０】
2009118829.tif 000012
【図１１】
2009118829.tif 000013
【図１２】
2009118829.tif 000014
【図１３】
2009118829.tif 000015
【図１４】
2009118829.tif 000016
【図１５】
2009118829.tif 000017
【国際調査報告】
2009118829.tif 000018
2009118829.tif 000019