(57)【要約】【課題】公開鍵暗号におけるモジュラーべき乗算計算方法において、利用可能なリソース内で最適な実装が可能で、サイドチャネル攻撃に耐性を有するモジュラーべき乗算計算方法を提供する。【解決手段】公開鍵暗号において、べき指数ｄ、公開モジュラスＮ、ベース元ｇからモジュラーべき乗算ｇｄ  ｍｏｄ  Ｎを計算するモジュラーべき乗算計算装置において、べき指数を０及び正の整数からなる数値列に変換し、その数値列を用いてモジュラー乗算を行う。【選択図】図６
2007187908.tif 000002
【特許請求の範囲】
【請求項１】
公開鍵暗号において、数値列で表されるべき指数ｄ、公開モジュラスＮ、ベース元ｇからモジュラーべき乗算ｇｄ  ｍｏｄ  Ｎを計算するモジュラーべき乗算計算装置であって、
前記べき指数ｄを所定のビット長毎に０を予め定めた範囲の非０の値に置き換えることにより得られる同値表現である他の数値列、および、前記ベース元ｇを用いて予め計算した値が格納される前計算テーブルを用いて前記モジュラーべき乗算を計算する実計算手段、を備えること
を特徴とするモジュラーべき乗算計算装置。
【請求項２】
請求項１記載のモジュラーべき乗算計算装置であって、
前記ベース元ｇを用いて前記値を計算して格納することにより前記前計算テーブルを生成する前計算手段をさらに備えること
を特徴とするモジュラーべき乗算計算装置。
【請求項３】
請求項２記載のモジュラーべき乗算計算装置であって、
前記実計算手段は、前記他の数値列を得るエンコード手段を備え、
前記エンコード手段は、
前記べき指数ｄを所定のビット長ｗ毎に読み出し、それぞれ数値に変換する変換手段と、
前記変換手段において変換された各数値について、それぞれ０以下の値であるか否かを判定する判定手段と、
前記判定手段において０以下と判定された場合、当該数値を予め定めた規則に従って変換する再変換手段と、を備え、
前記前計算手段は、前記ベース元ｇのｉ乗（ｉは予め定められた値以下の自然数）それぞれのモジュラー乗算を行い、前記ベース元ｇを用いて計算した値として前記前計算テーブルに格納すること、
を特徴とするモジュラーべき乗算計算装置。
【請求項４】
請求項２記載のモジュラーべき乗算計算装置であって、
予め与えられた前記前計算テーブルに格納する元の数ｋを用いて、前記所定のビット長ｗを計算するとともに前記前計算テーブルに格納する格納候補を作成する分数ウィンドウ生成手段と、をさらに備え、
前記実計算手段は、前記他の数値列を得るエンコード手段を備え、
前記エンコード手段は、
前記べき指数ｄを所定のビット長ｗおよびｗ−１毎に読み出し、それぞれ第一の数値と当該第一の数値に対応する第二の数値とに変換する変換手段と、
前記各第一の数値について、それぞれ０以下の値であるか否かを判定する第一の判定手段と、
前記第一の判定手段において０以下と判定された場合、当該第一の数値を予め定めた規則に従って変換する第一の再変換手段と、
前記各第二の数値について、それぞれ０以下の値であるか否かを判定する第二の判定手段と、
前記第二の判定手段において０以下と判定された場合、当該第二の数値を予め定めた規則に従って変換する第二の再変換手段と、
前記第一の数値が所定の値より大きい場合、前記所定のビット長ｗおよび前記格納候補に従って、第一の数値および当該第一の数値に対応する第二の数値のいずれかを選択する選択手段と、を備え、
前記前計算手段は、前記テーブルサイズｋと前記所定のビット長ｗと前記格納候補とを用いて、前記ベース元ｇのｉ乗（ｉは予め定められた値以下の自然数）それぞれのモジュラー乗算計算を行い、当該計算結果のうちｋ個を前記ベース元ｇを用いて計算した値として前記前計算テーブルに格納すること、
を特徴とするモジュラーべき乗算計算装置。
【請求項５】
請求項１から４のいずれか１項記載のモジュラーべき乗算計算装置であって、
前記べき指数ｄを前記他の数値列にエンコードする前に、前記べき指数ｄを変換し、変換後のべき指数を新たにべき指数ｄとするべき指数変換手段をさらに備えること
を特徴とするモジュラーべき乗算計算装置。
【請求項６】
請求項１に記載のモジュラーべき乗算計算装置であって、
前記べき指数変換手段において変換された変換後のべき指数ｄは、上位２ビットが１０であること
を特徴とするモジュラーべき乗算計算装置。
【請求項７】
データからディジタル署名データを生成する署名生成装置であって、
前記署名データ生成時のモジュラーべき乗算に、請求項１〜６記載のモジュラーべき乗算計算装置を用いること
を特徴とする署名生成装置。
【請求項８】
暗号化されたデータを復号する復号化装置であって、
復号時のモジュラーべき乗算に、請求項１〜６記載のモジュラーべき乗算計算装置を用いること
を特徴とする復号化装置。
【請求項９】
公開鍵暗号において、数値列で表されるべき指数ｄ、公開モジュラスＮ、ベース元ｇからモジュラーべき乗算ｇｄ  ｍｏｄ  Ｎを計算するモジュラーべき乗算計算方法であって、
前記べき指数ｄを所定のビット長ｗ毎に０を予め定めた範囲の非０の値に置き換え、同値表現となる他の数値列にエンコードするエンコードステップと、
前記ベース元ｇの前記ベース元ｇのｉ乗（ｇｉ、ｉは２Ｗ以下の自然数）それぞれのモジュラー乗算結果を格納する前計算テーブルを生成する前計算ステップと、
前記他の数値列および前記前計算テーブルを用いて前記モジュラーべき乗算を計算する実計算ステップと、を備え、
前記エンコードステップは、
当該べき指数ｄから前記所定のビット長ｗを読み出し数値に変換する変換ステップと、
前記変換された数値が０以下の値であるか否かを判定する判定ステップと、
前記判定手段において０以下と判定された場合、当該数値を予め定めた規則に従って変換する再変換ステップと、を前記べき指数ｄの全桁にわたり繰り返すこと
を特徴とするモジュラーべき乗算計算方法。
【請求項１０】
公開鍵暗号において、数値列で表されるべき指数ｄ、公開モジュラスＮ、ベース元ｇからモジュラーべき乗算ｇｄ  ｍｏｄ  Ｎを計算するモジュラーべき乗算計算方法であって、
予め与えられた前計算テーブルに格納する元の数ｋを用いて、所定のビット長ｗを計算するとともに前記前計算テーブルに格納する格納候補を作成する分数ウィンドウ生成手段
前記べき指数ｄを前記所定のビット長ｗまたはｗ−１毎に０を予め定めた範囲の非０の値に置き換え、同値表現となる他の数値列にエンコードするエンコードステップと、
前記テーブルサイズｋと前記所定のビット長ｗと前記格納候補とを用いて、前記ベース元ｇのｉ乗（ｇｉ、ｉは２Ｗ以下の自然数）それぞれのモジュラー乗算結果のうちｋ個を前記前計算テーブルに格納することによって前記前計算テーブルを生成する前計算ステップと、
前記他の数値列および前記前計算テーブルを用いて前記モジュラーべき乗算を計算する実計算ステップと、を備え、
前記エンコードステップは、
当該べき指数ｄから前記所定のビット長ｗを読み出し、第一の数値と第二の数値とに変換する変換ステップと、
前記第一の数値について、０以下の値であるか否かを判定する第一の判定ステップと、
前記第一の判定ステップにおいて０以下と判定された場合、当該第一の数値を予め定めた規則に従って変換する第一の再変換ステップと、
前記第二の数値について、０以下の値であるか否かを判定する第二の判定ステップと、
前記第二の判定ステップにおいて０以下と判定された場合、当該第二の数値を予め定めた規則に従って変換する第二の再変換ステップと、
前記第一の数値を所定の値と比較し、当該第一の数値が所定の値より大きい場合、前記所定のビット長ｗおよび前記格納候補に従って、当該第一の数値および前記第二の数値のいずれかを選択する選択ステップと、を前記べき指数ｄの全桁にわたり繰り返すこと
を特徴とするモジュラーべき乗算計算方法。
【請求項１１】
公開鍵暗号において、数値列で表されるべき指数ｄ、公開モジュラスＮ、ベース元ｇからモジュラーべき乗算ｇｄ  ｍｏｄ  Ｎを計算するモジュラーべき乗算計算方法であって、
前記ベース元ｇの前記ベース元ｇのｉ乗（ｇｉ、ｉは２Ｗ以下の自然数、ｗは予め定められたビット長）それぞれのモジュラー乗算結果を格納する前計算テーブルを生成する前計算ステップと、
前記べき指数ｄを所定のビット長ｗ毎に０を予め定めた範囲の非０の値に置き換えて得られる同値表現となる他の数値列、および、前記前計算テーブルを用いて前記モジュラーべき乗算を計算する実計算ステップと、を備え、
前記実計算ステップは、
当該べき指数ｄから前記所定のビット長ｗを読み出し数値に変換する変換ステップと、
前記変換された数値が０以下の値であるか否かを判定する判定ステップと、
前記判定手段において０以下と判定された場合、当該数値を予め定めた規則に従って変換する再変換ステップと、
前記再変換ステップで変換後の数値と前記前計算テーブルを用いてモジュラーべき乗算を計算するモジュラーべき乗算計算ステップと、を前記べき指数ｄの全桁にわたり繰り返すこと
を特徴とするモジュラーべき乗算計算方法。
【請求項１２】
公開鍵暗号において、数値列で表されるべき指数ｄ、公開モジュラスＮ、ベース元ｇからモジュラーべき乗算ｇｄ  ｍｏｄ  Ｎを計算するモジュラーべき乗算計算方法であって、
前記べき指数ｄを所定のビット長ｗ毎に０を予め定めた範囲の非０の値に置き換え、同値表現となる他の数値列にエンコードするエンコードステップと、
前記他の数値列および前記ベース元ｇを用いて予め計算した値が格納される前計算テーブルを用いて前記モジュラーべき乗算を計算する実計算ステップと、を備え、
前記エンコードステップは、
当該べき指数ｄから前記所定のビット長ｗを読み出し数値に変換する変換ステップと、
前記変換された数値が０以下の値であるか否かを判定する判定ステップと、
前記判定手段において０以下と判定された場合、当該数値を予め定めた規則に従って変換する再変換ステップと、を前記べき指数ｄの全桁にわたり繰り返すこと
を特徴とするモジュラーべき乗算計算方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はセキュリティ技術に関し、特に、スマートカード等の暗号機器上への、ＲＳＡ（Ｒｉｖｅｓｔ、Ｓｈａｍｉｒ、Ａｄｅｌｅｍａｎ）等の公開鍵暗号系の暗号アルゴリズムの安全な実装技術に関する。
【背景技術】
【０００２】
電子商取引の普及に伴い、公開鍵暗号系への注目も増大している。公開鍵暗号系、特にディジタル署名は、電子商取引において根源的な要素を成す。
【０００３】
最も有名で、おそらく最も研究されている公開鍵暗号系はＲＳＡ暗号系であり、デファクトスタンダードとなっている。ＲＳＡ暗号系は事前認証の無い二者間における安全な通信を可能とする。この二者をアリスとボブと呼ぶことにする。
【０００４】
アリスは二つの鍵を有している。一つは公開鍵であり、二つの整数（ｅＡ，ＮＡ）により構成され、もう一つは秘密鍵ｄＡである。ＮＡは暗号系の法（モジュラス）と呼ばれ、二つの大きな素数の積である。さらに、ｅＡ、ｄＡは等式ｅＡ＊ｄＡ＝１  ｍｏｄ  Φ（ＮＡ）を満たす。ただし、Φはオイラー関数であり、Φ（ＮＡ）はＮＡを法とする乗法群の位数を示す。すなわち、Φ（ＮＡ）＝（ｐＡ−１）（ｑＡ−１）である。公開鍵は誰でも容易に利用できる一方で、秘密鍵はアリスが秘密裏に保持する。ボブがメッセージＭを暗号化する場合、暗号文Ｃは、Ｃ＝ＭｅＡ  ｍｏｄ  ＮＡにより計算される。アリスが暗号文Ｃを復号する場合、メッセージＭは、Ｍ＝ＣｄＡ  ｍｏｄ  ＮＡにより計算される。結果として、アリスは秘密鍵を公開することなく、ボブはアリスに安全にメッセージを送ることができる。
【０００５】
ＲＳＡ暗号系などの有限体上の離散対数問題を利用した暗号系における主要な演算はモジュラーべき乗算である。モジュラーべき乗算は、通常バイナリ法と呼ばれるアルゴリズムを用いて計算される。バイナリ法はべき指数をバイナリ表現で表し、ビットの値が０であるか１であるかによって２乗算、乗算を振り分けて、べき乗算を計算する。メモリが利用可能な場合、べき乗計算を行う前に、事前計算した値をテーブルに格納しておくことができる。ウィンドウ法は、計算コストを削減するために、この事前計算テーブルを利用し、べき乗算を計算する。
【０００６】
近年、数学以外の攻撃により、暗号系の実装が脆弱となる例が見つかった。特に、サイドチャネル情報と呼ばれる漏洩情報を利用するサイドチャネル攻撃は強力な攻撃である。サイドチャネル情報には、計算時間、電力消費量、電磁波などがある。実際、スマートカードなどの装置ではバッテリーを搭載していないため、電力はカードリーダーから供給される。そのため、スマートカードの電力消費量は簡単に計測することができる。電力消費量は、装置が実行する演算と深い関係があり、その演算は秘密鍵によって定まる。サイドチャネル攻撃は、このサイドチャネル情報と秘密鍵との相関関係を利用している。
【０００７】
サイドチャネル攻撃は、解析手法により二つに分類できる。一つはＳＰＡ（Ｓｉｍｐｌｅ  Ｐｏｗｅｒ  Ａｎａｌｙｓｉｓ）攻撃である。この場合、攻撃者は電力消費量を一回のみ計測し、秘密鍵（そのもの、もしくはその部分情報）を推測する。もう一つはＤＰＡ（Ｄｉｆｆｅｒｅｎｔｉａｌ  Ｐｏｗｅｒ  Ａｎａｌｙｓｉｓ）攻撃であり、攻撃者は複数回電力消費量を計測し、統計的な解析により秘密鍵を推測する。これ以外にも、フォールト攻撃と呼ばれる攻撃手法もあり、規定外電圧供給やレーザー光の照射などにより、計算中に作為的に不正な値を発生させ、不正な計算結果をモニタすることにより秘密鍵を推測する。さらに洗練された攻撃であるセーフエラー攻撃と呼ばれる攻撃手法もある。本攻撃は、ダミー演算をターゲットとし、ダミー演算の有無により秘密鍵を推測する。したがって、高セキュリティを要求するようなアプリケーションにおいては、ダミー演算を避けたほうがよい。
【０００８】
ＲＳＡ暗号やＤＳＡ（Ｄｉｇｉｔａｌ  Ｓｉｇｎａｔｕｒｅ  Ａｌｇｏｒｉｔｈｍ）署名などにおいて、ＤＰＡ攻撃を無効化する防御法が数多く知られている一方で、ＳＰＡ攻撃については十分な研究はなされていない。ＳＰＡ攻撃に対する防御法としての最初の試みは、ダミー演算を挿入するものであったが、この場合、計算量が増大する。さらに、ダミー演算を挿入することで対応する実装は、上述のようにセーフエラー攻撃に対して脆弱となる。
【０００９】
ＳＰＡの防御法のひとつであるサイドチャネル原子性（Ａｔｏｍｉｃｉｔｙ）法が非特許文献１に記載されている。サイドチャネル原子性法は、ダミー演算をよりうまく利用する。すなわち、本防御法では、各演算を識別不能ないわゆる原子ブロックと呼ばれる単位を用いて実装する。例えば、演算ＡはＡ＝α｜α｜α、演算ＢはＢ＝α｜αなどのように、各演算が原子ブロックαの列により実装される。本防御法によれば、電力消費量により、原子ブロックαの列を特定することは可能であるが、それが演算Ａであるか演算Ｂであるのかまでは特定することはできない。しかしながら、一般的に、サイドチャネル原子性法をそのまま実装することは困難である。本防御法を実装するにあたり、原子ブロックを構成するためにダミー演算が挿入される。先と同様に、ダミー演算を挿入することによりセーフエラー攻撃に対して脆弱となる。さらに、サイドチャネル原子性法の別の問題点は、攻撃者は依然として、原子ブロックの数を数えることができ、秘密情報（の一部）を特定することができることである。
【００１０】
ＳＰＡ攻撃を防ぐための別のアプローチには、演算列のランダム化（ランダム化アルゴリズムと呼ぶ。）がある。すなわち、ランダム化アルゴリズムでは、アルゴリズム中の条件分岐を、秘密情報だけで定まるものとせず、ランダムな選択も追加的に行われるよう構成する。近年、そのようなランダム化アルゴリズムに基づく防御法、例えばＨａ−Ｍｏｏｎ法（もともとは楕円曲線暗号用に開発された）などが、ＲＳＡ暗号やＤＳＡ署名などの暗号系に適用されている。このＨａ−Ｍｏｏｎ法の改良手法が非特許文献２に記載されている。しかしながら、Ｈａ−Ｍｏｏｎ法には脆弱性が示されている。このため、Ｈａ−Ｍｏｏｎ法の適用は、セキュリティ的には問題がある。すなわち、安全性を実現するためには、他の防御法を併用する必要があり、オーバーヘッドがその分大きくなる。
【００１１】
また、楕円曲線暗号におけるＳＰＡ攻撃への防御法が非特許文献３に記載されている。
【００１２】
【非特許文献１】Ｂ．  Ｃｈｅｖａｌｌｉｅｒ，  Ｍ．  Ｃｉｅｔ，  Ｍ．  Ｊｏｙｅ，  “Ｌｏｗ−Ｃｏｓｔ  Ｓｏｌｕｔｉｏｎｓ  ｆｏｒ  Ｐｒｅｖｅｎｔｉｎｇ  Ｓｉｍｐｌｅ  Ｓｉｄｅ−Ｃｈａｎｎｅｌ  Ａｎａｌｙｓｉｓ：  Ｓｉｄｅ  Ｃｈａｎｎｅｌ  Ａｔｏｍｉｃｉｔｙ”，  Ｃｒｙｐｔｏｌｏｇｙ  ｅＰｒｉｎｔ  Ａｒｃｈｉｖｅ  Ｒｅｐｏｒｔ  ２００３／２３７，  （２００３）．［平成１８年１月５日検索］インターネット＜ＵＲＬ  ：  ｈｔｔｐ：／／ｅｐｒｉｎｔ．ｉａｃｒ．ｏｒｇ／２００３／２３７．ｐｄｆ＞
【非特許文献２】Ｓ．Ｍ．  Ｙｅｎ，  Ｃ．Ｎ．  Ｃｈｅｎ，  Ｓ．Ｊ．  Ｍｏｏｎ，  Ｊ．Ｃ．  Ｈａ，  “Ｉｍｐｒｏｖｅｍｅｎｔ  ｏｎ  Ｈａ−Ｍｏｏｎ  Ｒａｎｄｏｍｉｚｅｄ  Ｅｘｐｏｎｅｎｔｉａｔｉｏｎ  Ａｌｇｏｒｉｔｈｍ”，  Ｉｎｆｏｒｍａｔｉｏｎ  Ｓｅｃｕｒｉｔｙ  ａｎｄ  Ｃｒｙｐｔｏｌｏｇｙ  −ＩＣＩＳＣ  ２００４，  ＬＮＣＳ  ３５０６，  （２００４），  ｐｐ．１５４−１６７．
【非特許文献３】Ｋ．  Ｏｋｅｙａ，  Ｔ．  Ｔａｋａｇｉ，  Ｃ．  Ｖｕｉｌｌａｕｍｅ，  “Ｏｎ  ｔｈｅ  Ｅｘａｃｔ  Ｆｌｅｘｉｂｉｌｉｔｙ  ｏｆ  ｔｈｅ  Ｆｌｅｘｉｂｌｅ  Ｃｏｕｎｔｅｒｍｅａｓｕｒｅ  ａｇａｉｎｓｔ  Ｓｉｄｅ  Ｃｈａｎｎｅｌ  Ａｔｔａｃｋｓ”，  ｔｈｅ  ９ｔｈ  Ａｕｓｔｒａｌａｓｉａｎ  Ｃｏｎｆｅｒｅｎｃｅ  ｏｎ  Ｉｎｆｏｒｍａｔｉｏｎ  Ｓｅｃｕｒｉｔｙ  ａｎｄ  Ｐｒｉｖａｃｙ  （ＡＣＩＳＰ  ２００４），  ＬＮＣＳ  ３１０８，  （２００４），  ｐｐ．４６６−４７７．
【発明の開示】
【発明が解決しようとする課題】
【００１３】
スマートカードなどのリソースが限られた機器上に暗号アルゴリズムの実装を行う場合、利用可能なリソースが少ない中で最適な実装を行い、サイドチャネル攻撃に対する耐性を高める必要がある。上述のように、有限体上の離散対数問題を利用した暗号系における主要な演算はモジュラーべき乗算である。従って、モジュラーべき乗算が、具体的には以下の６項目を満たすものである必要がある。
（ａ）ＳＰＡ攻撃に耐性を有すること（ＳＰＡにより得た情報が攻撃者にとって役立たないものとすること。）
（ｂ）ダミー演算を用いないこと（セーフエラー攻撃に対して安全なものとするためである。）
（ｃ）効率的な演算処理が可能であること（メモリ使用量や計算量が、通常レベルの脆弱性を有するモジュラーべき乗算計算方法と同程度であること。）
（ｄ）メモリ使用量と計算量とのトレードオフが自在であること
（ｅ）ＲＳＡ暗号アルゴリズム、ＤＳＡ暗号アルゴリズムへの適用が可能であること
（ｆ）任意のＤＰＡ攻撃に対する防御法と結合可能であること
上記非特許文献１の技術は、（ａ）のＳＰＡ攻撃への耐性については考慮されているが、（ｂ）のダミー演算の不使用については十分に考慮されていない。
【００１４】
また、上記非特許文献２の技術は、（ｅ）のＲＳＡ暗号アルゴリズム、ＤＳＡ暗号アルゴリズムへの適用については考慮されているが、（ａ）の安全性や（ｃ）の効率性については十分考慮されていない。
【００１５】
また、上記非特許文献３の技術は、（ｄ）のメモリ使用量と計算量とのトレードオフの可能性について考慮されているが、（ｅ）のＲＳＡ暗号アルゴリズム、ＤＳＡ暗号アルゴリズムへの適用については計算量の重い逆元計算を必要とするため、十分考慮されていいない。
【００１６】
本発明は上記事情に鑑みてなされたもので、公開鍵暗号におけるモジュラーべき乗算計算方法において、上記諸項目を満たすモジュラーべき乗算計算方法、すなわち、利用可能なリソース内で最適な実装が可能で、サイドチャネル攻撃に耐性を有するモジュラーべき乗算計算方法を提供することを目的とする。
【課題を解決するための手段】
【００１７】
本発明は、公開鍵暗号において、べき指数ｄ、公開モジュラスＮ、ベース元ｇからモジュラーべき乗算ｇｄ  ｍｏｄ  Ｎを計算するモジュラーべき乗算計算装置において、べき指数を０及び正の整数からなる同値表現の数値列に変換し、その数値列を用いてモジュラー乗算を行う。
【００１８】
本発明は、公開鍵暗号において、べき指数ｄ、公開モジュラスＮ、ベース元ｇからモジュラーべき乗算ｇｄ  ｍｏｄ  Ｎを計算するモジュラーべき乗算計算装置であって、上記変換べき指数ｄを固定パターンを有する数値列にエンコードし、予め作成した上記ベース元ｇの前計算テーブルを用い、上記エンコードした数値列のモジュラーべき乗算を計算する。
【００１９】
具体的には、公開鍵暗号において、数値列で表されるべき指数ｄ、公開モジュラスＮ、ベース元ｇからモジュラーべき乗算ｇｄ  ｍｏｄ  Ｎを計算するモジュラーべき乗算計算装置であって、前記べき指数ｄを所定のビット長毎に０を非０に置き換えることにより得られる同値表現である他の数値列、および、前記ベース元ｇのｉ乗（ｇｉ、ｉは予め定められた値以下の自然数）それぞれのモジュラー乗算結果を格納する前計算テーブルを用いて前記モジュラーべき乗算を計算する実計算手段、を備えることを特徴とするモジュラーべき乗算計算装置を提供する。
【発明の効果】
【００２０】
本発明によれば、公開鍵暗号におけるモジュラーべき乗算計算方法において、利用可能なリソース内で最適な実装が可能で、サイドチャネル攻撃に耐性を有するモジュラーべき乗算計算方法を実現することができる。
【発明を実施するための最良の形態】
【００２１】
以下、本発明の実施の形態を図面を用いて詳細に説明する。
【００２２】
＜＜第一の実施形態＞＞
図１は、本発明を適用した本実施形態の暗号化通信システムのシステム構成図である。本図に示すように、本実施形態の暗号化通信システムは、本実施形態のモジュラーべき乗算方法を適用したコンピュータＡ１０１およびコンピュータＢ１２１がネットワーク１４２により接続されている。コンピュータＡ１０１は、メッセージの暗号化を行い、コンピュータＢ１２１は、暗号化されたメッセージの復号を行う。
【００２３】
コンピュータＡ１０１では、メッセージＭの暗号化を、Ｃ＝Ｍｅ  ｍｏｄ  Ｎを計算することにより行い、コンピュータＢ１２１では、暗号文Ｃの復号を秘密鍵ｄおよび暗号文ＣからＭ＝Ｃｄ  ｍｏｄ  Ｎを計算することにより行う。ここでＭはメッセージ、Ｃは暗号文、ｄは秘密鍵を示す定数、ｅ、Ｎは公開鍵を示す定数である。ネットワーク１４２上には、暗号文Ｃのみ送出され、ＣからメッセージＭを復元するためには、秘密鍵ｄが必要である。ところが、秘密鍵ｄはネットワーク１４２上には送出されないため、秘密鍵ｄを保持しているものだけが、Ｍを復元できることになる。
【００２４】
コンピュータＡ１０１は、記憶部１０２および処理部１１２を備える。また、処理部１１２は、入力されたメッセージＭの暗号化を行う暗号化部１１３およびモジュラーべき乗算計算部１１６を備える。ここで、モジュラーべき乗算計算部１１６は、暗号化部１１２で暗号化する際に必要なパラメタを計算する。記憶部１０２は、定数１０４（例えば、公開鍵やモジュラスのビット長）、秘密情報１０５（例えば、秘密鍵）などを記憶している。
【００２５】
コンピュータＡ１０１は、ＣＰＵ１１４やコプロセッサ１１５などの演算装置、ＲＡＭ１０３、ＥＥＰＲＯＭ１０６、ＲＯＭ１０７や外部記憶装置１０８などの記憶装置、コンピュータ外部とのデータ入出力を行なう入出力インタフェース１１１を装備し、外部にはコンピュータＡ１０１をユーザが操作するためのディスプレイ１０９、キーボード１１０、着脱可能な可搬型記憶媒体の読み書き装置などが接続される。
【００２６】
コンピュータＡ１０１は、ＲＡＭ１０３、ＲＯＭ１０７、ＥＥＰＲＯＭ１０６や外部記憶装置１０８（例えばフラッシュメモリ、ハードディスク、磁気／光学記憶メディア）などの記憶装置によって、記憶部１０２を実現し、ＣＰＵ１１４やコプロセッサ１１５などの演算装置が、記憶部１０２に格納されたプログラムを実行することにより、暗号化部１１２およびモジュラーべき乗算計算部１１６を実現する。例えば、記憶部１０２を構成するＥＥＰＲＯＭ１０６ないしはＲＯＭ１０７に、プログラムやスマートカードごとに異なる情報（公開鍵、秘密鍵）や定数を格納し、ＲＡＭ１０３には暗号化部１１３の行う計算の中間データ、変数等を格納する。また、コプロセッサ１１５は特殊用途用の計算装置であり、モジュラー乗算などの算術演算を行う。
【００２７】
コンピュータＢ１２１は、コンピュータＡ１０１と同様に、記憶部１１２および処理部１３２を備え、処理部１３２は、復号化部１３３およびモジュラーべき乗算計算部１３６を備える。また、コンピュータＡ１０１と同様に、コンピュータＢ１２１は、ＣＰＵ１３４やコプロセッサ１３５などの演算装置、ＲＡＭ１２３、ＥＥＰＲＯＭ１２６、ＲＯＭ１２７や外部記憶装置１２８などの記憶装置、コンピュータ外部とのデータ入出力を行なう入出力インタフェース１３１を装備し、外部にはコンピュータＢ１２１をユーザが操作するためのディスプレイ１２９、キーボード１３０、着脱可能な可搬型記憶媒体の読み書き装置などが接続される。
【００２８】
コンピュータＢ１２１においても、ＲＡＭ１２３、ＲＯＭ１２７、ＥＥＰＲＯＭ１２６や外部記憶装置１２８（例えばフラッシュメモリ、ハードディスク、磁気／光学記憶メディア）などの記憶装置によって、記憶部１２２を実現し、ＣＰＵ１３４やコプロセッサ１３５などの演算装置が、記憶部１２２に格納されたプログラムを実行することにより、復号化部１３３およびモジュラーべき乗算計算部１３６を実現する。例えば、記憶部１２２を構成するＥＥＰＲＯＭ１２６ないしはＲＯＭ１２７に、プログラムやスマートカードごとに異なる情報（公開鍵、秘密鍵）や定数を格納し、ＲＡＭ１２３には復号化部１３３の行う計算の中間データ、変数等を格納する。また、コプロセッサ１３５は特殊用途用の計算装置であり、モジュラー乗算などの算術演算を行う。
【００２９】
なお、コンピュータＡ１０１およびコンピュータＢ１２１内の各プログラムは、予め各コンピュータＡ１０１、Ｂ１２１内の記憶部１０２、１２２に格納されていてもよいし、必要なときに、各コンピュータＡ１０１、Ｂ１２１が入出力インタフェースを介して接続するコンピュータ、または当該コンピュータが利用可能な媒体を介して上記記憶部に導入されてもよい。ここで、媒体とは、たとえば各コンピュータＡ１０１およびＢ１２１に着脱可能な記憶媒体、または通信媒体（すなわちネットワークまたはネットワークを伝搬する搬送波やディジタル信号）を指す。
【００３０】
以下、例として、図１の暗号化通信システムにおいて、コンピュータＢ１２１の復号化部１３３が行う復号化処理を、図２を参照して説明する。図２は、データが入力された際のコンピュータＢ１２１の各処理部が行う情報の受け渡しの様子を示すシーケンス図である。コンピュータＡ１０１の暗号化部１１３が行う暗号化処理も基本的には同様である。なお、以下においてコンピュータＢ１２１の各処理部は、秘密鍵、公開鍵に係る情報は、明示の記載がなくてもシステムパラメータとして処理に利用可能である。
【００３１】
復号化部１３３は、入出力インタフェース１３１を介して暗号化されたメッセージを受け取る（２０４）。また、記憶部１２２から秘密鍵、公開鍵、ビット長の情報を受け取る（２０５）。復号化部１３３は、暗号化されたメッセージを受け取ると、暗号化されたメッセージのビット長が予め定めたビット長か否かを判断する。予め定めたビット長より長い場合には、予め定めたビット長となるように暗号化されたメッセージを区切る。以下、所定のビット長に区切られた後の部分メッセージ（以下、単にメッセージともいう。）を用いて説明する。
【００３２】
コンピュータＢ１２１の処理部１３２は、暗号化されたメッセージのビット列によって表される数値を整数としてモジュラスＮによる剰余Ｃを計算する。
【００３３】
すなわち、復号化部１３３は、記憶部１２２に格納されている秘密情報１２５から取得したべき指数ｄと、暗号化されたメッセージＣを基にして構成したベース元ｇと、利用可能なメモリ容量に基づいて算出したウィンドウ幅ｗとを、モジュラーべき乗計算部１３６へ送る（２０６）。ここで、ウィンドウ幅ｗは正の整数であり、計算時間を優先する場合はｗを大きな値とし、メモリ使用量を小さくする場合はｗを小さな値とする。なお、ウィンドウ幅ｗは利用可能なメモリ容量内で後述する前計算テーブルのサイズが最大になるよう算出する。ウィンドウ幅ｗが１増加すると、前計算テーブルのサイズは２倍になる。ウィンドウ幅ｗは、初期値２から前計算テーブルのサイズが利用可能なメモリ容量を超えないところまで１ずつ増加させることにより算出する。そして、モジュラーべき乗計算部１３６は、べき指数ｄ、ベース元ｇ、ウィンドウ幅ｗから、モジュラーべき乗算ｇｄ  ｍｏｄ  Ｎを計算し、計算結果のｇｄ  ｍｏｄ  Ｎを復号化部１３３へ送る（２０７）。
【００３４】
復号化部１３３は、送られたモジュラーべき乗計算結果を用いて、入力された暗号化されたメッセージを復号する。例えば、通常のＲＳＡでは、Ｍ＝ｇｄ  ｍｏｄ  Ｎ（からパディング部分を取り除いたもの）を復号されたメッセージとして出力する。
【００３５】
コンピュータＢ１２１は、復号化部１３３で復号された部分メッセージから平文メッセージを組み立て、入出力インタフェース１３１を介して、ディスプレイ１２９などから出力する（２０８）。
【００３６】
次に、コンピュータＢ１２１が、復号化処理を行う場合の、モジュラーべき乗算計算部１３６の処理を詳細に説明する。すなわち、モジュラーべき乗算計算部１３６が、べき指数ｄ、ベース元ｇ、ウィンドウ幅ｗから、モジュラーべき乗算ｇｄ  ｍｏｄ  Ｎを計算する手順を説明する。コンピュータＡ１０１のモジュラーべき乗算計算部１１６も基本的に同様の構成で、同様の手順で処理を行う。
【００３７】
図３は、本実施形態のモジュラーべき乗算計算部１３６の機能ブロック図である。本図に示すように、モジュラーべき乗算計算部１３６は、エンコード部３０１、べき指数変換部３０２、前計算部３０３、実計算部３０４、の各モジュールを備える。また、エンコード部３０１は、キャリー判定部３１１、剰余変換部３１２、繰り返し判定部３１３を備える。べき指数変換部３０２は、閾値判定部３２１、位数加算部３２２を備える。前計算部３０３は、モジュラー乗算部３３１、繰り返し判定部３３２を備える。実計算部３０４は、ビット値判定部３４１、モジュラー乗算部３４２、繰り返し判定部３４３を備える。各機能の詳細は以下に処理手順に沿って説明する。
【００３８】
エンコード部３０１は、べき指数ｄの同値表現変換を行い固定パターン表現にする。具体的には、ｄ＝ｕ０＋ｕ１２＋ｕ２２２＋…＋ｕｎ＋１２ｎ＋１を満たすｕｉを計算する。ここで、ｕｉは０または正の整数から選び、ｎはモジュラスＮのビット長である。本実施形態では、固定パターンを有する表現に変換することより、実計算部３０４の行う演算パターンを固定化し、演算順序から攻撃者にとって有益な情報を引き出すことを阻害する。ＳＰＡは、ゼロである桁と非ゼロである桁とを識別できることを利用している。そのため、本実施形態では、ゼロである桁を消去し、非ゼロの値（例えば、２）を有する桁に置き換えることにより、演算パターンの固定化を達成する。
【００３９】
より具体的には、実際０＊２ｉ＝−１＊２ｉ＋１＋２＊２ｉという関係を利用し、０である桁を非ゼロの２に置き換える。すなわち、上記式に示すように、左辺のｉ番目の桁の値（２ｉの係数）０を、右辺に従って２に置き換え、（ｉ＋１）番目の桁にキャリー−１を発生させる。同様に、−１＊２ｉ＝−１＊２ｉ＋１＋１＊２ｉという関係を利用し、−１の桁を１および次の桁のキャリー−１とに置き換えることができる。なお、キャリー−１は、正の値を持つ桁に出会うことにより、キャンセルされる。
【００４０】
べき指数変換部３０２は、べき指数ｄを別のべき指数ｄ’に変換する。ただし、ｄとｄ’は、ｇｄ＝ｇｄ’  ｍｏｄ  Ｎの関係を満たし、特にｄ’の上位２ビットが１０となるべき指数を選択する。べき指数変換により上位２ビットの値を１０に固定化することにより、攻撃者による変換後のビット長からの最上位ビットの値の特定を回避することができ、より安全性が高まる。なお、このべき指数の変換は、行わないよう構成してもよい。また、予め行っても良い。予め行うことにより、変換に伴う演算を隠すことができるので、より耐性が増す。以降簡単のため、変換されたべき指数もｄとして表すことにする。
【００４１】
次に、本実施形態におけるモジュラーべき乗算を計算する際のモジュラーべき乗算計算部１３６を構成する各モジュール間のデータの流れについて説明する。図４は、モジュラーべき乗算計算部１３６の各モジュール間のデータの流れを示すシーケンス図である。
【００４２】
モジュラーべき乗算計算部１３６が、べき指数ｄ、ベース元ｇ、ウィンドウ幅ｗを受け取る（４０１）。モジュラーべき乗算計算部１３６は、べき指数ｄをべき指数変換部３０２に送る（４０２）。べき指数変換部３０２は、べき指数ｄを変換べき指数ｄに変換する。べき指数変換部３０２は、変換べき指数ｄをエンコード部３０１に送る（４０３）。モジュラーべき乗算計算部１３６は、ウィンドウ幅ｗをエンコード部３０１に送る（４０４）。エンコード部３０１は、変換べき指数ｄとウィンドウ幅ｗとからエンコード列を計算する。エンコード部３０１は、エンコード列を実計算部３０４に送る（４０５）。モジュラーべき乗算計算部１３６は、ベース元ｇとウィンドウ幅ｗとを前計算部３０３に送る（４０６）。前計算部３０３は、ベース元ｇとウィンドウ幅ｗとから前計算テーブルを作成する。前計算テーブルは、ｇｉ（ｉ＝１、２、…、２ｗ）で構成される。前計算部３０３は、前計算テーブルを実計算部３０４に送る（４０７）。実計算部３０４は、エンコード列と前計算テーブルからモジュラーべき乗算を行う。実計算部３０４は、モジュラーべき乗算の演算結果をモジュラーべき乗算計算部１３６に送る（４０８）。モジュラーべき乗算計算部１３６は、モジュラーべき乗算の演算結果を出力する（４０９）。
【００４３】
なお、各モジュール間のデータの受け渡しには、データを直接転送する以外にも、記憶部１２２にデータを書き込み、転送先モジュールが記憶部１２２にアクセスし、データを読み出すよう構成してもよい。
【００４４】
また、べき指数変換部３０２の行うべき指数変換は、予め変換を行っておき、変換後のべき指数ｄを記憶部１２２に格納するよう構成してもよい。その際、モジュラーべき乗算計算部１３６には、変換後のべき指数ｄが入力される。そして、上記ステップ４０２および４０３の代わりに、モジュラーべき乗算計算部１３６から直接エンコード部３０１に変換べき指数ｄが送られる。
【００４５】
エンコード部３０１が受け取る変換べき指数ｄとウィンドウ幅ｗとは、エンコード部３０１がエンコード列の計算を始める前であれば、受け取る順番は問わない。例えば、ウィンドウ幅ｗを受け取った後に変換べき指数ｄを受け取るよう構成してもよい。
【００４６】
実計算部３０４が受け取るエンコード列と前計算テーブルとは、実計算部３０４がモジュラーべき乗算を行う前であれば、受け取る順番は問わない。例えば、前計算部３０３が前計算テーブルを作成し、その後、エンコード部３０１がエンコード列の計算を行うよう構成してもよい。
【００４７】
前計算部３０３の行う前計算テーブル作成は、ベース元ｇとウィンドウ幅ｗとが予め定まっている場合、前計算テーブルを事前に作成し、記憶部１２２に格納しておいてもよい。その場合、ステップ４０６および４０７の処理の代わりに、実計算部３０４が直接記憶部１２２にアクセスし、前計算テーブルを読み出す。
【００４８】
次にエンコード部３０１、べき指数変換部３０２、前計算部３０３、実計算部３０４の行う各処理について、それぞれが備える上記各機能部の働きとともに詳細に説明する。
【００４９】
まず、べき指数変換部３０２が、べき指数ｄを変換されたべき指数ｄに変換する処理であるべき指数変換処理について説明する。図５は、べき指数変換処理の処理フローである。
【００５０】
べき指数変換部３０２は、べき指数ｄおよびモジュラスＮに対するΦ（Ｎ）の値を入力として受け取る（５０１）。
【００５１】
閾値判定部は３２１、条件：ｄ＋Φ（Ｎ）＜３＊２ｎ＋１が成立するかどうかを判定する。本条件が成立する場合、ステップ５１２へ行く。本条件が成立しない場合、ステップ５２１へ行く（５１１）。
【００５２】
ステップ５１１で条件が成立した場合、位数加算部３２２は、べき指数ｄをｄ＋Φ（Ｎ）に置き換え、ステップ５１１へと戻る（５１２）。
【００５３】
ステップ５１１で条件が成立しなかった場合、べき指数変換部３０２は、ｄ＝（１０ｄｎ−１…ｄ０）を変換べき指数ｄとして出力する（５２１）。
【００５４】
以上、べき指数変換処理について説明した。なお、べき指数変換部３０２の受け取るΦ（Ｎ）は、予め記憶部１２２に格納しておき、べき指数変換部３０２が記憶部１２２にアクセスし、Φ（Ｎ）を読み出してもよい。
【００５５】
次に、エンコード部３０１が、ウィンドウ幅ｗを用いて、べき指数変換部３０２によって変換されたべき指数ｄをエンコード列ｕｎ＋１、…、ｕ０（各ｕｉは正の値（１、２、…、２ｗ）または０である。）にエンコードするエンコード処理について説明する。図６は、エンコード処理の処理フローである。なお、変換されたべき指数ｄではなく、モジュラーべき乗算計算部１３６に入力されたべき指数ｄを用いる場合も、処理は基本的に同様である。
【００５６】
エンコード部３０１は、べき指数変換部３０２が変換したべき指数ｄおよびウィンドウ幅ｗを入力として受け取る（６０１）。
【００５７】
エンコード部３０１は、変数ｉに初期値０を、ｃａｒｒｙに０を代入し、ステップ６１１へ行く（６０２）。
【００５８】
繰り返し判定部３１３は、条件：ｉ＋ｗ＜ｎ−１が成立するか否かを判定する。条件が成立する場合、ステップ６１２へ行く。条件が成立しない場合、ステップ６２１へ行く（６１１）。
【００５９】
ステップ６１１で条件が成立した場合、剰余変換部３１２は、数値（ｄｉ＋ｗ−１…ｄｉ）２−ｃａｒｒｙを計算し、その結果をｕｉとする（６１２）。
【００６０】
キャリー判定部３１１は、条件：ｕｉ＜＝０が成立するかどうかを判定する。条件が成立する場合、ステップ６１５へ行く。条件が成立しない場合、ステップ６１４へ行く（６１３）。
【００６１】
ステップ６１３で条件が成立しなかった場合、エンコード部３０１は、ｃａｒｒｙに０を代入し、ステップ６１６へ行く（６１４）。
【００６２】
ステップ６１３で条件が成立した場合、剰余変換部３１２は、ｕｉをｕｉ＋２ｗに置き換え、エンコード部３０１は、ｃａｒｒｙに１を代入する（６１５）。
【００６３】
剰余変換部３１２は、ｕｉ＋ｗ−１、…、ｕｉ＋１をそれぞれ０とする（６１６）。
【００６４】
エンコード部３０１は、変数ｉの値をｗインクリメントし（ｉをｉ＋ｗに置き換え）、ステップ６１１へと戻る（６１７）。
【００６５】
ステップ６１１で条件が成立しなかった場合、剰余変換部３１２は、数値（ｄｎ−１…ｄｉ）２−ｃａｒｒｙを計算し、その結果をｕｉとする（６２１）。
【００６６】
キャリー判定部３１１は、条件：ｕｉ＜＝０が成立するか否かを判定する。条件が成立する場合、ステップ６２３へ行く。条件が成立しない場合、ステップ６２４へ行く（６２２）。
【００６７】
ステップ６２２で条件が成立した場合、剰余変換部３１２は、ｕｉをｕｉ＋２ｗに置き換え、エンコード部３０１は、ｃａｒｒｙに１を代入し、ステップ６２５へ行く（６２３）。
【００６８】
ステップ６２２で条件が成立しなかった場合、エンコード部３０１は、ｃａｒｒｙに０を代入する（６２４）。
【００６９】
剰余変換部３１２は、数値（ｄｎ−１、…、ｄｉ）２−ｃａｒｒｙを計算し、その結果をｕｉに格納する。また、ｕｎ−１、…、ｕｉ＋１をそれぞれ０とする（６２５）。
【００７０】
剰余変換部３１２は、ｕｎ＋１を０、ｕｎを２−ｃａｒｒｙとする（６２６）。
【００７１】
エンコード部３０１は、ｕｎ＋１、…、ｕ０をべき指数ｄのエンコード結果として出力する（６３１）。
【００７２】
以上、本実施形態のエンコード処理を説明した。
【００７３】
次に、前計算部３０３がベース元ｇおよびウィンドウ幅ｗから、前計算テーブルを作成する前計算テーブル作成処理、および、実計算部３０４が、エンコード部３０１がエンコードしたエンコード列ｕおよび前計算部３０３が作成した前計算テーブルから、モジュラーべき乗算ｇｄ  ｍｏｄ  Ｎを計算するモジュラーべき乗算計算処理について説明する。なお、前計算テーブルには、ベース元ｇｉ毎のｇｉ  ｍｏｄ  Ｎ（ただし、ｉ  ＝  １，２，  …，  ２ｗ）、すなわち、ｇ［ｉ］＝ｇｉ  ｍｏｄ  Ｎが格納される。
【００７４】
図７は、前計算テーブル作成処理およびモジュラーべき乗算計算処理の処理フローである。
【００７５】
前計算部３０３はベース元ｇおよびウィンドウ幅ｗを、実計算部３０４はエンコード列ｕｎ＋１、…、ｕ０を、それぞれ入力として受け取る（７０１）。
【００７６】
前計算部３０３は、ｇ［１］にベース元ｇを、変数ｉに２を代入する（７０２）。
【００７７】
繰り返し判定部３３２は、条件：ｉ＜＝２ｗが成立するか否かを判定する。条件が成立する場合、ステップ７０４へ行く。条件が成立しない場合、ステップ７１１へ行き、前計算テーブル作成処理は終了する（７０３）。
【００７８】
ステップ７０３で条件が成立した場合、モジュラー乗算部３３１は、モジュラー乗算ｇ［ｉ−１］＊ｇ  ｍｏｄ  Ｎを計算し、その計算結果をｇ［ｉ］に格納する。その後、前計算部３０３は、変数ｉを１インクリメントし（ｉ＝ｉ＋１）、ステップ７０３へと戻る（７０４）。
【００７９】
ステップ７０３で条件が成立しなかった場合、実計算部３０４は、中間データｒに１を、変数ｉにｎ＋１を代入する（７１１）。
【００８０】
ビット値判定部３４１および繰り返し判定部３４３は、条件：ｕｉ＝０、かつ、ｉ＞＝０が成立するか否かを判定する。条件が成立する場合、ステップ７２２へ行く。条件が成立しない場合、ステップ７３１へ行く（７２１）。
【００８１】
ステップ７２１で条件が成立した場合、実計算部３０４は、変数ｉを１デクリメントし（ｉ＝ｉ−１）、ステップ７２１へと戻る（７２２）。
【００８２】
ステップ７２１で条件が成立しなかった場合、繰り返し判定部３４３は、条件：ｉ＞＝０が成立するか否かを判定する。条件が成立する場合、ステップ７３２へ行く。条件が成立しない場合、ステップ７４１へ行く（７３１）。
【００８３】
ステップ７３１で条件が成立した場合、モジュラー乗算部３４２は、中間データｒのモジュラー２乗、すなわち、ｒ２  ｍｏｄ  Ｎを計算し、計算結果を中間データｒに格納する（７３２）。
【００８４】
そして、ビット値判定部３４１は、条件：ｕｉ＞０が成立するか否かを判定する。条件が成立する場合、ステップ７３４へ行く。条件が成立しない場合、ステップ７３５へ行く（７３３）。
【００８５】
ステップ７３３で条件が成立した場合、モジュラー乗算部３４２は、事前計算したｇ［ｕｉ］と中間データｒとのモジュラー乗算ｇ［ｕｉ］＊ｒ  ｍｏｄ  Ｎを計算し、計算結果を中間データｒに格納する（７３４）。ステップ７３３で条件が成立しなかった場合は、本処理は行わない。
【００８６】
そして、実計算部３０４は、変数ｉを１デクリメントし（ｉ＝ｉ−１）、ステップ７３１へと戻る（７３５）。
【００８７】
ステップ７３１で条件が成立しなかった場合、実計算部３０４は、中間データｒを、モジュラーべき乗算の演算結果（ｇｄ  ｍｏｄ  Ｎ）として出力する（７４１）。
【００８８】
以上、本実施形態の前計算テーブル作成処理およびモジュラーべき乗算計算処理を説明した。
【００８９】
なお、上記のモジュラー乗算は、モジュラー乗算を行うコプロセッサ１３５を用いて高速化してもよい。また、モンゴメリ乗算を用いてモジュラー乗算を行うことにより、高速化を図ってもよい。
【００９０】
また、ステップ７３１からステップ７３５間の処理において、ステップ７３２で中間データｒのモジュラー２乗を計算し、ステップ７３４で前計算テーブルに格納されているｇ［ｕｉ］とのモジュラー乗算をする処理を繰り返す。ここで、１回目の繰り返しでは、中間データｒには１が格納されている。従って、前計算テーブルに格納されているｇ［ｕｉ］を中間データｒにコピーすることにより、ステップ７３２のモジュラー２乗算およびステップ７３４のモジュラー乗算を削除し、高速化を図ってもよい。
【００９１】
次に、具体的にｄ＝１４４＝（１００１００００）２の場合を例にとり、図６のエンコード処理を解説する。ウィンドウ幅ｗは２とする。
【００９２】
１回目のステップ６１２では、ｕ０にｄの下位２ビット００を示す数値０が格納される。ｕ０が０であるため、６１３の条件を満たし、ステップ６１５に進み、ｕ０に２ｗ（＝４）が加算され、キャリーが発生する（キャリーそのものは−１であるが、アルゴリズムでは「ｃａｒｒｙ」をマイナスする値を格納する変数として絶対値の１を格納している。）。
【００９３】
ステップ６１１に戻り、２回目のステップ６１２では、ｕ２に次の２ビット００を示す数値０からキャリーを引いた値である−１が格納される。ｕ２が−１であるため、６１３の条件を満たし、ステップ６１５に進み、正の値とするために２ｗ（＝４）が加算され、ｕ２＝３となり、キャリーが発生する。
【００９４】
また、ステップ６１１に戻り、３回目のステップ６１２では、ｕ４に次の２ビット０１を示す数値１からキャリーを引いた値である０が格納される。ｕ４が０であるため、６１３の条件を満たし、ステップ６１５に進み、２ｗ（＝４）が加算され、ｕ４＝４となり、キャリーが発生する。
【００９５】
また、ステップ６１１に戻り、４回目のステップ６１２では、ｕ６に次の２ビット１０を示す数値２からキャリー１を引いた値である１が格納される。ｕ６が１であるため、６１３の条件を満たさず、ｕ６の値はこのまま保持され、キャリーも発生しない。
【００９６】
次にステップ６１１にもどると、ここでは、条件を満たさず、ステップ６２１へ進む。
【００９７】
結果として、エンコード結果は、（ｕ７ｕ６ｕ５…ｕ０）＝（０１０４０３０４）となる。実際、（ｕ７ｕ６ｕ５…ｕ０）＝（０１０４０３０４）を用いて、ｄ＝ｕ７２７＋ｕ６２６＋…＋ｕ０２０を計算すると、その値は１４４となり、ｄ＝１４４＝ｕ７２７＋ｕ６２６＋…＋ｕ０２０を満たす。
【００９８】
前計算テーブルには、エンコードに用いる正整数１、２、３、４に対し、ｇ１  ｍｏｄ  Ｎ、ｇ２  ｍｏｄ  Ｎ、ｇ３  ｍｏｄ  Ｎ、ｇ４  ｍｏｄ  Ｎを格納しておく。
【００９９】
実計算部３０４は、このエンコードされた数値列および前計算テーブルを用いて、０に対して２乗し、０以外の値に対して２乗と乗算とを行うことにより、エンコードされた数値列のモジュラーべき乗算を行う。
【０１００】
Ｓをモジュラー２乗算、Ｍをモジュラー乗算を表すものとすると、上記のｄ＝１４４の場合、そのエンコード結果は（０１０４０３０４）であり、その演算列はＳＭ  ＳＳＭ  ＳＳＭ  ＳＳＭ  となる。ただし、左端の０に対しては２乗算を行わないため、左端に０に対応するＳは出現しない。このように、本実施形態のエンコード処理によれば、モジュラーべき乗算計算時に固定された演算パターンを有する演算列ＳＳＭが得られる。
【０１０１】
このときの実計算部３０４での計算の様子を図８に示す。本図には、エンコード結果の数値列２００１から前計算テーブルに格納されている各値（ｇ、ｇ２、ｇ３、ｇ４）２００２を用いてモジュラーべき乗算を行う様子を示す。右側への矢印はモジュラー２乗算を、下側への矢印はモジュラー乗算を示す。モジュラー乗算の際、下矢印の終点位置と同位置の前計算テーブルに格納されている値と演算を行う。
【０１０２】
なお、本実施形態によれば、上記の同値表現変換のアルゴリズムから明かなように、連続して発生するＳＳの個数はウィンドウ幅ｗの値となり、出現するパターンはべき指数ｄの値とは無関係となる。
【０１０３】
以上説明したように、本実施形態のエンコード部３０１によるエンコード処理によれば、実計算部３０４が行うモジュラーべき乗算計算処理において演算列は固定されたパターンを持つこととなる。従って、ＳＰＡにより得た情報が攻撃者には役立たないものとなり、
（ａ）ＳＰＡに対して耐性があるものといえる。
【０１０４】
さらに、上述のように、本実施形態のモジュラーべき乗算計算によれば、ダミー演算は用いられない。従って、ダミー演算を用いないため、
（ｂ）セーフエラー攻撃に対して安全なものとなる。
【０１０５】
また、実計算部３０４の行うモジュラーべき乗算計算処理では、ｎ回のモジュラー２乗算と、ｎ／ｗ回のモジュラー乗算を行う。一方、通常レベルの脆弱性を有するモジュラーべき乗算の計算方法では、ｎ回のモジュラー２乗算、ｎ／２回のモジュラー乗算を行う。従って、ウィンドウ幅ｗが２以上であれば、前者は後者に比べて計算回数が少なくて済む。従って、
（ｃ）効率的な演算処理が可能であるといえる。また、
（ｄ）ウィンドウ幅ｗを変更することにより、メモリ量と高速性のトレードオフを利用した調整を行うことが出来る。
【０１０６】
また、本実施形態はモジュラーべき乗算計算方法の改良であるため、モジュラーべき乗算を用いる、
（ｅ）ＲＳＡ暗号アルゴリズム、ＤＳＡ暗号アルゴリズムへの適用が可能である。しかも、上述のように、本実施形態では、同値表現変換によりべき指数の０の桁を非０の桁に置き換えて演算パターンの固定化を実現するにあたり、正の値を持つ桁に変換している。従って、前計算テーブルに保持する前計算値は、ベース元ｇの正の整数乗のモジュラー乗算の結果に限られ、計算量の大きい負の整数乗のモジュラー乗算は不要である。このため計算コストを削減するために事前計算テーブルを利用してべき乗算を計算するウィンドウ法が一般的に用いられているＲＳＡ暗号系の処理には特に適している。
【０１０７】
上述のように、本実施形態のモジュラーべき乗算計算方法は、秘密のべき指数ｄをエンコードすることによりＳＰＡによる攻撃を防ぐよう構成されている。従って、
（ｆ）ベース元ｇをランダム化する一般的なＤＰＡの防御方法と自由に組合せることができる。
【０１０８】
以上の通り、本実施形態の暗号化通信システムのモジュラーべき乗算計算方法は、先に記載した６項目（ａ）−（ｆ）のそれぞれを満たす。従って、スマートカードなどのリソースが限られた機器上に暗号アルゴリズムを実装するにあたり、サイドチャネル攻撃に対して耐性が高く、かつ、効率的な暗号化通信システムを得ることができる。
【０１０９】
＜＜第二の実施形態＞＞
本発明を適用した第二の実施形態について説明する。上記第一の実施形態では、メモリ量と高速性とのトレードオフを利用した調整をウィンドウ幅ｗを用いて実現していた。しかし、本実施形態では、テーブルサイズｋを導入し、本調整をさらにきめ細かに行うことを実現するものである。なお、テーブルサイズｋは、前計算テーブルに格納する元の数である。
【０１１０】
本実施形態の暗号化通信システムのシステム構成は、基本的に第一の実施形態と同様である。このため、以下においては、異なる部分のみ説明する。
【０１１１】
本実施形態では、第一の実施形態のモジュラーべき乗算計算部１３６の代わりにモジュラーべき乗算計算部１３６−２を備える。図９は、本実施形態のモジュラーべき乗算計算部１３６−２の機能ブロック図である。本図に示すように、本実施形態のモジュラーべき乗算計算部１３６−２は、エンコード部８０１と、べき指数変換部８０２と、前計算部８０３と、実計算部８０４と、分数ウィンドウ生成部８０５と、の各モジュールを備える。
【０１１２】
エンコード部８０１は、第一の実施形態と同様に、キャリー判定部８１１、繰り返し判定部８１３を備え、さらに、剰余候補生成部８１２、剰余選択部８１４、乱数生成部８１５、を備える。べき指数変換部８０２は、閾値判定部８２１、位数加算部８２２を備え、これらは、第一の実施形態の同名の機能部と同様の機能を有する。前計算部８３１は、第一の実施形態と同様に、モジュラー乗算部８３１、繰り返し判定部８３２を備え、さらに、格納候補判定部８３３を備える。実計算部８０４は、第一の実施形態と同様に、ビット値判定部８４１、モジュラー乗算部８４２、繰り返し判定部８４３を備える。また、分数ウィンドウ生成部８０５は、格納候補選択部８５１、繰り返し判定部８５２、乱数生成部８５３を備える。各機能の詳細は以下に処理手順に沿って説明する。
【０１１３】
本実施形態では、モジュラーべき乗算計算部１３６−２が、べき指数ｄ、ベース元ｇ、テーブルサイズｋから、モジュラーべき乗算ｇｄ  ｍｏｄ  Ｎ  を計算する。以下、本実施形態での計算手順について説明する。
【０１１４】
まず、本実施形態におけるモジュラーべき乗算計算時のモジュラーべき乗算計算部１３６−２を構成する各モジュール間のデータの流れについて説明する。図１０は、本実施形態のモジュラーべき乗算計算部１３６−２の各モジュール間のデータの流れを示すシーケンス図である。以下においても、第一の実施形態と同様に、変換後のべき指数もｄで表す。本実施形態においても、第一の実施形態と同様に、べき指数の変換は行わなくてもよい。また、予め変換したべき指数ｄを用いるよう構成してもよい。
【０１１５】
モジュラーべき乗算計算部１３６−２が、べき指数ｄ、ベース元ｇ、テーブルサイズｋを受け取る（９０１）。モジュラーべき乗算計算部１３６−２は、べき指数ｄをべき指数変換部８０２に送る（９０２）。べき指数変換部８０２は、べき指数ｄを変換べき指数ｄに変換する。べき指数変換部８０２は、変換べき指数ｄをエンコード部８０１に送る（９０３）。
【０１１６】
モジュラーべき乗算計算部１３６−２は、テーブルサイズｋを分数ウィンドウ生成部８０５に送る（９０４）。分数ウィンドウ生成部８０５は、テーブルサイズｋに対応する分数ウィンドウ（テーブルサイズｋ、ウィンドウ幅ｗ、テーブル格納候補Ｂ）を生成する。分数ウィンドウ生成部８０５は、分数ウィンドウ（ｋ、ｗ、Ｂ）をエンコード部８０１および前計算部８０３に送る（９０５、９０６）。
【０１１７】
エンコード部８０１は、変換べき指数ｄと分数ウィンドウ（ｋ、ｗ、Ｂ）からエンコード列を計算する。エンコード部８０１は、エンコード列を実計算部８０４に送る（９０７）。モジュラーべき乗算計算部１３６−２は、ベース元ｇを前計算部８０３に送る（９０８）。前計算部８０３は、ベース元ｇと分数ウィンドウ（ｋ、ｗ、Ｂ）から前計算テーブルを作成する。前計算テーブルは、元ｇｉ  ｍｏｄ  Ｎ（ｉ＝１、２、…、２ｗ）のうちのｋ個のｇｉ  ｍｏｄ  Ｎで構成される。前計算部８０３は、前計算テーブルを実計算部８０４に送る（９０９）。
【０１１８】
実計算部８０４は、エンコード列と前計算テーブルからモジュラーべき乗算を行う。実計算部８０４は、モジュラーべき乗算の演算結果をモジュラーべき乗算計算部１３６−２に送る（９１０）。モジュラーべき乗算計算部１３６−２は、モジュラーべき乗算の演算結果を出力する（９１１）。
【０１１９】
なお、各モジュール間のデータの受け渡しには、データを直接転送する以外にも、記憶部１２２にデータを書き込み、転送先モジュールが記憶部１２２にアクセスし、データを読み出してもよい。
【０１２０】
また、べき指数変換部８０２の行うべき指数変換は、予め変換を行っておき、変換後のべき指数ｄを記憶部１２２に格納しておいてもよい。その際、モジュラーべき乗算計算部１３６−２には、変換後のべき指数ｄが入力される。そして、上記ステップ９０２および９０３の代わりに、モジュラーべき乗算計算部１３６−２から直接エンコード部８０１に変換べき指数ｄが送られる。
【０１２１】
エンコード部８０１が受け取る変換べき指数ｄと分数ウィンドウ（ｋ、ｗ、Ｂ）とは、エンコード部８０１がエンコード列の計算を始める前であれば、受け取る順番は問わない。例えば、分数ウィンドウ（ｋ、ｗ、Ｂ）を受け取った後に変換べき指数ｄを受け取るよう構成してもよい。
【０１２２】
実計算部８０４が受け取るエンコード列と前計算テーブルは、実計算部８０４がモジュラーべき乗算を行う前であれば、受け取る順番は問わない。例えば、前計算部８０３が前計算テーブルを作成し、その後、エンコード部８０１がエンコード列の計算を行うよう構成してもよい。
【０１２３】
前計算部８０３の行う前計算テーブル作成は、ベース元ｇとウィンドウ幅ｗとが予め定まっている場合、ウィンドウ幅ｗに対応する分数ウィンドウ（ｋ、ｗ、Ｂ）を作成し、その分数ウィンドウ（ｋ、ｗ、Ｂ）を用いて前計算テーブルを事前に作成し、記憶部１２２に格納しておいてもよい。その場合、上記ステップ９０８および９０９の処理の代わりに、実計算部８０４が直接記憶部１２２にアクセスし、前計算テーブルを読み出す。
【０１２４】
次にエンコード部８０１、べき指数変換部８０２、前計算部８０３、実計算部８０４、分数ウィンドウ生成部８０５の行う各処理について、それぞれが備える上記各機能部の働きとともに詳細に説明する。なお、べき指数変換部８０２がべき指数ｄから変換べき指数ｄに変換する処理は、第一の実施形態と同様であるため、ここでは説明しない。
【０１２５】
分数ウィンドウ生成部８０５が、テーブルサイズｋに対応する分数ウィンドウ（テーブルサイズｋ、ウィンドウ幅ｗ、テーブル格納候補Ｂ）を生成する分数ウィンドウ生成処理について説明する。図１１は、分数ウィンドウ生成処理の処理フローである。
【０１２６】
分数ウィンドウ生成部８０５は、テーブルサイズｋを入力として受け取る（１００１）。
【０１２７】
分数ウィンドウ生成部８０５は、ＣＥＩＬ（ｌｏｇ２（ｋ））を計算し、ウィンドウ幅としてｗに格納する（１００２）。ただし、ｌｏｇ２は底が２の対数、ＣＥＩＬ（ａ）はａ以上の整数のうち最も小さな整数を表す。
【０１２８】
格納候補選択部８５１は、Ｂ［１］に１、Ｂ［２］に２、…Ｂ［２ｗ−１］に２ｗ−１を、それぞれ格納する（１００３）。
【０１２９】
格納候補選択部８５１は、Ｂ［２ｗ−１＋１］、Ｂ［２ｗ−１＋２］、…、Ｂ［２ｗ］にそれぞれ０を格納し、初期化する（１００４）。
【０１３０】
分数ウィンドウ生成部８０５は、変数ｉに初期値２ｗ−１を代入する（１００５）。
【０１３１】
繰り返し判定部８５２は、条件：ｉ＜ｋが成立するか否かを判定する。条件が成立する場合、ステップ１０１２へ行く。条件が成立しない場合、ステップ１０２１へ行く（１０１１）。
【０１３２】
ステップ１０１１で条件が成立した場合、乱数生成部８５３は、ｗ−１ビットの乱数を生成し、変数ｒｎｄに格納する（１０１２）。
【０１３３】
そして、格納候補選択部８５１は、条件：Ｂ［２ｗ−１＋ｒｎｄ＋１］＝０が成立するか否かを判定する。条件が成立する場合、ステップ１０１４へ行く。条件が成立しない場合、既に選択されていることを意味するため、ステップ１０１２へと戻る（１０１３）。ステップ１０１２では、新たな乱数を生成し、処理を繰り返す。
【０１３４】
ステップ１０１３で条件が成立した場合、格納候補選択部８５１は、Ｂ［２ｗ−１＋ｒｎｄ＋１］に、選択したことを示す数値である１を格納し、変数ｉを１インクリメントし、ステップ１０１１へと戻る（１０１４）。
【０１３５】
ステップ１０１１で条件が成立しなかった場合、分数ウィンドウ生成部８０５は、変数ｉに２ｗ−１＋１、変数ｊに２ｗ−１＋１を、それぞれ代入する（１０２１）。
【０１３６】
繰り返し判定部８５２は、条件：ｊ＜＝ｋが成立するか否かを判定する。条件が成立する場合、ステップ１０２３へ行く。条件が成立しない場合、ステップ１０３１へ行く（１０２２）。
【０１３７】
ステップ１０２２で条件が成立した場合、格納候補選択部８５１は、条件：Ｂ［ｉ］＝１が成立するか否かを判定する。条件が成立する場合、ステップ１０２４へ行く。条件が成立しない場合、ステップ１０２４の処理を飛ばし、ステップ１０２５へ行く（１０２３）。
【０１３８】
ステップ１０２３で条件が成立した場合、格納候補選択部８５１は、Ｂ［ｉ］にｊを代入する。分数ウィンドウ生成部８０５は、変数ｊを１インクリメントする（ｊ＝ｊ＋１）（１０２４）。
【０１３９】
分数ウィンドウ生成部８０５は、変数ｉを１インクリメント（ｉ＝ｉ＋１）し、ステップ１０２２へと戻る（１０２５）。
【０１４０】
ステップ１０２２で条件が成立しなかった場合、分数ウィンドウ生成部８０５は、テーブル格納候補Ｂとウィンドウ幅ｗとを出力し処理を終了する（１０３１）。
【０１４１】
以上、本実施形態の分数ウィンドウ生成処理を説明した。
【０１４２】
次に、エンコード部３０１が、分数ウィンドウ生成処理で生成された分数ウィンドウ（ｋ、ｗ、Ｂ）とべき指数変換部８０２によって変換されたべき指数ｄまたはモジュラーべき乗算計算部１３６−２に入力されたべき指数ｄとを用いて、エンコード列ｕｎ＋１、…、ｕ０（各ｕｉは正の値（１、２、…、２ｗ）である）にエンコードする本実施形態のエンコード処理について説明する。図１２は、本実施形態のエンコード処理の処理フローである。なお、変換されたべき指数ｄではなく、モジュラーべき乗算計算部１３６−２に入力されたべき指数ｄを用いる場合も、処理は基本的に同様である。
【０１４３】
エンコード部８０１は、べき指数変換部３０２が変換したべき指数ｄ、および分数ウィンドウ生成部８０５が生成した分数ウィンドウ（ｋ、ｗ、Ｂ）を入力として受け取る。また、エンコード部８０１は、変数ｉに初期値０を、ｃａｒｒｙに０を代入し、ステップ１１１１へ行く（１１０１）。
【０１４４】
繰り返し判定部８１３は、条件：ｉ＜ｎ−ｗ＋１が成立するか否かを判定する。条件が成立する場合、ステップ１１１２へ行く。条件が成立しない場合、ステップ１１４１へ行く（１１１１）。
【０１４５】
ステップ１１１１で条件が成立した場合、剰余候補生成部８１２は、数値（ｄｉ＋ｗ−１…ｄｉ）２−ｃａｒｒｙおよび（ｄｉ＋ｗ−２…ｄｉ）２−ｃａｒｒｙを計算し、その結果をそれぞれ変数ｘ，変数ｙに代入する（１１１２）。
【０１４６】
キャリー判定部８１１は、条件：ｘ＜＝０が成立するか否かを判定する。条件が成立する場合、ステップ１１１５へ行く。条件が成立しない場合、ステップ１１１４へ行く（１１１３）。
【０１４７】
ステップ１１１３で条件が成立した場合、剰余候補生成部８１２は、ｘにｘ＋２ｗを代入し、エンコード部８０１は、変数ｘ側のキャリーを示す変数ｃａｒｒｙｘに１を代入し、ステップ１１１６へ行く（１１１４）。一方、ステップ１１１３で条件が成立しなかった場合、エンコード部８０１は、変数ｙ側のキャリーを示す変数ｃａｒｒｙｘに０を代入する（１１１５）。
【０１４８】
次に、キャリー判定部８１１は、条件：ｙ＜＝０が成立するか否かを判定する。条件が成立する場合、ステップ１１１７へ行く。条件が成立しない場合、ステップ１１１８へ行く（１１１６）。
【０１４９】
ステップ１１１６で条件が成立した場合、剰余候補生成部８１２は、ｙにｙ＋２ｗを代入し、エンコード部８０１は、ｃａｒｒｙｙに１を代入し、ステップ１１２１へ行く（１１１７）。一方、ステップ１１１６で条件が成立しなかった場合、エンコード部８０１は、ｃａｒｒｙｙに０を代入し、ステップ１１２１へ行く（１１１８）。
【０１５０】
剰余選択部８１４は、条件：ｘ＜＝２ｗ−１が成立するか否かを判定する。条件が成立する場合、ステップ１１２２へ行く。条件が成立しない場合、ステップ１１２４へ行く（１１２１）。
【０１５１】
ステップ１１２１で条件が成立した場合、乱数生成部８１５は、ｗ−１ビットの乱数を生成し、変数ｒｎｄに格納する（１１２２）。
【０１５２】
剰余選択部８１４は、条件：ｒｎｄ＜ｋ−２ｗ−１が成立するか否かを判定する。条件が成立する場合、ステップ１１３１へ行く。条件が成立しない場合、ステップ１１３２へ行く（１１２３）。
【０１５３】
ステップ１１２１で条件が成立しなかった場合、剰余選択部８１４は、条件：Ｂ［ｘ］＝０が成立するか否かを判定する。条件が成立する場合、ステップ１１３２へ行く。条件が成立しない場合、ステップ１１３１へ行く（１１２４）。
【０１５４】
剰余選択部８１４は、変数ｘの値を剰余として選択し、ｕｉに格納する。エンコード部８０１は、ｃａｒｒｙｘをｃａｒｒｙに、ｗを中間データｒにそれぞれ代入し（１１３１）、ステップ１１３３へ行く。
【０１５５】
剰余選択部８１４は、変数ｙの値を剰余として選択し、ｕｉに格納する。エンコード部８０１は、ｃａｒｒｙｙをｃａｒｒｙに、ｗ−１を中間データｒにそれぞれ代入し（１１３２）、ステップ１１３３へ行く。
【０１５６】
剰余選択部８１４は、ｕｉ＋ｒ−１、…、ｕｉ＋１にそれぞれ０を代入する。エンコード部８０１は、変数ｉを中間データｒの値分インクリメントし（ｉ＝ｉ＋ｒ）、ステップ１１１２へと戻る（１１３３）。
【０１５７】
ステップ１１１１で条件が成立しなかった場合、繰り返し判定部８１３は、条件：ｉ＜ｎ−１が成立するか否かを判定する。条件が成立する場合、ステップ１１４２へ行く。条件が成立しない場合、ステップ１１５１へ行く（１１４１）。
【０１５８】
ステップ１１４１で条件が成立した場合、剰余候補生成部８１２は、数値（ｄｉ＋ｗ−１…ｄｉ）２−ｃａｒｒｙを計算し、その結果を変数ｙに代入する（１１４２）。
【０１５９】
キャリー判定部８１１は、条件：ｙ＜＝０が成立するか否かを判定する。条件が成立する場合、ステップ１１４４へ行く。条件が成立しない場合、ステップ１１４５へ行く（１１４３）。
【０１６０】
ステップ１１４３で条件が成立した場合、剰余候補生成部８１２は、変数ｙを２Ｗインクリメント（ｙ＝ｙ＋２ｗ）し、エンコード部８０１は、ｃａｒｒｙに１を代入し、ステップ１１４６へ行く（１１４４）。一方、ステップ１１４３で条件が成立しなかった場合、エンコード部８０１は、ｃａｒｒｙに０を代入する（１１４５）。
【０１６１】
剰余選択部８１４は、変数ｙの値を剰余として選択し、ｕｉに格納する。また、ｕｎ−１、…、ｕｉ＋１にそれぞれ０を代入し、ステップ１１５１へ行く（１１４６）。
【０１６２】
剰余選択部８１４は、ｕｎ＋１に０を、ｕｎに２−ｃａｒｒｙをそれぞれ代入する（１１５１）。
【０１６３】
エンコード部８０１は、ｕｎ＋１、…、ｕ０に格納された値を、それぞれべき指数ｄのエンコード結果として出力する（１１５２）。
【０１６４】
以上、本実施形態のエンコード処理を説明した。
【０１６５】
なお、上述のように、本実施形態では、エンコード部８０１は、べき指数ｄの下位の桁からｗビットごとに読み出し、第一の数値列（ｘ）と第二の数値列（ｙ）とに変換し、ｘとｙとを一定確率でランダムに選択することにより安全性を確保する。ｙはいかなる場合にも選択が可能であるが、ｘは前計算テーブルに値が格納されている場合にのみ選択可能である。このため、ステップ１１２１でｘが２ｗ−１より大きいか否かにより振り分け、ｘが２ｗ−１より大きい場合、ステップ１１２４で前計算テーブルに格納されているか（Ｂ［ｘ］≠０）否かを判定し、格納されている場合ｘを選択する。一方、ｘが２ｗ−１以下の場合、ｘ、ｙともに選択可能であり、乱数により一定確率でいずれかを選択する。
【０１６６】
次に、前計算部８０３がベース元ｇおよび分数ウィンドウ生成部８０５が生成した分数ウィンドウ（ｋ、ｗ、Ｂ）から、前計算テーブルを作成する本実施形態の前計算テーブル作成処理、および、実計算部８０４が、エンコード部８０１がエンコードしたエンコード列ｕおよび前計算部８０３が作成した前計算テーブルから、モジュラーべき乗算ｇｄ  ｍｏｄ  Ｎを計算する本実施形態のモジュラーべき乗算計算処理について説明する。なお、前計算テーブルには、ベース元ｇｉ毎のｇｉ  ｍｏｄ  Ｎ（ｉ＝１、２、…、２ｗ）のうちのｋ個のｇｉ  ｍｏｄ  Ｎが、ｉの小さい順に、ｇ［１］、ｇ［２］、…、ｇ［ｋ］に対応づけて格納される。図１３は、本実施形態の前計算テーブル作成処理およびモジュラーべき乗算計算処理の処理フローである。
【０１６７】
前計算部８０３はベース元ｇ、テーブルサイズｋ、ウィンドウ幅ｗ、テーブル格納候補Ｂを、実計算部８０４は、エンコード列ｕｎ＋１、…、ｕ０を、それぞれ入力として受け取る（１２０１）。
【０１６８】
前計算部８０３は、ｇ［１］にベース元ｇを、変数ｉに２を代入する（１２０２）。
【０１６９】
繰り返し判定部８３２は、条件：ｉ＜＝２ｗ−１が成立するか否かを判定する。条件が成立する場合、ステップ１２１２へ行く。条件が成立しない場合、ステップ１２２１へ行く（１２１１）。
【０１７０】
ステップ１２１１で条件が成立した場合、モジュラー乗算部８３１は、モジュラー乗算ｇ［ｉ−１］＊ｇ  ｍｏｄ  Ｎを計算し、その計算結果をｇ［ｉ］に格納する。その後、前計算部８０３は、変数ｉを１インクリメントし（ｉ＝ｉ＋１）、ステップ１２１１へと戻る（１２１２）。
【０１７１】
ステップ１２１１で条件が成立しなかった場合、繰り返し判定部８３２は、条件：ｉ＜＝２ｗが成立するか否かを判定する。条件が成立する場合、ステップ１２２２へ行く。条件が成立しない場合、ステップ１２３１へ行き、前計算テーブル作成処理は終了する（１２２１）。
【０１７２】
ステップ１２２１で条件が成立した場合、格納候補判定部８３３は、条件：Ｂ［ｉ］≠０が成立するか否かを判定する。条件が成立する場合、ステップ１２２３へ行く。条件が成立しない場合、ステップ１２２３を飛ばし、ステップ１２２４へ行く（１２２２）。
【０１７３】
ステップ１２２２で条件が成立した場合、モジュラー乗算部８３１は、モジュラー乗算ｇ［ｉ−２ｗ−１］＊ｇ［２ｗ−１］  ｍｏｄ  Ｎを計算し、その計算結果をｇ［ｊ］に格納する（１２２３）。
【０１７４】
前計算部８０３は、変数ｉを１インクリメント（ｉ＝ｉ＋１）し、ステップ１２２１へと戻る（１２２４）。
【０１７５】
前計算テーブル作成処理が終了すると、実計算部８０４は、中間データｒに１を、変数ｉにｎ＋１を代入する。
【０１７６】
ビット値判定部８４１および繰り返し判定部８４３は、条件：ｕｉ＝０かつｉ＞＝０が成立するか否かを判定する。条件が成立する場合、ステップ１２３３へ行く。条件が成立しない場合、ステップ１２４１へ行く（１２３２）。
【０１７７】
ステップ１２３２で条件が成立した場合、実計算部８４１は、変数ｉを１デクリメント（ｉ＝ｉ−１）し、ステップ１２３２へと戻る（１２３３）。
【０１７８】
ステップ１２３２で条件が成立しなかった場合、繰り返し判定部８４３は、条件：ｉ＞＝０が成立するか否かを判定する。条件が成立する場合、ステップ１２４２へ行く。条件が成立しない場合、ステップ１２５１へ行く（１２４１）。
【０１７９】
ステップ１２４１で条件が成立した場合、モジュラー乗算部８４２は、中間データｒのモジュラー２乗ｒ２  ｍｏｄ  Ｎを計算し、中間データｒに計算結果を格納する（１２４２）。
【０１８０】
ビット値判定部８４１は、条件：ｕｉ＞０が成立するか否かを判定する。条件が成立する場合、ステップ１２４４へ行く。条件が成立しない場合、すて覆う１２４４を飛ばし、ステップ１２４５へ行く（１２４３）。
【０１８１】
ステップ１２４３で条件が成立した場合、モジュラー乗算部８４２は、事前計算したｇ［Ｂ［ｕｉ］］と中間データｒとのモジュラー乗算ｇ［Ｂ［ｕｉ］］＊ｒ  ｍｏｄ  Ｎを計算し、中間データｒに計算結果を格納する（１２４４）。
【０１８２】
実計算部８０４は、変数ｉを１デクリメント（ｉ＝ｉ−１）し、ステップ１２４１へと戻る（１２４１）。
【０１８３】
ステップ１２４１で条件が成立しなかった場合、実計算部８０４は、中間データｒを、モジュラーべき乗算の演算結果ｇｄ  ｍｏｄ  Ｎとして出力し（１２５１）、処理を終了する。
【０１８４】
以上、本実施形態の前計算テーブル作成処理およびモジュラーべき乗算計算処理を説明した。なお、本実施形態においても、第一の実施形態同様、上記のモジュラー乗算は、モジュラー乗算を行うコプロセッサ１３５を用いて高速化してもよいし、また、モンゴメリ乗算を用いてモジュラー乗算を行い高速化を図ってもよい。
【０１８５】
なお、本実施形態においても、第一の実施形態同様、ステップ１２４１からステップ１２４５の間の繰り返し処理において、中間データｒに１が格納されている１回目の繰り返しにおいて、前計算テーブルに格納されている値ｇ［Ｂ［ｕｉ］］を中間データｒにコピーすることにより、モジュラー２乗算、モジュラー乗算を削減し、高速化を図るよう構成してもよい。
【０１８６】
次に、ｄ＝１３４＝（１００００１１０）２の場合を例にとり、図１２のエンコード処理を解説する。ここでは、テーブルサイズｋを３、テーブル格納候補Ｂを、Ｂ＝［１、２、３、０］とする。すなわち、ｇ、ｇ２、ｇ３を前計算テーブルに格納する。また、ウィンドウ幅ｗは２とする。
【０１８７】
１回目のステップ１１１２では、ｘにｄの下位２ビット１０を示す数値２が格納され、ｙにｄの下位１ビット０を示す数値０が格納される。ｘ＝２であるためキャリーは発生せず、ステップ１１１４でｃａｒｒｙｘに０が格納される。一方、ｙ＝０であるため、ステップ１１１７で２ｗ−１（＝２）がｙに加算され、キャリーが発生し、ｃａｒｒｙｙに１が格納される（第一の実施形態と同様に、キャリーそのものは−１であるが、アルゴリズムではその絶対値の１を格納している）。ここでは、ｘ＜＝２ｗ−１（＝２）であるので、ｘ、ｙ双方の値を選択可能である。ステップ１１２２でｗ−１（＝１）ビットの乱数ｒｎｄを生成する。この乱数ｒｎｄが０であったとすると、ｒｎｄ＜ｋ−２ｗ−１（＝１）であるのでｘを選択する。すなわち、ｕ０に２、ｕ１に０を格納する。
【０１８８】
２回目のステップ１１１２では、ｘに次の２ビットを示す数値１が格納され、ｙには次の１ビットを示す数値１が格納される。ｘ、ｙ双方ともキャリーは発生せず、ｃａｒｒｙｘ、ｃａｒｒｙｙそれぞれに０が格納される。ｘ＜＝２であるので、ステップ１１２２で乱数ｒｎｄを生成する。今回はｒｎｄ＝１であったとすると、ｒｎｄ＞＝１であるため、ｙを選択する。すなわち、ｕ２に１を格納する。
【０１８９】
３回目のステップ１１１２では、ｘに４、ｃａｒｒｙｘに１、ｙに２、ｃａｒｒｙｙに１がそれぞれ格納される。ｘ＞２であり、Ｂ［４］＝０である。ところが、ｇ４  ｍｏｄ  Ｎが前計算テーブルに格納されていないため、ｘを選択することはできない。そのため、ここでは、ｙを選択する。ｕ３には２を格納し、キャリーが発生する。
【０１９０】
同様に、４回目のステップ１１１２では、ｘに３、ｃａｒｒｙｘに１、ｙに１、ｃａｒｒｙｙに１がそれぞれ格納される。ｘ＞２であり、Ｂ［３］＝３である。ｇ３  ｍｏｄ  Ｎは前計算テーブルに存在する。このため、ｘを選択する。ｕ４に３を、ｕ５に０を格納し、キャリーが発生する。
【０１９１】
最後の２ビットに対しては、ｘに１、ｃａｒｒｙｘに０、ｙに１、ｃａｒｒｙｙに１が格納される。今回はｒｎｄ＝０とすると、ｘを選択する。ｕ６に１、ｕ７に０を格納する。
【０１９２】
結果として、エンコード結果は、（ｕ７ｕ６ｕ５…ｕ０）＝（０１０３２１０２）ｋ＝３となる。実際、（ｕ７ｕ６ｕ５…ｕ０）＝（０１０３２１０２）を用いて、ｄ＝ｕ７２７＋ｕ６２６＋…＋ｕ０２０を計算すると、その値は、１３４となり、ｄ＝１３４＝ｕ７２７＋ｕ６２６＋…＋ｕ０２０を満たす。
【０１９３】
前計算部８０３は、エンコードに用いる正整数１、２、３のそれぞれに対し、ｇ１  ｍｏｄ  Ｎ、ｇ２  ｍｏｄ  Ｎ、ｇ３  ｍｏｄ  Ｎを計算し、前計算テーブルに格納する。
【０１９４】
実計算部８０４は、このエンコードした数値列および前計算テーブルを用いて、０に対して２乗し、０以外の値に対して２乗と乗算を行うことによりモジュラーべき乗算を行う。
【０１９５】
Ｓをモジュラー２乗算、Ｍをモジュラー乗算を表すものとすると、上記ｄ＝１３４の場合、そのエンコード結果は（０１０３２１０２）であり、その演算列はＳＭ  ＳＳＭ  ＳＭ  ＳＭ  ＳＳＭ  となる。ただし、左端の０に対しては２乗算を行わないため、左端に０に対応するＳは出現しない。このように、本実施形態のエンコード処理によれば、モジュラーべき乗算計算時に固定された演算パターンを有する演算列ＳＭ、ＳＳＭが得られる。
【０１９６】
このときの実計算部８０４での計算の様子を図１４に示す。第一の実施形態同様、本図には、エンコード結果の数値列２１０１から前計算テーブルに格納されている各値（ｇ、ｇ２、ｇ３）２１０２を用いてモジュラーべき乗算を行う様子を示す。右側への矢印はモジュラー２乗算を、下側への矢印はモジュラー乗算を示す。モジュラー乗算の際、下矢印の終点位置と同位置の前計算テーブルに格納されている値と演算を行う。
【０１９７】
本実施形態の上記の演算列は、ｘが選択された場合はＳＳＭ、ｙが選択された場合はＳＭにより構成される。すなわち、べき指数ｄのバイナリ表現には依存せずに、確率（ｋ−２ｗ−１）／２ｗ−１でｘが選択されるため、ＳＳＭ、ＳＭの出現の仕方と秘密指数ｄとは因果関係がない。従って、ＳＰＡにより得た情報が攻撃者に役立たないものとなり、
（ａ）ＳＰＡに対して耐性があるものといえる。
【０１９８】
さらに、上述のように、本実施形態のモジュラーべき乗算計算によれば、ダミー演算は用いられない。従って、ダミー演算を用いないため、
（ｂ）セーフエラー攻撃に対して安全なものとなる。
【０１９９】
また、実計算部８０４の行うモジュラーべき乗算計算処理では、ｎ回のモジュラー２乗算と、ｎ／（ｗ−１＋（ｋ／２ｗ−１））回のモジュラー乗算を行う。通常レベルの脆弱性を有するモジュラーべき乗算の計算方法では、ｎ回のモジュラー２乗算、ｎ／２回のモジュラー乗算を行う。従って、本実施形態によれば、モジュラー乗算の計算回数が少なくて済む。従って、
（ｃ）効率的な演算処理が可能であるといえる。また、
（ｄ）テーブルサイズｋを変更することにより、メモリ量と高速性のトレードオフを利用した調整をきめ細かく行うことが出来る。
【０２００】
また、本実施形態はモジュラーべき乗算計算方法の改良であるため、モジュラーべき乗算を用いる、
（ｅ）ＲＳＡ暗号アルゴリズム、ＤＳＡ暗号アルゴリズムへの適用が可能である。また、第一の実施形態と同様に、本実施形態においても、前計算テーブルに保持する前計算値はベース元ｇの正の整数乗のモジュラーべき乗算の結果に限られ、計算量の大きい負の整数乗のモジュラーべき乗算が不要となるため、ＲＳＡ暗号系の処理には特に適している。
【０２０１】
上述のように、本実施形態のモジュラーべき乗算計算方法は、秘密のべき指数ｄをエンコードすることによりＳＰＡによる攻撃を防ぐよう構成されている。従って、
（ｆ）ベース元ｇをランダム化する一般的なＤＰＡの防御法と自由に組合せることができる。
【０２０２】
以上の通り、本実施形態の暗号化通信システムのモジュラーべき乗算計算方法は、先に記載した６項目（ａ）−（ｆ）のそれぞれを満たす。従って、スマートカードなどのリソースが限られた機器上に暗号アルゴリズムを実装するにあたり、サイドチャネル攻撃に対して耐性が高く、かつ、効率的な暗号化通信システムを得ることができる。
【０２０３】
＜＜第三の実施形態＞＞
本発明を適用した第三の実施形態について説明する。本実施形態では、エンコード処理およびモジュラーべき乗算計算を同時に行う。このように構成することにより、本実施形態では、エンコード結果を一旦格納する必要がなく、エンコード結果を格納するためのメモリを節約でき、また、モジュラーべき乗算計算部がエンコード部を具備する必要がなく、構成を簡易化できる、といった効果がある。
【０２０４】
本実施形態の暗号化通信システムの構成は、基本的に前述の各実施形態と同様である。このため、以下においては、主として異なる部分のみ説明する。
【０２０５】
本実施形態では、第一の実施形態のモジュラーべき乗算計算部１３６の代わりにモジュラーべき乗算計算部１３６−３を備える。図１５は、本実施形態のモジュラーべき乗算計算部１３６−３の機能ブロック図である。本図に示すように、本実施形態のモジュラーべき乗算計算部１３６−３は、べき指数変換部１３０２と、前計算部１３０３と、実計算部１３０４との各モジュールを備える。
【０２０６】
べき指数変換部１３０２は、閾値判定部１３２１、位数加算部１３２２、を備え、これらは、第一の実施形態の同名の機能部と同様の機能を有する。前計算部１３０３も、モジュラー乗算部１３３１、繰り返し判定部１３３２、を備え、これらは、第一の実施形態の同名の機能部と同様の機能を有する。実計算部１３０４は、キャリー判定部１３４１、剰余変換部１３４２、ビット値判定部１３４３、モジュラー乗算部１３４４、繰り返し判定部１３４５を備える。各機能の詳細は、以下に処理手順に沿って説明する。
【０２０７】
本実施形態では、モジュラーべき乗算計算部１３６−３が、べき指数ｄ、ベース元ｇ、ウィンドウ幅ｗから、モジュラーべき乗算ｇｄ  ｍｏｄ  Ｎを計算する。以下、本実施形態での計算手順について説明する。
【０２０８】
まず、本実施形態におけるモジュラーべき乗算計算時のモジュラーべき乗算計算部１３６−３を構成する各モジュール間のデータの流れについて説明する。図１６は、本実施形態のモジュラーべき乗算計算部１３６−３の各モジュール間のデータの流れを示すシーケンス図である。以下においても、第一の実施形態と同様に変換後のべき指数もｄで表す。本実施形態においても、前述の各実施形態と同様に、べき指数の変換は行わなくてもよい。また、予め変換したべき指数ｄを用いるよう構成してもよい。
【０２０９】
モジュラーべき乗算計算部１３６−３が、べき指数ｄ、ベース元ｇ、ウィンドウ幅ｗを受け取る（１４０１）。モジュラーべき乗算計算部１３６−３は、べき指数ｄをべき指数変換部１３０２に送る（１４０２）。べき指数変換部１３０２は、べき指数ｄを変換べき指数ｄに変換する。べき指数変換部１３０２は、変換べき指数ｄを実計算部１３０４に送る（１４０３）。モジュラーべき乗算計算部１３６−３は、ベース元ｇ、ウィンドウ幅ｗを前計算部１３０３に送る（１４０４）。前計算部１３０３は、ベース元ｇとウィンドウ幅ｗとを用いて前計算テーブルを作成する。前計算部１３０３は、前計算テーブルを実計算部１３０４に送る（１４０５）。モジュラーべき乗算計算部１３６−３は、ウィンドウ幅ｗを実計算部１３０４に送る（１４０６）。実計算部１３０４は、変換べき指数ｄ、前計算テーブル、ウィンドウ幅ｗを用いてモジュラーべき乗算を行う。実計算部１３０４は、モジュラーべき乗算の演算結果をモジュラーべき乗算計算部１３６−３に送る（１４０７）。モジュラーべき乗算計算部１３６−３は、モジュラーべき乗算の演算結果を出力する（１４０８）。
【０２１０】
なお、各モジュール間のデータの受け渡しには、データを直接転送する以外にも、記憶部１２２にデータを書き込み、転送先モジュールが記憶部１２２にアクセスし、データを読み出すよう構成してもよい。
【０２１１】
また、べき指数変換部１３０２の行うべき指数変換は、予め変換を行っておき、変換後のべき指数記憶部１２２に格納するよう構成してもよい。その際、モジュラーべき乗算計算部１３６−３には、変換後のべき指数ｄが入力される。そして、上記ステップ１４０２および１４０３の代わりに、モジュラーべき乗算計算部１３６−３から直接実計算部１３０４に変換べき指数ｄが送られる。
【０２１２】
実計算部１３０４が受け取る変換べき指数ｄ、前計算テーブル、ウィンドウ幅ｗは、実計算部１３０４がモジュラーべき乗算を行う前であれば、受け取る順番は問わない。例えば、前計算部１３０３が前計算テーブルを作成し、その後、べき指数変換部１３０２がべき指数変換を行うよう構成してもよい。
【０２１３】
前計算部１３０３の行う前計算テーブル作成は、ベース元ｇとウィンドウ幅ｗが予め定まっている場合、前計算テーブルを事前に作成し、記憶部１２２に格納しておいてもよい。その場合、ステップ１４０５と１４０６の処理の代わりに、実計算部１３０４が直接記憶部１２２にアクセスし、前計算テーブルを読み出す。
【０２１４】
次に本実施形態の、べき指数変換部１３０２、前計算部１３０３、実計算部１３０４の行う各処理について、それぞれが備える上記各機能部の働きとともに詳細に説明する。
【０２１５】
なお、べき指数変換部１３０２がべき指数ｄを変換されたべき指数ｄに変換す処理であるべき指数変換処理、および、前計算部１３０３がベース元ｇおよびウィンドウ幅ｗから前計算テーブルを作成する前計算テーブル作成処理は、第一の実施形態と同様であるため、ここでは説明しない。
【０２１６】
実計算部１３０４が、べき指数変換部３０２によって変換されたべき指数ｄおよび前計算部３０３が作成した前計算テーブルから、モジュラーべき乗算ｇｄ  ｍｏｄ  Ｎを計算するモジュラーべき乗算計算処理を説明する。図１７は、本実施形態のモジュラーべき乗算計算処理の処理フローである。
【０２１７】
実計算部１３０４は、べき指数変換部３０２が変換したべき指数ｄ、および前計算部３０３が作成した前計算テーブルを入力として受け取る（１５０１）。前計算テーブルには、ベース元ｇｉ毎のｇｉ  ｍｏｄ  Ｎ（ｉ＝１、２，…、２ｗ）、すなわち、ｇ［ｉ］＝ｇｉ  ｍｏｄ  Ｎが格納される。
【０２１８】
実計算部１３０４は、中間データｒに１を、変数ｉにｎ＋１を代入する（１５３１）。
【０２１９】
繰り返し判定部１３４５は、条件：ｉ＞ｗが成立するか否かを判定する。条件が成立する場合、ステップ１５４１へ行く。条件が成立しない場合、ステップ１５９１へ行く（１５３２）。
【０２２０】
ステップ１５３２で条件が成立した場合、剰余変換部１３４２は、数値（ｄｉ…ｄｉ−ｗ＋１）２を計算し、その結果をｕに代入する。また実計算部１３０４は、変数ｊにｉ−ｗ＋１を、変数ｋにｗをそれぞれ代入する（１５４１）。
【０２２１】
実計算部１３０４は、変数ｊの値を１デクリメント（ｊ＝ｊ−１）し、変数ｋの値を１デクリメント（ｋ＝ｋ−１）する（１５４２）。
【０２２２】
繰り返し判定部１３４５は、条件：ｋ＝０またはｊ＝０が成立するか否かを判定する。条件が成立する場合、ステップ１５６１へ行く。条件が成立しない場合、ステップ１５５２へ行く（１５５１）。
【０２２３】
ステップ１５５１で条件が成立しなかった場合、ビット値判定部１３４３は、条件：ｄｊ＝０が成立するか否かを判定する。条件が成立する場合、ステップ１５４２へと戻る。条件が成立しない場合、ステップ１５８１へ行く（１５５２）。
【０２２４】
ステップ１５５１で条件が成立した場合、ビット値判定部１３４３および繰り返し判定部１３４５は、条件：ｄｊ＝１かつｊ＞０が成立するか否かを判定する。条件が成立する場合、ステップ１５６２へ行く。条件が成立しない場合、ステップ１５７１へ行く（１５６１）。
【０２２５】
ステップ１５６１で条件が成立した場合、実計算部１３０４は、変数ｋにｗを代入し、ステップ１５４２へと戻る（１５６２）。
【０２２６】
ステップ１５６１で条件が成立しなかった場合、ビット値判定部１３４３は、条件：ｄｊ＝０が成立するか否かを判定する。条件が成立する場合、ステップ１５７２へ行く。条件が成立しない場合、ステップ１５８１へ行く（１５７１）。
【０２２７】
ステップ１５７１で条件が成立した場合、剰余変換部１３４２は、ｕにｕ−１を代入し、ステップ１５８１へ行く（１５７２）。
【０２２８】
キャリー判定部１３４１は、条件：ｕ＜＝０が成立するか否かを判定する。条件が成立する場合、ステップ１５８２へ行く。条件が成立しない場合、ステップ１５８３へ行く（１５８１）。
【０２２９】
ステップ１５８１で条件が成立した場合、剰余変換部１３４２は、ｕにｕ＋２ｗを代入する（１５８２）。
【０２３０】
モジュラー乗算部１３４４は、中間データｒのモジュラー２ｗ乗ｒ２ｗ  ｍｏｄ  Ｎを計算し、中間データｒに計算結果を格納する。この計算は、中間データｒのモジュラー２乗ｒ２  ｍｏｄ  Ｎを計算し、中間データｒに計算結果を格納し、この処理をｗ回繰り返すことにより達成できる。さらに、モジュラー乗算部１３４４は、中間データｒと事前計算したｇ［ｕ］とのモジュラー乗算ｒ＊ｇ［ｕ］  ｍｏｄ  Ｎを計算し、中間データｒに計算結果を格納する。実計算部１３０４は、変数ｉをウィンドウ幅ｗ分デクリメント（ｉ＝ｉ−ｗ）し、ステップ１５３２へと戻る（１５８３）。
【０２３１】
ステップ１５３２で条件が成立しない場合、剰余変換部１３４２は、（ｄｉ…ｄ０）２を計算し、その結果をｕに代入する（１５９１）。
【０２３２】
キャリー判定部１３４１は、条件：ｕ＝０が成立するか否かを判定する。条件が成立する場合、ステップ１５９３へ行く。条件が成立しない場合、ステップ１５９４へ行く（１５９２）。
【０２３３】
ステップ１５９２で条件が成立する場合、剰余変換部１３４２は、ｕにｕ＋２ｗを代入する（１５９３）。
【０２３４】
モジュラー乗算部１３４４は、中間データｒのモジュラー２ｉ＋１乗であるｒ２ｉ＋１  ｍｏｄ  Ｎを計算し、中間データｒに計算結果を格納する。この計算は、中間データｒのモジュラー２乗ｒ２  ｍｏｄ  Ｎを計算し、中間データｒに計算結果を格納し、この処理をｉ＋１回繰り返すことにより達成できる。さらに、モジュラー乗算部１３４４は、中間データｒと事前計算したｇ［ｕ］とのモジュラー乗算ｒ＊ｇ［ｕ］  ｍｏｄ  Ｎを計算し、中間データｒに計算結果を格納する（１５９４）。
【０２３５】
実計算部１３０４は、中間データｒを、モジュラーべき乗算の演算結果ｇｄ  ｍｏｄ  Ｎとして出力する（１５９５）。
【０２３６】
以上、本実施形態のモジュラーべき乗算計算処理を説明した。なお、本実施形態においても、上記各実施形態同様、上記のモジュラー乗算は、モジュラー乗算を行うコプロセッサ１３５を用いて高速化してもよいし、また、モンゴメリ乗算を用いてモジュラー乗算を行い高速化を図ってもよい。
【０２３７】
また、本実施形態においても、前述の各実施形態同様、ステップ１５３２からステップ１５８３の間の繰り返し処理において、中間データｒに１が格納されている１回目の繰り返しにおいて、前計算テーブルに格納されている値ｇ［ｕ］を中間データｒにコピーすることにより、モジュラー２乗算、モジュラー乗算を削減し、高速化を図るよう構成してもよい。
【０２３８】
また、上記では、第一の実施形態同様、モジュラーべき乗算計算部１３６−３が、べき指数ｄ、ベース元ｇ、ウィンドウ幅ｗを用いてモジュラーべき乗算ｇｄ  ｍｏｄ  Ｎを計算する構成を例にあげて説明した。しかし、本実施形態においても、第二の実施形態のモジュラーべき乗算計算手順、すなわち、モジュラーべき乗算計算部１３６−３が、べき指数ｄ、ベース元ｇ、テーブルサイズｋを用いてモジュラーべき乗算ｇｄ  ｍｏｄ  Ｎを計算する構成も適用可能である。
【０２３９】
以上説明したように、本実施形態のモジュラーべき乗算計算部１３６−３において行うモジュラーべき乗算計算のアルゴリズムは、基本的に前述の各実施形態と同じである。従って、本実施形態の暗号化通信システムのモジュラーべき乗算計算方法も、先に記載した６項目（ａ）−（ｆ）のそれぞれを満たす。従って、スマートカードなどのリソースが限られた機器上に暗号アルゴリズムを実装するにあたり、サイドチャネル攻撃に対して耐性が高く、かつ、効率的な暗号化通信システムを得ることができる。
【０２４０】
さらに、本実施形態では、エンコード処理およびモジュラーべき乗算計算を同時に行うため、エンコード結果を一旦格納するためのメモリが不要となり、また、モジュラーべき乗算計算部がエンコード部を独立して具備する必要がない。従って、前述の各実施形態に比べ、構成を簡易化できるといった効果がある。
【０２４１】
なお、本実施形態では、上述のようにべき指数ｄを上位ビットから読み込んでエンコード処理を行う手法を例に挙げて説明した。一方、第一の実施形態および第二の実施形態では、べき指数ｄを下位ビットから読み込んでエンコード処理を行う手法を例に挙げて説明した。しかし、いずれの手法も上記いずれの実施形態にも適用可能である。
【０２４２】
＜＜第四の実施形態＞＞
本発明を適用した第四の実施形態について説明する。本実施形態では、ベース元ｇが事前に定まっている場合、前計算テーブルを予め作成する。前計算テーブルを予め作成しておくことにより、より高速なモジュラーべき乗算の計算を実現することができる。
【０２４３】
本実施形態の暗号化通信システムの構成は、基本的に前述の各実施形態と同様である。このため、以下においては、主として異なる部分のみ説明する。
【０２４４】
本実施形態では、第一の実施形態のモジュラーべき乗算計算部１３６の代わりにモジュラーべき乗算計算部１３６−４を備える。図１８は、本実施形態のモジュラーべき乗算計算部１３６−４の機能ブロック図である。本図に示すように、本実施形態のモジュラーべき乗算計算部１３６−４は、エンコード部１６０１と、実計算部１６０２との各モジュールを備える。
【０２４５】
エンコード部１６０１は、位数加算部１６１１、キャリー判定部１６１２、剰余変換部１６１３、繰り返し判定部１６１４を備える。実計算部１６０２は、モジュラー乗算部１６２２、繰り返し判定部１６２３を備える。各機能の詳細は、以下処理手順に沿って説明する。
【０２４６】
本実施形態では、モジュラーべき乗算計算部１３６−４が、べき指数ｄ、ウィンドウ幅ｗ、前計算テーブル、分割数ｖから、モジュラーべき乗算ｇｄ  ｍｏｄ  Ｎを計算する。なお、分割数ｖは、前計算テーブルに格納するベースの元ｇのべき乗の基数を定めるものである。
【０２４７】
まず、前計算テーブルの構成を説明する。図１９は、本実施形態の前計算テーブルを説明するための図である。
【０２４８】
本図に示すように、分割数がｖのとき、べき指数ｄをｖ個の部分（セグメント）に分割する。ここで、べき指数ｄのビット長をｎとする。すなわち、２ｎ／ｖを基数として（ｎがｖで割り切れない場合もあるため、より正確にはｔ＝ＣＥＩＬ（（ｎ＋１）／（ｖ＊ｗ））とし、２ｔｗを基数とする。）、べき指数ｄを２ｎ／ｖ進表現ｄ＝ｄ（ｖ−１）２（ｖ−１）ｎ／ｖ＋ｄ（ｖ−２）２（ｖ−２）ｎ／ｖ＋…＋（１）２ｎ／ｖ＋ｄ（０）に展開する。
【０２４９】
モジュラーべき乗計算の計算には、ｇｖ−１＝ｇ＾｛２（ｖ−１）ｎ／ｖ｝  ｍｏｄ  Ｎ、ｇｖ−２＝ｇ＾｛２（ｖ−２）ｎ／ｖ｝  ｍｏｄ  Ｎ、．．．、ｇ１＝ｇ＾｛２ｎ／ｖ｝  ｍｏｄ  Ｎ、ｇ０＝ｇ  ｍｏｄ  Ｎとし、ｄ（ｖ−１）、．．．、ｄ（０）に対するモジュラー多重べき乗計算ｇｖ−１ｄ（ｖ−１）＊ｇｖ−２ｄ（ｖ−２）＊．．．＊ｇ１ｄ（１）＊ｇ０ ｄ（０）  ｍｏｄ  Ｎを計算することにより、モジュラーべき乗算を計算する。
【０２５０】
前計算テーブルでは、ｇｖ−１、ｇｖ−２、…、ｇ１、ｇ０のべき積ｇｖ−１ｊｖ−１＊ｇｖ−２ｊｖ−２＊…＊ｇ１ｊ１＊ｇ１ｊ１  ｍｏｄ  Ｎがｇ［ｊｖ−１、ｊｖ−２、…、ｊ１、ｊ０］に格納される（ここで、ｊｖ−１＝０、１、…、２ｗ、ｊｖ−２＝１、２、…、２ｗ、…、ｊ１＝１、２、…、２ｗ、…、ｊ０＝１、２、…、２ｗ）。すなわち、ｖ個の各セグメントは、ｔ個のブロックから成り、各ブロックはｗビットの値により構成される。従って、前計算テーブルに格納される値は、各セグメントにつきｗビットの値のべき乗（ｇｔｊｔ）を選び、全てのセグメントにわたって乗じた値となる。
【０２５１】
以下、本実施形態の計算手順について説明する。まず、本実施形態におけるモジュラーべき乗算計算時のモジュラーべき乗算計算部１３６−４を構成する各モジュール間のデータの流れについて説明する。
【０２５２】
図２０は、本実施形態のモジュラーべき乗算計算部１３６−４の各モジュール間のデータの流れを示すシーケンス図である。
【０２５３】
モジュラーべき乗算計算部１３６−４が、べき指数ｄ、前計算テーブル、ウィンドウ幅ｗ、分割数ｖを受け取る（１７０１）。モジュラーべき乗算計算部１３６−４は、べき指数ｄ、ウィンドウ幅ｗをエンコード部１６０１に送る（１７０２）。エンコード部１６０１は、べき指数ｄとウィンドウ幅ｗとからエンコード列を計算する。エンコード部１６０１は、エンコード列を実計算部１６０２へ送る（１７０３）。モジュラーべき乗算計算部１３６−４は前計算テーブルとウィンドウ幅ｗと分割数ｖとを実計算部１６０２へ送る（１７０４）。実計算部１６０２は、エンコード列、前計算テーブル、ウィンドウ幅ｗ、分割数ｖを用いてモジュラーべき乗算を行う。実計算部１６０２は、モジュラーべき乗算の演算結果をモジュラーべき乗算計算部１３６−４に送る（１７０５）。モジュラーべき乗算計算部１３６−４は、モジュラーべき乗算の演算結果を出力する（１７０６）。
【０２５４】
なお、各モジュール間のデータの受け渡しには、データを直接転送する以外にも、記憶部１２２にデータを書き込み、転送先モジュールが記憶部１２２にアクセスし、データを読み出すよう構成してもよい。
【０２５５】
また、エンコード部１６０１が受け取るべき指数ｄとウィンドウ幅ｗとは、エンコード部１６０１がエンコード列の計算を始める前であれば、受け取る順番は問わない。例えば、ウィンドウ幅ｗを受け取った後に変換べき指数ｄを受け取るよう構成してもよい。
【０２５６】
実計算部１６０２が受け取るエンコード列、前計算テーブル、ウィンドウ幅ｗ、分割数ｖは、実計算部１６０２がモジュラーべき乗算を行う前であれば、受け取る順番は問わない。例えば、実計算部１６０２がウィンドウ幅ｗ、前計算テーブル、分割数ｖを受け取った後に、エンコード部１６０１がエンコード列の計算を行い、エンコード列を実計算部１６０２へ送るよう構成してもよい。
【０２５７】
次にエンコード部１６０１、実計算部１６０２の行う各処理について、それぞれが備える上記各機能部の働きとともに詳細に説明する。
【０２５８】
エンコード部１６０１が、ウィンドウ幅ｗ、前計算テーブル、分割数ｖを用いて、べき指数ｄをエンコード列ｕｎ＋１、…、ｕ０（各ｕｉは正の値（１、２、…、２ｗ）である。）にエンコードするエンコード処理、および、実計算部１６０２が、エンコード部１６０１がエンコードしたエンコード列ｕ、前計算テーブル、ウィンドウ幅ｗ、分割数ｖを用いてｇｄ  ｍｏｄ  Ｎを計算するモジュラーべき乗算計算処理について説明する。図２１は、エンコード処理およびモジュラーべき乗算計算処理の処理フローである。
【０２５９】
エンコード部１６０１は、ビット長がｎビットのべき指数ｄとウィンドウｗを入力として受け取る。そして、実計算部１６０２は、分割数ｖとウィンドウ幅ｗと前計算テーブルｇ［０、１、…、１］、…、ｇ［２ｗ、２ｗ、…、２ｗ］とを入力として受け取る（１８０１）。
【０２６０】
位数加算部１６１１は、べき指数ｄにｄ＋Φ（Ｎ）を代入する。エンコード部１６０１は、変数ｉに初期値０を、ｃａｒｒｙに０を代入し、ステップ１８１１へ行く（１８０２）。
【０２６１】
繰り返し判定部１６１４は、条件：ｉ＋ｗ＜ｎ−１が成立するか否かを判定する。条件が成立する場合、ステップ１８１２へ行く。条件が成立しない場合、ステップ１８２１へ行く（１８１１）。
【０２６２】
ステップ１８１１で条件が成立した場合、剰余変換部１６１３は、数値（ｄｉ＋ｗ−１…ｄｉ）２−ｃａｒｒｙを計算し、その結果をｕｉに代入する（１８１２）。
【０２６３】
キャリー判定部１６１２は、条件：ｕｉ＜＝０が成立するか否かを判定する。条件が成立する場合、ステップ１８１５へ行く。条件が成立しない場合、ステップ１８１４へ行く（１８１３）。
【０２６４】
ステップ１８１３で条件が成立しなかった場合、エンコード部１８１３は、ｃａｒｒｙに０を代入し、ステップ１８１６へ行く（１８１４）。
ステップ１８１３で条件が成立した場合、剰余変換部１６１３は、ｕｉにｕｉ＋２ｗを代入し、エンコード部１６０１は、ｃａｒｒｙに１を代入する（１８１５）。
【０２６５】
剰余変換部１６１３は、ｕｉ＋ｗ−１、…、ｕｉ＋１にそれぞれ０を代入する。エンコード部１６０１は、変数ｉをウィンドウ幅ｗ分インクリメント（ｉ＝ｉ＋ｗ）し、ステップ１８１１へと戻る（１８１６）。
【０２６６】
ステップ１８１１で条件が成立しなかった場合、剰余変換部１６１３は、数値（ｄｎ…ｄｉ）２−ｃａｒｒｙを計算し、その結果をｕｉに代入する。エンコード列ｕｎ＋１、…、ｕ０を出力し、エンコード処理は終了する（１８２１）。
【０２６７】
実計算部１６０２は、ＣＥＩＬ（（ｎ＋１）／（ｖ＊ｗ））を計算し、変数ｔに代入する（１８２２）。
【０２６８】
繰り返し判定部１６２３は、条件：ｉ＜ｔ＊ｖ＊ｗが成立するか否かを判定する。条件が成立する場合、ステップ１８２４へ行く。条件が成立しない場合、ステップ１８３１へ行く（１８２３）。
【０２６９】
ステップ１８２３で条件が成立した場合、実計算部１６０２は、ｕｉに０を、変数ｉを１インクリメント（ｉ＝ｉ＋１）し、ステップ１８２３へ戻る（１８２４）。
【０２７０】
ステップ１８２３で条件が成立しなかった場合、実計算部１６０２は、変数ｉにｔ−１を、中間データｒに１を代入し、ステップ１８４１へ行く（１８３１）。
【０２７１】
繰り返し判定部１６２３は、条件：ｉ＞＝０が成立するか否かを判定する。条件が成立する場合、ステップ１８４２へ行く。条件が成立しない場合、ステップ１８５１へ行く（１８４１）。
【０２７２】
モジュラー乗算部１６２２は、中間データｒのモジュラー２ｗ乗ｒ２ｗ  ｍｏｄ  Ｎを計算し、中間データｒに計算結果を格納する。なお、本計算は、中間データｒのモジュラー２乗ｒ２  ｍｏｄ  Ｎを計算し、当該計算結果を中間データｒにするという処理をｗ回繰り返すことにより達成できる。さらに、モジュラー乗算部１６２２は、中間データｒと事前計算したｇ［ｕ（ｖ−１）ｔｗ＋ｉｗ、ｕ（ｖ−２）ｔｗ＋ｉｗ、…、ｕｔｗ＋ｉｗ、ｕｉｗ］とのモジュラー乗算ｒ＊ｇ［ｕ（ｖ−１）ｔｗ＋ｉｗ、ｕ（ｖ−２）ｔｗ＋ｉｗ、…、ｕｔｗ＋ｉｗ、ｕｉｗ］  ｍｏｄ  Ｎを計算し、当該計算結果を中間データｒに格納する（１８４２）。
【０２７３】
実計算部１６０２は、変数ｉを１デクリメント（ｉ＝ｉ−１）し、ステップ１８４１へと戻る（１８４３）。
【０２７４】
ステップ１８４１で条件が成立しない場合、実計算部１６０２は中間データｒを、モジュラーべき乗の演算結果ｇｄ  ｍｏｄ  Ｎとして出力し（１８５１）、処理を終了する。
【０２７５】
なお、ステップ１８０２で用いるΦ（Ｎ）は、予め記憶部１２２に格納しておき、エンコード部１６０１が記憶部１２２にアクセスし、Φ（Ｎ）を読み出してもよい。
【０２７６】
エンコード処理およびモジュラーべき乗算計算処理を説明した。なお、本実施形態においても、前述の各実施形態同様、上記のモジュラー乗算は、モジュラー乗算を行うコプロセッサ１３５を用いて高速化してもよいし、また、モンゴメリ乗算を用いてモジュラー乗算を行い高速化を図ってもよい。
【０２７７】
また、本実施形態においても、前述の各実施形態同様、ステップ１８４１からステップ１８４３の間の繰り返し処理において、中間データｒに１が格納されている１回目の繰り返し処理では、前計算テーブルに格納されている値を中間データｒにコピーすることにより、モジュラー２乗算、モジュラー乗算を削減し、高速化を図るよう構成してもよい。
【０２７８】
以上説明したように、本実施形態のモジュラーべき乗算計算部１３６−４において行うモジュラーべき乗算計算のアルゴリズムは、基本的に第一の実施形態と同様である。従って、本実施形態の暗号化通信システムのモジュラーべき乗算計算方法も、先に記載した６項目（ａ）−（ｆ）のそれぞれを満たす。従って、スマートカードなどのリソースが限られた機器上に暗号アルゴリズムを実装するにあたり、サイドチャネル攻撃に対して耐性が高く、かつ、効率的な暗号化通信システムを得ることができる。
【０２７９】
また、本実施形態は、上述のように、前計算テーブルを予め作成しておく。従って、より高速なモジュラーべき乗算の計算を実現することができる。
【０２８０】
さらに、ＤＳＡ暗号アルゴリズムでは、ベース元ｇがメッセージに依存しない。このため、初期設定時に１回前計算テーブルを生成しておけばよい。従って、ＤＳＡ暗号アルゴリズムによる署名生成処理は、本実施形態の適用先として最適である。一般に、前計算テーブルを作成する前処理は計算負荷が高いが、本実施形態のように予め作成した前計算テーブルを利用することにより、システム全体の処理の計算負荷を高めることなく高速な処理を実現することができる。
【０２８１】
なお、以上の各実施形態では、本発明を暗号化通信システムに適用した場合を例に挙げて説明した。しかし、本発明は、署名検証システムに適用してもよい。本発明を署名検証システムに適用する場合は、コンピュータＢ１２１が署名の生成を行い、コンピュータＡ１０１が、ネットワーク１４２を経由して送信された署名１４３の検証を行う。
【０２８２】
この場合、コンピュータＢ１２１の復号化部１３３は、署名生成部として機能し、入力されたメッセージに対する署名の生成を行う。コンピュータＡ１０１の暗号化部１１３は、署名検証部として機能し、署名の検証を行う。メッセージＭに対する署名を行う際には、Ｃ＝Ｍｄ  ｍｏｄ  Ｎを計算する。署名の検証を行う際にはＭ’＝Ｃｅ  ｍｏｄ  Ｎを計算し、Ｍ＝Ｍ’が成立する場合、その検証結果として「有効」を出力する。Ｍ＝Ｍ’が不成立の場合、「無効」を出力する。
【０２８３】
また、上記各実施形態における暗号化部１１３、復号化部１３３、署名生成部、署名検証部は、専用のハードウェアを用いて行って構成してもよい。また、モジュラーべき乗算計算部をコプロセッサまたはそれ以外の専用ハードウェアで実現しても良い。また、データ処理部は、上記暗号化処理、復号化処理、署名生成処理、署名検証処理のうち、任意の一つ以上の処理を行えるように構成してもよい。
【図面の簡単な説明】
【０２８４】
【図１】本発明を適用した第一の実施形態の暗号化通信システムのシステム構成図である。
【図２】第一の実施形態のデータが入力された際のコンピュータの各処理部が行う情報の受け渡しのシーケンス図である。
【図３】第一の実施形態のモジュラーべき乗算計算部の機能ブロック図である。
【図４】第一の実施形態のモジュラーべき乗算計算部の各モジュール間のデータの流れを示すシーケンス図である。
【図５】第一の実施形態のべき指数変換処理のフローチャートである。
【図６】第一の実施形態のエンコード処理のフローチャートである。
【図７】第一の実施形態の前計算テーブル作成処理およびモジュラーべき乗算計算処理のフローチャートである。
【図８】第一の実施形態の演算の様子を示す図である。
【図９】第二の実施形態のモジュラーべき乗算計算部の機能ブロック図である。
【図１０】第二の実施形態のモジュラーべき乗算計算部の各モジュール間のデータの流れを示すシーケンス図である。
【図１１】第二の実施形態の分数ウィンドウ生成処理のフローチャートである。
【図１２】第二の実施形態のエンコード処理のフローチャートである。
【図１３】第二の実施形態の前計算テーブル作成処理およびモジュラーべき乗算計算処理のフローチャートである。
【図１４】第二の実施形態の演算の様子を示す図である。
【図１５】第三の実施形態のモジュラーべき乗算計算部の機能ブロック図である。
【図１６】第三の実施形態のモジュラーべき乗算計算部の各モジュール間のデータの流れを示すシーケンス図である。
【図１７】第三の実施形態のモジュラーべき乗算計算処理のフローチャートである。
【図１８】第四の実施形態のモジュラーべき乗算計算部の機能ブロック図である。
【図１９】第四の実施形態の前計算テーブルを説明するための図である。
【図２０】第四の実施形態のモジュラーべき乗算計算部の各モジュール間のデータの流れを示すシーケンス図である
【図２１】第四の実施形態のエンコード処理およびモジュラーべき乗算計算処理のフローチャートである。
【符号の説明】
【０２８５】
１０１：コンピュータＡ，１０２：記憶部、１０３：ＲＡＭ、１０４：定数、１０５：秘密情報、１０６：ＥＥＰＲＯＭ，１０７：ＲＯＭ、１０８：外部記憶装置、１０９：ディスプレイ、１１０：キーボード、１１１：入出力インタフェース、１１２：処理部、１１３：暗号化部、１１４：ＣＰＵ，１１５：コプロセッサ、１１６：モジュラーべき乗算計算部、１２１：コンピュータＡ，１２２：記憶部、１２３：ＲＡＭ、１２４：定数、１２５：秘密情報、１２６：ＥＥＰＲＯＭ，１２７：ＲＯＭ、１２８：外部記憶装置、１２９：ディスプレイ、１３０：キーボード、１３１：入出力インタフェース、１３２：処理部、１３３：暗号化部、１３４：ＣＰＵ，１３５：コプロセッサ、１３６：モジュラーべき乗算計算部、１４１：データ、１４２：ネットワーク、３０１：エンコード部、３０２：べき指数変換部、３０３：前計算部、３０４：実計算部、３１１：キャリー判定部、３１２：剰余変換部、３１３：繰り返し判定部、３２１：閾値判定部、３２２：位数加算部、３３１：モジュラー乗算部、３３２：繰り返し判定部、３４１：ビット値判定部、３４２：モジュラー乗算部、３４３：繰り返し判定部、１３６−２：モジュラー乗算計算部、８０１：エンコード部、８０２：べき指数変換部、８０３：前計算部、８０４：実計算部、８０５：分数ウィンドウ生成部、８１１：キャリー判定部、８１２：剰余候補せい西部、８１３：繰り返し判定部、８１４：剰余選択部、８１５：乱数生成部、８２１：閾値判定部、８２２：位数加算部、８３１：モジュラー乗算部、８３２：繰り返し判定部、８３３：格納候補判定部、８４１：ビット値判定部、８４２：モジュラー乗算部、８４３：繰り返し判定部、８５１：格納候補選択部、８５２：繰り返し判定部、８５３：乱数生成部、１３６−３：モジュラー乗算計算部、１３０２：べき指数変換部、１３０３：前計算部、１３０４：実計算部、１３２１：閾値判定部、１３２２：位数加算部、１３３１：モジュラー乗算部、１３３２：繰り返し判定部、１３４１：キャリー判定部、１３４２：剰余変換部、１３４３：ビット値判定部、１３４４：モジュラー乗算部、１３４５：繰り返し判定部、１３６−４：モジュラー乗算計算部、１６０１：エンコード部、１６０２：実計算部、１６１１：位数加算部、１６１２：キャリー判定部、１６１３：剰余変換部、１６１４：繰り返し判定部、１６２２：モジュラー乗算部、１６２３：繰り返し判定部
【図１】
2007187908.tif 000003
【図２】
2007187908.tif 000004
【図３】
2007187908.tif 000005
【図４】
2007187908.tif 000006
【図５】
2007187908.tif 000007
【図６】
2007187908.tif 000008
【図７】
2007187908.tif 000009
【図８】
2007187908.tif 000010
【図９】
2007187908.tif 000011
【図１０】
2007187908.tif 000012
【図１１】
2007187908.tif 000013
【図１２】
2007187908.tif 000014
【図１３】
2007187908.tif 000015
【図１４】
2007187908.tif 000016
【図１５】
2007187908.tif 000017
【図１６】
2007187908.tif 000018
【図１７】
2007187908.tif 000019
【図１８】
2007187908.tif 000020
【図１９】
2007187908.tif 000021
【図２０】
2007187908.tif 000022
【図２１】
2007187908.tif 000023