(57)【特許請求の範囲】
【請求項１】
外部とのデータ送受信を行う入出力ポートと、プログラムとデータを格納する記憶装置と、前記プログラムに従ってデータ処理を実行する演算装置と、前記入出力ポート、記憶装置および演算装置を接続するバスとを有する情報処理装置における、データ処理と消費電流との関連性を減らすための方法であって、前記データ処理に関して、前記演算装置が暗号処理中に出現する剰余乗算であるＡ＊Ｂ＊Ｒ＾（−１） ｍｏｄ Ｎを計算する際に実行されるその方法は、
（１）次のステップ（２）と（３）のいずれかをランダムに選択するステップ、
（２）モンゴメリ法に従ってビットストリングデータについてＳ１＝Ａ＊Ｂ＊Ｒ＾（−１） ｍｏｄ Ｎ（Ｂは乗数、Ａは被乗数、Ｎは２つの大きな素数の積、Ｒは２＾（前記ビットストリングデータのビット長））を計算するステップ、
（３）Ｓ２＝｛ｓＮ + Ａ*(-1)^ｆ ｝＊｛ｔＮ + Ｂ*(-1)^ｇ｝ Ｒ＾（−１） ｍｏｄ Ｎ （任意の整数ｓ, ｔ, ｆ, ｇは少なくとも１つは０でない整数であり、ｆ, ｇは０又は１）を計算するステップ、
（４）前記ビットストリングデータを構成する各々のビットブロックについて上記（１）（２）（３）を繰り返し、最後に前記ビットストリングデータの最後のビットブロックについて上記（２）を選択したときには計算結果Ｓ１についてＴ１＝Ｓ１＊Ｒ＾（−１） ｍｏｄＮを計算してＴ１を出力し、上記（３）を選択したときには計算結果Ｓ２についてＴ２＝Ｓ２＊Ｒ＾（−１） ｍｏｄＮを計算してＮ−Ｔ２を出力するステップ、および
（５）Ｔ１とＮ−Ｔ２を、暗号処理の剰余乗算Ａ＊Ｂ＊Ｒ＾（−１） ｍｏｄ Ｎの計算結果として用いるステップを有することを特徴とする耐タンパーモジュラ演算処理方法。
【請求項２】
前記（１）の選択するとは、乱数を用いていずれかを選択することを特徴とする請求項１記載の耐タンパーモジュラ演算処理方法。
【請求項３】
前記（ｓ, ｔ, ｆ, ｇ）は、(０, １, ０, １)であることを特徴とする請求項１記載の耐タンパーモジュラ演算処理方法。
【請求項４】
前記（ｓ, ｔ, ｆ, ｇ）は、(１, ０, １, ０)であることを特徴とする請求項１記載の耐タンパーモジュラ演算処理方法。
【請求項５】
外部とのデータ送受信を行う入出力ポートと、プログラムとデータを格納する記憶装置と、前記プログラムに従ってデータ処理を実行する演算装置と、前記入出力ポート、記憶装置および演算装置を接続するバスとを有する情報処理装置における、データ処理と消費電流との関連性を減らすための方法であって、前記データ処理に関して、前記演算装置が暗号処理中に出現する剰余乗算であるＡ＊Ｂ ｍｏｄ ｐ （ｐは素数）を計算する際に実行されるその方法は、
（１）次のステップ（２）と（３）のいずれかをランダムに選択するステップ、
（２）ビットストリングデータについてＳ＝Ａ＊Ｂ ｍｏｄ ｐ（Ｂは乗数、Ａは被乗数）を計算するステップ、
（３）Ｓ＝｛sｐ + Ａ*(-1)^f ｝＊｛tｐ + Ｂ*(-1)^g｝ ｍｏｄ ｐ （任意の整数ｓ, ｔ, ｆ, ｇは少なくとも１つは０でない整数であり、ｆ, ｇは０又は１でｆ＋ｇは偶数）を計算するステップ、および
（４）上記（２）と（３）のうち選択された方の計算結果Ｓを暗号処理の剰余乗算Ａ＊Ｂ ｍｏｄ ｐの計算結果として用いるステップを有することを特徴とする耐タンパーモジュラ演算処理方法。
【請求項６】
前記（ｓ, ｔ, ｆ, ｇ）は、(１, １, １, １)であることを特徴とする請求項５記載の耐タンパーモジュラ演算処理方法。
【請求項７】
前記（３）のステップのｆ＋ｇは奇数であって、前記（４）の代わりに、
（４）前記（２）を選択したときは計算結果Ｓそのままとし、前記（３）を選択したときにはＳの代わりにｐ−Ｓを計算結果とするステップ、および
（５）前記Ｓとｐ−Ｓを、暗号処理の剰余乗算Ａ＊Ｂ ｍｏｄ ｐの計算結果として用いるステップを有することを特徴とする請求項５記載の耐タンパーモジュラ演算処理方法。
【請求項８】
前記（ｓ, ｔ, ｆ, ｇ）は、(０, １, ０, １)であることを特徴とする請求項７記載の耐タンパーモジュラ演算処理方法。
【請求項９】
外部とのデータ送受信を行う入出力ポートと、プログラムとデータを格納する記憶装置と、前記プログラムに従ってデータ処理を実行する演算装置と、前記入出力ポート、記憶装置および演算装置を接続するバスとを有する情報処理装置における、データ処理と消費電流との関連性を減らすための方法であって、前記データ処理に関して、前記演算装置が暗号処理中に出現する剰余乗算であるＡ（ｘ）＊Ｂ（ｘ） ｍｏｄ Φ（ｘ）（Φ（ｘ）はｘの既約多項式であり、Ａ（ｘ）＊Ｂ（ｘ）の係数の演算は３以上の素数ｐを法として行う）を計算する際に実行されるその方法は、
（１）次のステップ（２）と（３）のいずれかをランダムに選択するステップ、
（２）Ｓ（ｘ）＝Ａ（ｘ）＊Ｂ（ｘ） ｍｏｄ Φ（ｘ）（Ａ（ｘ）又はＢ（ｘ）はｘの多項式）を計算するステップ、
（３）Ｓ（ｘ）＝｛ｓΦ（ｘ） + Ａ（ｘ）*(-1)^ｆ ｝＊｛ｔΦ（ｘ） + Ｂ（ｘ）*(-1)^ｇ｝ ｍｏｄ Φ（ｘ） （任意の整数ｓ, ｔ, ｆ, ｇは少なくとも１つは０でない整数であり、ｆ, ｇは０又は１でｆ＋ｇは偶数）を計算するステップ、および
（４）上記（２）と（３）のうち選択された方の計算結果Ｓ（ｘ）を、暗号処理の剰余乗算Ａ（ｘ）＊Ｂ（ｘ） ｍｏｄ Φ（ｘ）の計算結果として用いるステップを有することを特徴とする耐タンパーモジュラ演算処理方法。
【請求項１０】
前記（ｓ, ｔ, ｆ, ｇ）は、(１, １, １, １)であることを特徴とする請求項９記載の耐タンパーモジュラ演算処理方法。
【請求項１１】
前記（３）のステップのｆ＋ｇは奇数であって、前記（４）の代わりに、
（４）前記（２）を選択したときは計算結果Ｓ（ｘ）そのままとし、上記（３）を選択したときにはＳ（ｘ）の代わりにΦ（ｘ）−Ｓ（ｘ）を計算結果とするステップ、および
（５）前記Ｓ（ｘ）とΦ（ｘ）−Ｓ（ｘ）を、暗号処理の剰余乗算Ａ（ｘ）＊Ｂ（ｘ） ｍｏｄ Φ（ｘ）の計算結果として用いるステップを有することを特徴とする請求項９記載の耐タンパーモジュラ演算処理方法。
【請求項１２】
前記（ｓ, ｔ, ｆ, ｇ）は、(０, １, ０, １)であることを特徴とする請求項１１記載の耐タンパーモジュラ演算処理方法。
【請求項１３】
前記Ａ（ｘ）＊Ｂ（ｘ）の係数の演算は素数２を法として行うものであり、前記（３）の（ｆ，ｇ）は（０，０）であることを特徴とする請求項９記載の耐タンパーモジュラ演算処理方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、高いセキュリティを持つＩＣカードなどの耐タンパー暗号処理方法に関するものである。
【０００２】
【従来の技術】
ＩＣカードは、勝手に書き換えることが許されないような個人情報の保持や、秘密情報である暗号鍵を用いたデータの暗号化や暗号文の復号化を行う装置である。ＩＣカード自体は電源を持っておらず、ＩＣカード用のリーダライタに差し込まれると、電源の供給を受け、動作可能となる。動作可能になると、リーダライタから送信されるコマンドを受信し、そのコマンドに従ってデータの転送等の処理を行う。ＩＣカードの一般的な解説は、オーム社出版電子情報通信学会編水沢順一著「ＩＣカード」などにある。
【０００３】
ＩＣカードの構成は、図１に示すように、カード101の上にＩＣカード用チップ102を搭載したものである。図に示すように、一般にＩＣカードは、ＩＳＯ７８１６の規格に定められた位置に供給電圧端子Vcc、 グランド端子GND、リセット端子RST、 入出力端子I/Oおよびクロック端子CLKを持ち、これらの端子を通して、リーダーライタから電源の供給やリーダライタとのデータの通信を行う(W.Rankl and Effing : SMARTCARD HANDBOOK、 John Wiley & Sons、 1997、 pp.41参照)。
【０００４】
ＩＣカード用チップの構成は、基本的には通常のマイクロコンピュータと同じ構成である。その構成は、図２に示すように、中央処理装置(ＣＰＵ)201、記憶装置204、入出力（Ｉ／Ｏ）ポート207、コ・プロセッサ202からなる（コ・プロセッサはない場合もある）。ＣＰＵ201は、論理演算や算術演算などを行う装置であり、記憶装置204は、プログラムやデータを格納する装置である。入出力ポートは、リーダライタと通信を行う装置である。コ・プロセッサは、暗号処理そのもの、または暗号処理に必要な演算を高速に行う装置であり、例えばＲＳＡ暗号の剰余演算を行うための特別な演算装置や、ＤＥＳ暗号のラウンド処理を行う暗号装置などがある。ＩＣカード用プロセッサの中には、コ・プロセッサを持たないものも多くある。データバス203は、各装置を接続するバスである。
【０００５】
記憶装置204は、ＲＯＭ(Read Only Memory)やＲＡＭ(Random Access Memory)、ＥＥＰＲＯＭ(Electrical Erasable Programmable Read Only Memory)などからなる。ＲＯＭは、変更できないメモリであり、主にプログラムを格納するメモリである。ＲＡＭは自由に書き換えができるメモリであるが、電源の供給が中断されると、記憶している内容は消滅する。ＩＣカードがリーダライタから抜かれると電源の供給が中断されるため、ＲＡＭの内容は、保持されなくなる。ＥＥＰＲＯＭは、電源の供給が中断されてもその内容を保持することができるメモリである。書き換える必要があり、ＩＣカードがリーダライタから抜かれても、保持するデータを格納するために使われる。例えば、プリペイドカードでのプリペイドの度数などは、使用するたびに書き換えられ、かつリーダライタか抜かれてもデータを保持する必要があるため、ＥＥＰＲＯＭで保持される。
【０００６】
ＩＣカードは、プログラムや重要な情報がＩＣカード用チップの中に密閉されているため、重要な情報を格納したり、カードの中で暗号処理を行うために用いられる。従来、ＩＣカードでの暗号を解読する難しさは、暗号アルゴリズムの解読の困難さと同じと考えられていた。しかし、ＩＣカードが暗号処理を行っている時の消費電流を観測し、解析することにより、暗号アルゴリズムの解読より容易に暗号処理の内容や暗号鍵が推定される可能性が示唆されている。消費電流は、リーダライタから供給されている電流を測定することにより観測することができ、この攻撃法の詳細は、John Wiley & sons社 W.Rankl & W.Effing著 「Smart Card Handbook」の8.5.1.1 Passive protective mechanisms(263ページ)にこのような危険性が記載されている。
【０００７】
ＩＣカード用チップを構成しているＣＭＯＳは、出力状態が１から０あるいは０から１に変わった時に電流を消費する。特に、データバス203においては、バスドライバーの電流や、配線および配線に接続されているトランジスタの静電容量のため、バスの値が１から０あるいは０から１に変わると、大きな電流が流れる。そのため、消費電流を観測すれば、ＩＣカード用チップの中で、何が動作しているか分かる可能性がある。
【０００８】
図3は、ＩＣカード用チップの１サイクルでの消費電流の波形を示したものである。処理しているデータに依存して、電流波形が301や302のように異なる。このような差は、バス203を流れるデータや中央演算装置201で処理しているデータに依存して生じる。
【０００９】
コ・プロセッサ202は、ＣＰＵと並列に、例えば、512ビットの剰余演算を行うことができる。そのため、ＣＰＵの消費電流とは異なった消費電流波形の長時間の観測が可能である。その特徴的な波形を観測することにより、コ・プロセッサの動作回数を容易に測定することができる。コ・プロセッサの動作回数が暗号鍵と何らかの関係があるならば、コ・プロセッサの動作回数から暗号鍵を推定できる可能性がある。
【００１０】
また、コ・プロセッサでの演算内容が、暗号鍵に依存した偏りがあると、その偏りが消費電流から求められ、暗号鍵が推定される可能性がある。例えば、乗算剰余演算の際に発生するオーバーフロー処理は、多くの場合、オーバーフロー処理特有の電流が発生する。オーバーフロー処理をするかしないかで、処理時間が異なる場合もある。
【００１１】
ＣＰＵでも同様の事情が存在する。暗号鍵のビット値は決まっているため、処理するデータを変更して、消費電流を観測することにより、暗号鍵のビット値の影響が観測できる可能性がある。これらの消費電流の波形を統計的に処理することにより、暗号鍵を推定できる可能性がある。
【００１２】
【発明が解決しようとしている課題】
本発明の課題は、ＩＣカード用チップでのデータ処理と消費電流との関連性を減らすことである。消費電流とチップの処理との関連性が減れば、観測した消費電流の波形からＩＣカードチップ内での処理や暗号鍵の推測が困難になる。本発明の着眼点は、ＩＣカードチップでの乗算剰余処理AB mod Nまたはモンゴメリ法による乗算剰余処理ABR^(-1) mod Nにおいて、乗数Bまたは被乗数Aを、そのモジュラスＮを用いて、tN + B*(-1)^g、sN + A*(-1)^f （s， t， f， gは整数。但し、f， gは0又は1）に置き換えて処理することにより、消費電流の波形や処理時間の偏りから、処理内容や暗号鍵の推測を困難にするものである。
【００１３】
【課題を解決するための手段】
ＩＣカードチップに代表される耐タンパー装置は、プログラムを格納するプログラム格納部、データを保存するデータ格納部を持つ記憶装置と、プログラムに従って所定の処理を実行しデータ処理を行う中央演算装置(ＣＰＵ)を持ち、プログラムは、ＣＰＵに実行の指示を与える処理命令から構成される一つ以上のデータ処理手段からなる情報処理装置として捉えることができる。
【００１４】
電子マネーに代表される高セキュリティのＩＣカードでは、ＲＳＡ暗号や、ガロア体GF(p^n):pは素数、nは正の整数）上の楕円曲線暗号が用いられる。その際、乗算剰余演算A*B mod Nや、多項式の乗算剰余演算A(X)*B(X) mod Φ(X)の処理が必要となる（A=Bの場合もある）。以下、多項式の場合も考え方は同じなので、通常の乗算剰余処理の場合について説明する。多項式の場合の乗算剰余処理ついては、計算機上の実装が通常の乗算剰余処理の場合と若干異なるが、それは「発明の実施形態」にて詳細に説明する。
【００１５】
本発明において、乗算剰余演算で処理しているデータとＩＣカード用チップの消費電流の関連性を撹乱する一つの方法は、本来の演算処理に用いられるデータを直接用いずに、演算結果が大きく変わらないようなデータを用いて計算を行い、計算後に結果を修正することである。
【００１６】
具体的には、乗算剰余処理A*B mod Nの計算を行う際、乗数B及び被乗数Aの両者を、それぞれtN + B*(-1)^g、sN + A*(-1)^f （s， t， f， gは少なくとも１つは０でない整数。但し、f， gは0又は1）に置き換えて、
S = (sN + A*(-1)^f)*(tN + B*(-1)^g) mod N
を計算し、その後、f+gが奇数になる場合は、N-Sを該乗算剰余演算結果とし、f+gが偶数となる場合は、Sを演算結果とすることである。
【００１７】
上記の処理では、乗算剰余演算を行う度に本来の答になるように修正している。しかし、ＲＳＡ暗号に代表されるべき乗剰余計算の場合は、毎回修正を施す必要はなく、最終的に修正を施せばよい。
【００１８】
ＲＳＡ暗号で用いられるべき乗剰余計算y^x mod Nに対して用いられる乗算剰余処理を上記の置き換え、すなわち、乗算剰余処理A*B mod Nの計算を行う際、乗数B及び被乗数Aの両者を、それぞれtN + B*(-1)^g、sN + A*(-1)^f （s， t， f， gは整数。但し、f， gは0又は1）に置き換えて、
S = (sN + A*(-1)^f)*(tN + B*(-1)^g) mod N
を計算し、最後に、必要ならNからべき乗剰余計算の値を引く修正を行えばよい。なぜこのようなことができるかは、「発明の実施形態」の中で述べる。
【００１９】
上記のように処理することで、本来の乗算剰余演算処理で発生する電流とは異なるパターンの電流が観測されることになるため、本来のデータの場合に期待される波形を基に内部処理を推定することが困難になる。s， t， f， gを外部から推定できない情報源を用いて変更すれば、さらに効果が高まり、特に、複数の波形を収集して平均をとるなどの統計処理を行う場合は、ランダムな波形を平均化するのと同じことになり、波形の特徴は消滅するため、さらに効果は顕著である。
【００２０】
本発明は、特にＲＳＡ暗号での、乗算剰余演算や、べき乗剰余計算、および楕円曲線暗号での定義体上での乗算や除算、ベースポイントのスカラー倍などの情報隠蔽に利用することができる。
【００２１】
【発明の実施形態】
以下に示す実施例では、公開鍵暗号（非対称鍵暗号）の代表例であるＲＳＡ暗号、楕円曲線暗号を例にとる。ＲＳＡ暗号については、岡本栄司著「暗号理論入門」（共立出版）や、A.J.Menezes、 P.C. van Oorschot、 S. A.Vanstone著 Handbook of Applied Cryptography、（CRC-Press）などに詳しく記載されている。楕円曲線暗号については、考案者の一人が書いたN．コブリツ著（櫻井幸一訳）「数論アルゴリズムと楕円暗号理論入門」(シュプリンガーフェアラ−ク東京)、楕円曲線上の演算については、I.H.シルバーマン・J.テイト著「楕円曲線論入門」（シュプリンガーフェアラ−ク東京）、又、群、環、体等の代数系については、松坂和夫著「代数系入門」（岩波書店）に詳しい説明がある。
【００２２】
実施例を説明するに先立ち、背景となる数学的知識を整理しておく。一般に公開鍵暗号（非対称鍵暗号）においては、秘密鍵情報が公開鍵の中に含まれているが、公開鍵から秘密鍵情報を取り出すことが、計算時間の点で著しく現実性を欠くということ（計算量的安全性）を根拠にして暗号が構成されている。計算量的安全性を持つ問題の代表的なものとして、素因数分解と、群上の離散対数問題が挙げられる。前者を利用したものがRSA暗号であり、後者を楕円曲線上のモーデル・ヴェイユ群に適用して利用しているものが楕円曲線暗号である。
【００２３】
簡単にＲＳＡ暗号を説明する。ＲＳＡ暗号では、大きな素数、例えば512ビットの２つの素数p，qの積 N = pq と Nと互いに素な数 e（ＩＣカードでは、3や、65537が用いられることが多い）をとり、これを公開鍵として公開鍵簿に登録する。このとき、この公開鍵の持ち主Ａに送信者Ｂは、1以上N-1以下の数で表現されたデータ（平文） L を、
y = L^e mod N
として暗号化して送信する。ここで、L^eはLのe乗を表す記号とする。
この暗号文 R を受け取った持ち主Ａは、xe mod (p-1)(q-1) = 1となる秘密鍵 xを用いて
y^x mod N
を計算する。ここで、(p-1)(q-1)は、Nのオイラー関数の値φ(N)である。これは、Nと互いに素な自然数の個数に等しい。オイラーの定理によれば、
y^((p-1)(q-1)) mod N = 1
が成り立ち、一方で、xe = 1 + k(p-1)(q-1)（kは整数）と書くことができるので、
0003950638.tif 000002
が成り立つ。従って、y^x mod Nを計算することで、持ち主Ａは、送信者Ｂの平文 L を復号することができる。この際、秘密鍵 x を計算するのに、Nの素因数 p、 q が用いられており、現在のところ、素因数分解を介さないで、xを計算する方法は知られておらず、大きな素数の積を因数分解することは、現実的でない時間が必要であるので、Nを公開しても、Ａの秘密鍵は安全である。
【００２４】
ＲＳＡ暗号の暗号化/復号化操作で用いられるべき乗剰余計算の実装方法の代表的なものは、アディション・チェイン方式とスライディング・ウインドウ方式である。
まず、アディション・チェイン方式による計算アルゴリズムについて図４を用いて説明する。この方式は、最も多く利用されているものである。ここでは、y^x mod Nの計算を、秘密鍵 x のビットを２ビット毎に区切り、上位から読んでいき、それが、00，01，10，11のいずれであるかに応じて、y[0] = 1， y[1] = y， y[2] = y^2 mod N， y[3] = y^3 mod N を対応させ、剰余乗算計算を行うことによって実現したものである。 勿論、２ビット毎に区切ることは説明の便宜のためであり、実際には１ビット、３ビット、４ビットをまとめて計算することもある。その際も考え方は全く同じである。
【００２５】
まず、ビットテーブルy[0] = 1， y[1] = y， y[2] = y^2 mod N， y[3] = y^3 mod Nを用意する（ステップ401）。続いて初期化（ステップ402）を行い、条件分岐（ステップ403）にて、指数ｘの最後まで処理し終えたかを判定し、終了していれば、処理終了し、終了していなければ、４乗の計算（ステップ404）を行う。この4乗計算（ステップ404）は、ｘのビットと無関係に行われるが、その次に行われる剰余乗算計算においては、条件分岐処理（ステップ405，406，407，408）が行われ、それぞれの条件に対応して、ステップ409，410，411，412の剰余乗算演算が行われる。
【００２６】
この方式で正しい計算が行なえることを簡単に数値例で確認する。この計算方式の本質的部分は指数部分であるので、例として、指数部分のみ数値である例として
S = y^219 mod N
を取り上げる。ここで、219は二進数表示で11011011である。これをもとに、2ビット幅のアディション・チェイン方式で計算する。11011011を2ビットブロックに分割すると、11 01 10 11である。S = 1（初期化）を行ない、これをＮを法として4乗する。勿論、1を4乗しても1である。次に指数部の先頭のビットブロックを読む。これは、11であるから、y[3] = y^3 mod Nを乗じて、S = y^3 mod Nとなる。次に、再びループし、これをＮを法として4乗すると、y^12 mod Nとなる。
指数部のビットブロックの先頭から2番目のビットブロックを読むと、これは、01であるから、y[1] = y を乗じて、S = y^13 mod Nとなる。再びループし、これをＮを法として4乗すると、S = y^52 mod Nとなる。指数部のビットブロックの先頭から3番目のビットブロックを読むと、これは、10であるから、y[2] = y^2 mod N を乗じて、S = y^54 mod Nとなる。再びループし、これをＮを法として4乗すると、S = y^216 mod Nとなる。指数部のビットブロックの先頭から4番目のビットブロックを読むと、これは、11であるから、y[1] = y^3 mod N を乗じて、S = y^219 mod Nとなる。これが求める答である。
【００２７】
次に、もう一つの代表的なべき乗剰余計算アルゴリズムであるスライディング・ウインドウ方式について図５を用いて説明する。ここでは、y^x mod Nを計算する際のxの最大の処理単位を2ビットとする。まず、テーブルy[2] = y^2 mod N、 y[3] = y^3 mod Nを用意する（ステップ501）。次にSを１に初期化し（ステップ502）、指数xの最後のビットであるかどうかを判定し（ステップ503）、終了していれば、処理を終了し、xの最後のビットでなければ、二乗剰余演算を行う（ステップ504）。指数ｘの１ビットを読み（ステップ505）、これが1でなければ、再び条件分岐処理（ステップ503）に戻り、この１ビットが1であれば、二乗剰余処理（ステップ507）を行う。次にxの次のビットが受け取れたかどうかを判定し（ステップ508）、受け取れなければ、条件分岐処理（ステップ503）に戻るが、このときはxの最後まで処理が終了しているので、ステップ503の条件はYesとなり、処理を終了する。xの次の処理ビットが受け取れた場合は、条件分岐処理（ステップ509）にて、そのビットが0であるか1であるかに応じ、それぞれ、乗算剰余計算（ステップ510，511）を実行し、再び条件分岐処理（ステップ503）に戻る。
【００２８】
これも、数値例で簡単に確認しておく。例として
S = y^2226 mod N
を計算するにあたり、テーブルy[2] = y^2 mod N， y[3] = y^3 mod Nを用意する。この際、y[0]， y[1]は不要である。2226は、２進法で、100010110010と書くことができる。これを上位より読んで、2ビットが1を上位に持っているときは、それを一塊とみなし、0が続いているときは、2乗剰余演算を行なうとみなす。つまり、100010110010 = 10 0 0 10 11 0 0 10 という分解に対応するように処理する。従って、S=1と初期化した後、まず、10に対応する処理、すなわち、Sの2乗剰余演算を行なって、Sにy[2]を掛ける。このとき、S = y[2] = y^2 mod Nとする。次に、0に対応した処理、すなわち2乗剰余演算を行なって、S = y^4 mod Nを得る。続く0に対応する処理、S = y^8 mod Nを行ない、次に、10に対応する処理を行なえば、S = ((y^8 mod N)^4 mod N * y^2 mod N) mod N = y^34 mod Nとなる。続く処理は、11に対応した、S = ((y^34 mod N)^4 * y^3 mod N) mod N = y^139 mod Nを実行する。さらに続く２つの0に対応して4乗剰余演算を行ない、S = (y^139 mod N)^4 mod N = y^556 mod Nとし、最後の10に対応する処理S = ((y^556 mod N )^4 mod N * y^2 mod N) mod N = y^2226 mod Nによって、求める答を得る。この方式は、テーブルとして、指数ビットの先頭が1であるものだけを利用するので、ＲＡＭの容量が半分で済むという利点がある。
【００２９】
上記のアディション・チェイン方式、スライディング・ウインドウ方式は、モンゴメリ法と呼ばれる方式を用いて実行されることがあることに注意しておく。モンゴメリ法とは、剰余乗算演算 AB mod Nを高速に実行する方式であり、特にハードウエア化に向いた方法である。簡単にそのしくみを説明する。詳細は、モンゴメリの原著論文“Modular Multiplication Without Trial Division”、 Mathematics of Computation 44、 170、 pp.519-521(1985))に記載されている。
【００３０】
モンゴメリ法の本質は、殆ど全てのコンピュータにおいて、mod 2^nの演算は、上位ビットを無視することにより実現できるということを利用することにある。すなわち、AB mod Nの計算を2のべきを法とする演算に置き換えることに、その本質がある。ＲＳＡ暗号では、Nは、大きな素数の積であるから奇数であり、従って任意の２のべきと互いに素である。そこで、M， Wを未知数とした不定方程式：
AB + MN = WR
を考える。ここで、A， Bのビット長はnであるものとし、R = 2^nとする。このとき、この不定方程式は無限個の解を有する。このようなMを見つければ、WはABR^(-1) mod Nと合同である。Mは、Rおきに並んでいるので、Rより小さい非負の値がとれる。このとき、Wは、ABR^(-1) mod Nであるかまたは、ABR^(-1) mod N+Nである。後者の場合は、Nを引き算して求める答を得る。
【００３１】
このように、モンゴメリ法においては、ABR^(-1) mod Nの形で演算が行なわれるので、上記のアルゴリズム、例えば、アディション・チェイン方式では図４の401、スライディング・ウィンドウ方式では図５の501で実行されるテーブル作成処理において、それぞれのテーブルの値を、y[0] = R mod N， y[1] = y*R mod N， y[2] = y^2*R mod N， y[3] = y^3*R mod Nに置き換えて処理する。Sの初期値もR mod Nとする。すると、被乗数Aと乗数Bの値は、もとの値のR倍になっているため、ABR^(-1) mod Nの処理では、必ずR倍の項が残ることになる。このデータ形式をモンゴメリフォーマットと呼ぶことにすれば、アディション・チェイン、スライディング・ウインドウ両方式を、モンゴメリフォーマットで実行し、最後に、R^(-1) mod N倍することにより、求める答を得ることができる。
【００３２】
次に、後の説明の便宜のため、乗算剰余処理におけるオーバーフロー処理について簡単に説明しておく。オーバーフロー処理は、演算装置の実装方法によって若干の違いがあるが、ここでは代表的なものを説明する。最も単純な方式は、A*Bをはじめに求め、これがN未満であれば、このA*Bを答えとし、Nより大きい場合は、N未満の値になるまでNを引き算することによってA*B mod Nを求めるというものである。つまり、この場合、「オーバーフロー」とは、A*BがN以上になることであり、「オーバーフロー処理」とは、N未満の値になるまでNを引き算するという操作に他ならない。この方式は、A*Bのビット長が小さいときはコード量も少なく、処理時間も無視できるが、ビット長が大きくなると、ＩＣカードのような非力なデバイスでは処理時間が極めて大きくなるため、あまり用いられない。
【００３３】
もう一つは、モンゴメリ法で生ずるオーバーフローである。先に簡単に説明したように、モンゴメリ法では、法N（奇数）における剰余を計算するよりも、法R = 2^n（nはA，Bのビット数）における剰余を求める方が計算が速いことに着目し、不定方程式：
AB + MN = WR
によって、A*B*R^(-1) mod Nの計算を上記不定方程式のM = -A*B*N^(-1) mod Rを求める操作に変換する。Mは、0以上R未満の範囲に一つ存在する。これを求めた場合、A*B*R^(-1) mod Nが確定するかというと、そうではない。（以下、この不定方程式をモンゴメリ方程式と呼ぶことにする。）
A、 Bが既に法Nでの剰余であれば、A < N < RかつB < N < Rである。また、M < Rであるので、
W = (AB + MN)/R < (NR + RN)/R = 2N
となる。つまり、Wは2Nよりも小さいが、Nより大きい可能性がある。実際、そのような場合があり、その際には、Nを一回引き算する必要がある。つまり、この場合、「オーバーフロー」とは、WがN以上になることであり、「オーバーフロー処理」とは、Nを一回引く操作に対応する。
【００３４】
ＲＳＡ暗号の場合、乗算剰余処理が出現することは明らかであるが、楕円曲線暗号に対しては、自明な事柄ではないので、以下、楕円曲線暗号について簡単に説明しておく。楕円曲線とは、体Kの上で定義された３次多項式の零点集合であり、Kの標数が２でない場合は、
y^2 = x^3 + ax + b
という標準形を持つ。標数が２の体の上では、
y^2 + cy = x^3 + ax + b 又は、
y^2 + xy = x^3 + ax + b
という標準形を持つ曲線である。（いずれの場合も、後に説明する無限遠点Oを含めて考える）。楕円曲線の形状は、図6のようなものになる。
【００３５】
暗号で必要なのは、定義体が有限体（ガロア体）の場合のみであるので、その場合に限って説明する。有限個の元からなる体を有限体又はガロア体といい、その構造はよく知られている。その最も単純な構成法は以下の通りである。まず、素数 p を法とする整数環の剰余環 Zp を考える。Zpは集合としては、{0， 1， 2，…， p-1}に一致する。Zpにおける和(＋)、積（＊）は、
A (+) B = (A+B) mod p
A (*) B = (A*B) mod p
で定義されている。0以外の元は、（＊）に関して逆元を持つので、体の構造を持っている。これを素体といい、GF(p)と書く。これが最も原始的な有限体の例である。以下、混乱がない限り、(+)は通常の＋と書き、（＊）も、通常の積＊で表す。積については、A*Bを、ABのように書くこともある。
【００３６】
次に、GF(p)の元を係数に持つ多項式 f(X) を考え、その零点のうち、GF(p)に含まれないものをGF(p)に添加することによって、新しい体を構成することができる。これを、GF(p)の有限次代数拡大体という。GF(p)の有限次代数拡大体の元の個数は、pのべきになっていることが知られている。その元の個数をp^nと書くとき、有限次代数拡大体をGF(p^n)などと表示することがある。
【００３７】
準同型定理（松坂和夫「代数系入門」岩波書店、 p.125 定理4）によれば、GF(p^n)は、GF(p)係数の多項式全体がつくる環GF(p)[X]をGF(p)[X]のn次既約多項式f(X)の倍元全体の作るイデアルに関する剰余環GF(p)[X]/(f(X))と同型である。この際、f(X)は既約でさえあれば、環としては同じものである。従って、適当にn次の既約多項式を決めて、和と積を、Zpと同じように、法f(X)における和、積とすることでGF(p^n)の演算をマイクロコンピュータ上に実現することができる。
【００３８】
ＩＣカードの上で実装する場合は、特に素体GF(p)(pは素数)の場合とバイナリ体GF(2^n)の場合が重要である。GF(p^n)を、pの大きさをマイクロコンピュータのレジスタの大きさ程度にすることによって、実現する方法もあり、研究が進められている。
【００３９】
楕円曲線上の点の間には、演算を定めることができる。図７に示すように、楕円曲線上の二つの点、P，Qがあるとき、この二点を通る直線を引き（P=Qのときは接線を引く）、この直線が再び楕円曲線と交わる点Rをｘ軸に関して対称に折り返した点は、曲線の対称性から、再び楕円曲線上の点となる。この点をP+Qと書き、PとQの「和」と定義する。交わる点がない場合は、架空の点として無限遠点というものを考え、この架空の点で交わっているものとみなす。無限遠点をOと書く。また、楕円曲線上の点Pとｘ軸に関して対称な位置にある点をPの逆元といい、-Pで表す。楕円曲線上の一点Pをk個加えたものを、kP、-Pをk個加えたものを-kPと書いて、Pのスカラー倍という。これらの座標は、P，Qの座標の有理式で表すことができ、従って一般の体の上でこの演算を考えることができる。この「加法」は、通常の加法と同様に、結合法則、交換法則が成立し、この加法に関して、無限遠点Oは、通常の数での演算と同様にゼロの役割を果たし、-Pは、Pと加えると、Oになる。これは楕円曲線上の加法演算が、可換群（アーベル群）の構造を持つことを示している。これをモーデル・ヴェイユ群ということがある。楕円曲線E、定義体GF(q)(q=p^n)を固定したときのモーデル・ヴェイユ群を、G(E/GF(q))と書くことがある。G(E/GF(q))の構造は非常に単純で、巡回群か、または二つの巡回群の直積と同型になることが知られている。暗号学上は、巡回群になっているか、または２つの巡回群の直積になっている場合は、いずれかの位数（元の数）が、大きな素数で割れることが望ましい。
【００４０】
楕円曲線上の点P=(x1， y1)、 Q=(x2， y2)の和P+Qの座標を(x3， y3)とする。P+Q=Oでないとき、以下の関係式が成立する。ＩＣカードでは、標数3を用いる積極的理由は何もないので、以下標数３の場合は省略する。以下、考える楕円曲線は、非特異(non-singular)であるものとする。
【００４１】
標数が2，3でない場合：
y^2 = x^3 + ax + b
に対しては、
x3 = h^2 - x1 - x2
y3 = h(x1 - x3) - y1
ここで、hは、
h = (y2 - y1)/(x2 - x1) if P≠Q， (3x1^2 + a)/(2y1) if P = Q
である。
【００４２】
標数が2の場合：
y^2 + xy = x^3 + ax + b
に対しては、
x3 = h^2 + h + x1 + x2 + a
y3 = h(x1 + x3) + x3 + y1
ここで、hは、
h = (y1 + y2)/(x1 + x2) if P≠Q， x1 + (y1/x1) if P = Q
である。
【００４３】
上記の和の公式では、演算をガロア体GF(p^n)の上で行う必要がある。従って、例えば、GF(p)(pは大きな素数)の上では、
x3 = (h^2 - x1 - x2) mod p
y3 = (h(x1 - x3) - y1) mod p
を行うことになる。
【００４４】
またhの計算もmod pで実行しなければならない。つまり、例えば、h = (y2 - y1)/(x2 - x1)は、h = (y2 - y1)*{(x2 - x1)^(-1) mod p} mod pと解釈される。
【００４５】
GF(p^n)の場合も、先に述べたように、結局は、多項式の乗算剰余演算を行うことになるので、同様に理解することができる。
【００４６】
一般に、kP=Qの値がわかっても、逆にｋの値を知るのは計算量が膨大になるため、容易でない。これを楕円曲線上の離散対数問題という。楕円曲線暗号では、楕円曲線上の離散対数問題が困難であることを利用している。楕円曲線を利用した暗号方式には種々のものがあるが、ここでは、特に、楕円ElGamal方式を説明する。楕円曲線Eとその上の一点（一般に大きな位数を持つ点。ベースポイントと呼ぶ）Pが公開されているものとする。
【００４７】
Ａ氏が、Ｂ氏に秘密情報Ｍ（楕円曲線上の点で表現する。平文（暗号文）の楕円曲線上の埋め込みについては、N.コブリッツ、櫻井幸一訳「数論アルゴリズムと楕円暗号入門」シュプリンガーフェアラ−ク p.253に説明されている）を送信することを考える。
ステップ 1. 受信者Ｂ氏は、正整数 x[B] を選び、これを秘密鍵として保持し、
Y[B] = x[B]P
を公開鍵簿に登録する。
ステップ 2. 送信者Ａ氏は、乱数 r を用いて、
C1 = rP
C2 = M + rY[B]
をＢ氏に送信する。
ステップ 3. 受信者Ｂ氏は、C1、C2を受け取り、自分の秘密鍵x[B]を用いて、
C2 - x[B]C1 = M
としてＭを復元する。
【００４８】
楕円ElGamal暗号に限らず、楕円曲線暗号においては、楕円曲線上の点のスカラー倍を計算する必要がある。楕円曲線上の点のスカラー倍を求めるアルゴリズムは、べき乗剰余計算のアルゴリズムに類似している。kP(kは正整数)を計算する標準的なアルゴリズムをべき乗剰余計算と同様に２ビットづつまとめて処理する場合について示したものを、図8に示す。まず、２ビットの処理を一度に行うために、ベースポイントPのテーブルを作る。べき乗剰余演算においては、mod nでの0乗，１乗，２乗，３乗に対応して、O（無限遠点），P，２P，３Pを用意する(ステップ801)。べき乗剰余演算とは異なり、このテーブルは毎回書き換える必要はなく、あらかじめ用意しておくことができる。次に、計算用の点の値を初期化する（ステップ802）。次に点Sの２倍を計算し（ステップ803）た後、kの最後のビットまで実行したかどうか判定し（ステップ804）、実行済でなければ、kのビットの値（２ビットごと）によって条件分岐して（ステップ804， 805， 806， 807）、これらに対応する点P[0]， P[1]， P[2]， P[3]を加える（ステップ808， 809， 810， 811）。この処理をkのビットが尽きるまで続けることにより、kPを計算することができる。この計算はkの上位から２ビットづつ区切って見て計算する方式である。べき乗剰余計算と、数学的には同一の構造をしていることがわかる。スライディング・ウインドウ方式にすることも容易である。後に再び説明するが、ＲＳＡにおけるべき乗剰余演算、楕円曲線上の加法演算は、それぞれ、Zn、G(E/GF(q))という代数系の上で行われる演算と考えることができる。
【００４９】
一方で、マイクロコンピュータが内部のプログラムを実行する際、動作時の内部消費電力が漏洩する可能性があるため、このプロセスをマイクロコンピュータで実現する場合、秘密鍵の処理が漏洩し、危険に曝されることになる。例えば、kのビット（この例では２ビット毎）の違いにより、分岐が行われるので、もしも、その処理が消費電流の差として現れれば、電流波形からkのビットを特定することができる可能性がある。
【００５０】
上記の背景を踏まえて、本発明の実施例を説明する。図9に示した処理は、本発明の典型的応用例である。本実施例は、べき乗剰余計算y^x mod Nをアディション・チェイン方式によって実行するものである。但し、本実施例では、モンゴメリ法による乗算剰余処理を用いて、ＲＳＡ暗号のべき乗剰余計算を行う。この処理において、A*B*R^(-1) mod Nという乗算剰余演算が用いられる。先に述べたのと同じく、Nは奇数（一般にRSA暗号では、Nは、大きな素数p，qの積であり、奇数である）であり、R = 2^n(nはデータのビット長)とする。
【００５１】
まず、ステップ901にて、S = R mod Nとし、さらに、xのビットブロックの番号を数えるためのカウンタjを0に初期化し、条件分岐判定用の変数v[0] = 0とする。次に２ビットアディション・チェイン方式処理用のテーブル作成を行う（ステップ902）が、この際、通常のアディション・チェイン処理に必要なオリジナルテーブル(903)y[0][0] = R mod N， y[1][0] = yR mod N， y[2][0] = y^2R mod N， y[3][0] = y^3R mod Nの他に、モジュラスNにおける反転テーブル(904) y[0][1] = N - (R mod N)， y[1][1] = N - (yR mod N)， y[2][1] = N - (y^2R mod N)， y[3][1] = N - (y^3R mod N)をも用意する。テーブルは通常、ＲＡＭ上に存在する。このテーブル作成の後、条件分岐処理（ステップ905）にて、指数ｘが最後まで読まれたか（全てのビットブロックを読んだか）を調べる。指数ｘの全てのビットブロックの処理が終了していなければ、ステップ906に進み乱数v[j]を発生する（ステップ906）。この乱数は、0または1である。次に、S = S^2*R^(-1) mod Nを2回実行する（ステップ907）。最初の処理では、S = R mod Nに初期化されているので、この二乗剰余演算の結果は、S = (R mod N)^2*R^(-1) mod N = R mod Nとなり、ステップ907の処理結果は、R mod Nとなることに注意する。次に、条件分岐処理（ステップ908， 909， 910， 911）において、指数ｘの２ビットブロックを読み、このビットブロック（図中では「ｘのビットブロック」と表現されている）が、２進数で、00であるか01であるか、10であるか、11であるかに応じて、それぞれ、ステップ912， 913， 914， 915に進み、乗算剰余演算を行う。この乗算剰余演算では、v[j] が、0であるか、1であるかに応じて、用いるテーブル値が異なる。例えば、xのビットブロックが10であれば、通常は、S = S*y[2][0]*R^(-1) mod N = S*(y^2R mod N) mod Nを計算するが、v[j] = 1のときは、反転テーブルから、y[2][1]を取り出して、S = S*y[2][1]*R^(-1) mod N = S*(N - (y^2R mod N))*R^(-1) mod Nを計算する（ステップ914）。
ステップ912， 913， 915の処理においても、同様にv[j]の値に応じて乗ずる値を変える。乗算剰余処理を終えた後、ステップ921にて、カウンタをインクリメントし、ステップ905の処理に戻る。条件分岐処理（ステップ905）にて、指数ｘのビットブロックを全て読み終わっている場合には、ステップ916の処理に進む。ステップ916では、モンゴメリ形式（R mod Nが掛かっている）のデータを通常の値に戻すために、R^(-1) mod Nを乗ずる処理を行う。次に、T = N - Sを計算し、これをＲＡＭに置く（ステップ917）。ここで、SとTはＲＡＭ上で異なる位置に配置され、ＲＡＭ上で重複することはないものとする。条件分岐処理（ステップ918）にて、最後のvの値が1であれば、Tを出力し（ステップ919）、v = 0であれば、Sを出力する（ステップ920）。この処理によって正しい値が出力されることは、( ｔN - B )^2 mod N = B^2 mod N（ｔは整数）であることから明らかである。このように処理することによって、オーバーフローの処理が本来のものとは異なるものになるため、ＩＣチップの消費電力や、処理時間等を観測して内部処理を行うことが困難になる。これは、乗算剰余演算A*B mod NのAをsN+A*(-1)^f、BをtN+B*(-1)^g(ｓ,ｔ,ｆ,ｇは整数)に置き換えたときに、特に(s， t， f， g) = {(0， 0， 0， 0)，(0， 1， 0， 1)}としたものの一つである（｛｝内は集合の要素）。
【００５２】
上記実施例では、各jに関してv[j]を乱数として変化させているが、全てのj = 0， 1， ..., m-1(mはビットブロックの数)を0とするか、1とするかを、最初にランダムに決定するという方法もある。図１０に、これを示す。まずステップ1001にて、S = R mod Nとし、さらに、xのビットブロックの番号を数えるためのカウンタjを0に初期化する。次に２ビットアディション・チェイン方式処理用のテーブル作成を行う（ステップ1002）が、この際、通常のアディション・チェイン処理に必要なオリジナルテーブル(1003)y[0][0] = R mod N， y[1][0] = yR mod N， y[2][0] = y^2R mod N， y[3][0] = y^3R mod Nの他に、モジュラスNにおける反転テーブル(1004) y[0][1] = N - (R mod N)， y[1][1] = N - (yR mod N)， y[2][1] = N - (y^2R mod N)， y[3][1] = N - (y^3R mod N)をも用意する。テーブルは通常、ＲＡＭ上に存在する。このテーブル作成の後、ステップ1005に進み乱数vを発生する。この乱数は、0または1である。次に条件分岐処理（ステップ1006）にて、指数ｘが最後まで読まれたか（全てのビットブロックを読んだか）を調べる。次に、S = S^2*R^(-1) mod Nを2回実行する（ステップ1007）。
最初の処理では、S = R mod Nに初期化されているので、この二乗剰余演算では、S = (R mod N)^2*R^(-1) mod N = R mod Nとなり、ステップ1007の処理結果は、R mod Nとなることに注意する。次に、条件分岐処理（ステップ1008， 1009， 1010， 1011）において、指数ｘの２ビットブロックを読み、このビットブロックが、２進数で、00であるか01であるか、10であるか、11であるかに応じて、それぞれステップ1012， 1013， 1014， 1015に進み、乗算剰余演算を行う。乗算剰余演算では、vが、0であるか、1であるかに応じて、用いるテーブル値が異なる。例えば、xのビットブロックが10であれば、通常は、S = S*y[2][0]*R^(-1) mod N = S*(y^2R mod N) mod Nを計算するが、v = 1のときは、反転テーブルからy[2][1]を取り出して、S = S*y[2][1]*R^(-1) mod N = S*(N - (y^2R mod N))*R^(-1) mod Nを計算する（ステップ1014）。ステップ1012， 1013， 1015の処理においても、同様にvの値に応じて乗ずる値を変える。乗算剰余処理を終えた後、ステップ1021にて、カウンタをインクリメントし、ステップ1006の処理に戻る。
条件分岐処理（ステップ1006）にて、指数ｘのビットブロックを全て読み終わっている場合には、ステップ1016の処理に進む。ステップ1016では、モンゴメリ形式（R mod Nが掛かっている）のデータを通常の値に戻すために、R^(-1) mod Nを乗ずる処理を行う。次に、T = N - Sを計算し、これをＲＡＭに置く（ステップ1017）。ここで、SとTはＲＡＭ上で異なる位置に配置され、ＲＡＭ上で重複することはないものとする。条件分岐処理（ステップ1018）にて、最後のvの値が1であれば、Tを出力し（ステップ1019）、v = 0であれば、Sを出力する（ステップ1020）。この処理によって正しい値が出力されることは、( ｔN - B )^2 mod N = B^2 mod N（ｔは整数）であることから明らかである。このように処理することによって、オーバーフローの処理が本来のものとは異なるものになるため、ＩＣチップの消費電力や、処理時間等を観測して内部処理を行うことが困難になる。これは、乗算剰余演算A*B mod NのA，Bを上記のように置き換えたときに、特に(s， t， f， g) = {(0， 0， 0， 0)，(0， 1， 0， 1)}としたものの一つである。
【００５３】
上記の２つの実施例では、モンゴメリ法を用いたものを例として示したが、モンゴメリ法を用いない形式で本発明を適用することも容易である。この例を示そう。図９の実施例を非モンゴメリ形式に変更することは全く容易であって、モンゴメリ・フォーマットに変換している部分を除去すればよい。図１１は、モンゴメリ法を用いない通常の実装方法を示したものである。
【００５４】
まずステップ1101にて、S = 1とし、さらに、xのビットブロックの番号を数えるためのカウンタjを0に初期化し、条件分岐判定用の変数v[0] = 0とする。次に２ビットアディション・チェイン方式処理用のテーブル作成を行う（ステップ1102）が、この際、通常のアディション・チェイン処理に必要なオリジナルテーブル(1103)y[0][0] = 1， y[1][0] = y mod N， y[2][0] = y^2 mod N， y[3][0] = y^3 mod Nの他に、モジュラスNにおける反転テーブル(1104) y[0][1] = N - 1， y[1][1] = N - (y mod N)， y[2][1] = N - (y^2 mod N)， y[3][1] = N - (y^3 mod N)をも用意する。テーブルは通常、ＲＡＭ上に存在する。このテーブル作成の後、条件分岐処理（ステップ1105）にて、指数ｘが最後まで読まれたか（全てのビットブロックを読んだか）を調べる。指数ｘの全てのビットブロックの処理が終了していなければ、ステップ1106に進み乱数v[j]を発生する。この乱数は、0または1である。次に、S = S^2 mod Nを2回実行する（ステップ1107）。次に、条件分岐処理（ステップ1108， 1109， 1110， 1111）において、指数ｘの2ビットブロックを読み、このビットブロック（図中では「ｘのビットブロック」と表現されている）が、２進数で、00であるか01であるか、10であるか、11であるかに応じて、それぞれ、ステツプ1112， 1113， 1114， 1115に進み、乗算剰余演算を行う。乗算剰余演算では、v[j] が、0であるか、1であるかに応じて、用いるテーブル値が異なる。例えば、xのビットブロックが10であれば、通常は、S = S*y[2][0] mod N = S*(y^2 mod N) mod Nを計算するが、v[j] = 1のときは、反転テーブルから、y[2][1]を取り出して、S = S*y[2][1] mod N = S*(N - (y^2 mod N)) mod Nを計算する（ステップ1114）。ステップ1112， 1113， 1115の処理においても、同様にv[j]の値に応じて乗ずる値を変える。乗算剰余処理を終えた後、ステップ1120にて、カウンタをインクリメントし、ステップ1105の処理に戻る。条件分岐処理（ステップ1105）にて、指数ｘのビットブロックを全て読み終わっている場合には、ステツプ1116の処理に進む。ステップ1116では、T = N - Sを計算し、これをＲＡＭに置く。ここで、SとTはＲＡＭ上で異なる位置に配置され、ＲＡＭ上で重複することはないものとする。条件分岐処理（ステップ1117）にて、最後のvの値が1であれば、Tを出力し（ステップ1118）、v = 0であれば、Sを出力する（ステップ1119）。この処理によって正しい値が出力されることは、( ｔN - B )^2 mod N = B^2 mod N（ｔは整数）であることから明らかである。このように処理することによって、オーバーフローの処理が本来のものとは異なるものになるため、ＩＣチップの消費電力や、処理時間等を観測して内部処理を行うことが困難になる。これは、乗算剰余演算A*B mod NのA，Bを上記のように置き換えたときに、特に(s， t， f， g) = {(0， 0， 0， 0)，(0， 1， 0， 1)}としたものの一つである。
【００５５】
以下図１１の実施例に対応する発明を方法ステップの形で要約しておく。
【００５６】
情報処理装置を利用して、暗号処理中に出現する剰余乗算であるＡ＊Ｂ ｍｏｄ Ｎを計算する方法であって、その方法は、
（１）Ｓ1＝Ａ＊Ｂ ｍｏｄ Ｎを計算するステップ、
（２）（１）の代わりにＳ2＝｛ｓＮ + Ａ*(-1)^ｆ ｝＊｛ｔＮ + Ｂ*(-1)^ｇ｝ｍｏｄ Ｎ （ｓ, ｔ, ｆ, ｇは少なくとも１つは０でない整数であり、ｆ, ｇは０又は１）を計算するステップ、
（３）上記（１）と（２）のいずれかを適宜選択するステップ、
（４）上記（１）（２）（３）を適宜繰り返し、最後に上記（１）を選択したときはその計算結果Ｓ1を出力し、上記（２）を選択したときにはＳ2の代わりにＮ−Ｓ2を出力するステップ、および
（５）Ｓ1とＮ−Ｓ2を、暗号処理の剰余乗算Ａ＊Ｂ ｍｏｄ Ｎの計算結果として用いるステップを有することを特徴とする耐タンパーモジュラ演算処理方法。
【００５７】
上記の実施例（図９、図１０及び図１１の実施例）においては、vとして乱数を用いているが、これを0と1を交互に取るような仕方で変化させたり、疑似乱数や、カオス的数列といったものに変えることができることは言うまでもない。また、上記実施例では、s， t， f， gを二通りにしか変化させていないが、より多くの変数を変化させることにより、撹乱効果を上げることができる。この場合の実施例を図１２に示す。
【００５８】
まずステップ1201にて、S = 1とし、さらに、xのビットブロックの番号を数えるためのカウンタjを0に初期化し、条件分岐判定用の変数v[0] = 0とする。次に、４つの乱数w[k](k=0，1，2，3)を用意する（ステップ1202）。この乱数は、0 < w[k] < MAXを満たす整数で、MAXは、メモリやレジスタの大きさ等の制約によって決める。次に2ビットアディション・チェイン方式処理用のテーブル作成を行う（ステップ1203）が、この際、通常のアディション・チェイン処理に必要なオリジナルテーブル(1204)y[0][0] = 1， y[1][0] = y mod N， y[2][0] = y^2 mod N， y[3][0] = y^3 mod Nの他に、モジュラスNにおける反転テーブル(1205) y[0][1] = N - 1， y[1][1] = N - (y mod N)， y[2][1] = N - (y^2 mod N)， y[3][1] = N - (y^3 mod N)をも用意する。テーブルは通常、ＲＡＭ上に存在する。このテーブル作成の後、条件分岐処理（ステップ1206）にて、指数ｘが最後まで読まれたか（全てのビットブロックを読んだか）を調べる。指数ｘの全てのビットブロックの処理が終了していなければ、ステップ1207に進み乱数v[j]を発生する。この乱数は、0または1である。次に、S = S^2 mod Nを2回実行する（ステップ1208）。次に、条件分岐処理（ステップ1209，1210，1211，1212）において、指数ｘの２ビットブロックを読み、このビットブロック（図中では「ｘのビットブロック」と表現されている）が、２進数で、00であるか01であるか、10であるか、11であるかに応じて、それぞれ、ステップ1213，1214，1215，1216に進み、乗算剰余演算を行う。乗算剰余演算では、v[j] が、0であるか、1であるかに応じて、用いるテーブル値が異なる。例えば、xのビットブロックが10であれば、通常は、S = S*y[2][0] mod N = S*(y^2 mod N) mod Nを計算するが、v[j] = 1のときは、反転テーブルから、y[2][1]を取り出して、S = S*y[2][1] mod N = S*(N - (y^2 mod N)) mod Nを計算する（ステップ1215）。ステップ1213，1214，1216の処理においても、同様にv[j]の値に応じて乗ずる値を変える。乗算剰余処理を終えた後、ステップ1221にて、カウンタをインクリメントし、ステップ1206の処理に戻る。条件分岐処理（ステップ1206）にて、指数ｘのビットブロックを全て読み終わっている場合には、ステップ1217の処理に進む。ステツプ1217では、T = N - Sを計算し、これをＲＡＭに置く。ここで、SとTはＲＡＭで異なる位置に配置され、ＲＡＭ上で重複することはないものとする。条件分岐処理（ステップ1218）にて、最後のvの値が1であれば、Tを出力し（ステップ1219）、v = 0であれば、Sを出力する（ステップ1220）。この処理によって正しい値が出力されることは、( ｔN - B )^2 mod N = B^2 mod N（ｔは整数）であることから明らかである。このように処理することによって、オーバーフローの処理が本来のものとは異なるものになるため、ＩＣチップの消費電力や、処理時間等を観測して内部処理を行うことが困難になる。これは、本発明の実施例の一つである。これをモンゴメリ方式の場合に変更することは容易であるので、例を挙げることは省略する。
【００５９】
これまで示した実施例は、乗数側を変形するものである。本発明の趣旨は、乗数側、被乗数側のいずれか、または両方に適用することによって損なわれることはない。これは数学的には自明な事実である。しかし、実装上は若干の違いが生ずる。乗数側の変形は、最初の段階でテーブルを作成しさえすれば、その後は「取り出す値」を変化させることによって本発明を実現することができる。ところが被乗数を変形する場合は、被乗数自身が各計算過程で異なるため、計算過程毎に途中計算値SとN-Sを構成しなければならない。これを示すために、被乗数側を変形する実施例を示す。
【００６０】
図１３を順に説明する。まず、ステップ1301にて、S = R mod Nとし、さらに、xのビットブロックの番号を数えるためのカウンタjを0に初期化し、条件分岐判定用の変数v[0] = 0とする。次に２ビットアディション・チェイン方式処理用のテーブル作成を行う（ステップ1302）。テーブルは、通常のテーブル値y[0] = R mod N， y[1] = yR mod N， y[2] = y^2R mod N， y[3] = y^3R mod Nで構成され、乗数側の変形に用いる反転テーブルは不要である。テーブルは通常、ＲＡＭ上に存在する。このテーブル作成の後、条件分岐処理（ステップ1303）にて、指数ｘが最後まで読まれたか（全てのビットブロックを読んだか）を調べる。指数ｘの全てのビットブロックの処理が終了していなければ、ステップ1304に進み乱数v[j]を発生する。この乱数は、0または1である。次に、S = S^2*R^(-1) mod Nを2回実行する（ステップ1305）。最初の処理では、S = R mod Nに初期化されているので、この二乗剰余演算では、S = (R mod N)^2*R^(-1) mod N = R mod Nとなり、ステップ1305の処理結果は、R mod Nとなることに注意する。次に、このSから、S[0] = S， S[1] = N - Sを計算しＲＡＭ上に格納する（ステップ1306）。続いて、条件分岐処理（ステップ1307，1308，1309，1310）において、指数ｘの２ビットブロックを読み、このビットブロック（図中では「ｘのビットブロック」と表現されている）が、２進数で、00であるか01であるか、10であるか、11であるかに応じて、それぞれ、ステップ912， 913， 914， 915に進み、乗算剰余演算を行う。乗算剰余演算では、v[j] が、0であるか、1であるかに応じて、用いるテーブル値が異なる。例えば、xのビットブロックが10であれば、通常は、S = S[0]*y[0]*R^(-1) mod N = S*(y^2R mod N) mod Nを計算するが、v[j] = 1のときは、S[0]の代わりにS[1]を取り出して、S = S[1]*y[2]*R^(-1) mod N = (N - S)*(y^2R mod N)*R^(-1) mod Nを計算する（ステップ1313）。ステップ1311、1312、1314の処理においても、同様にv[j]の値に応じて乗ずる値を変える。乗算剰余処理を終えた後、ステップ1315にて、カウンタをインクリメントし、ステップ1303の処理に戻る。条件分岐処理（ステップ1303）にて、指数ｘのビットブロックを全て読み終わっている場合には、ステップ1316の処理に進む。ステップ1316では、モンゴメリ形式（R mod Nが掛かっている）のデータを通常の値に戻すために、R^(-1) mod Nを乗ずる処理を行う。次に、T = N - Sを計算し、これをＲＡＭに置く（ステップ1317）。ここで、SとTはＲＡＭ上で異なる位置に配置され、ＲＡＭ上で重複することはないものとする。条件分岐処理（ステップ1318）にて、最後のvの値が1であれば、Tを出力し（ステップ1319）、v = 0であれば、Sを出力する（ステップ1320）。この処理によって正しい値が出力されることは、( ｔN - B )^2 mod N = B^2 mod N（ｔは整数）であることから明らかである。このように処理することによって、オーバーフローの処理が本来のものとは異なるものになるため、ＩＣチップの消費電力や、処理時間等を観測して内部処理を行うことが困難になる。これは、乗算剰余演算A*B mod NのA，Bを上記のように置き換えたときに、特に(s， t， f， g) = {(0， 0， 0， 0)， (1， 0， 1， 0)}としたものの一つである。これをモンゴメリ法を用いない方式に変更することは容易であるので、例を挙げることは省略する。
【００６１】
これまでに示した実施例は、乗数または被乗数を変形したものであるが、両方を変形することもできることは言うまでもない。また、例えば図１３のステップ1305の処理過程で、S = (N - S)^2*R^(-1) mod Nのように処理を行うことにより、消費電流を本来のそれとは異なるものにすることが可能となる。本発明の実施例は、様々なバリエーションを持っているが、本質的には、上記の実施例を組み合せて構成することが可能である。
【００６２】
上記の実施例はいずれも、べき乗剰余計算の処理に対して適用されたものである。べき乗剰余計算に対して本発明はとりわけ有効であるが、上記の考え方をより一般のモジュラ計算（剰余計算）に置き換えることによって、オーバーフロー等の処理から秘密情報が漏洩することを防ぐことも可能である。べき乗剰余計算において本発明が有効である理由は、本質的には、
( ｔN - B )^2 mod N = B^2 mod N（ｔは整数）
という関係式が成り立つという事実に帰着する。
【００６３】
ところがべき乗剰余計算とは異なる処理、例えば、楕円曲線暗号における曲線上のベースポイントPのスカラー倍を計算するというような場合には、上記の関係式のような「自然な」修正処理が現れるとは限らない。この事情を簡単に説明する。素体GF(p)(pは大きな素数)において、楕円曲線E：
y^2 = x^3 + ax + b
を考える。先に延べたように、E上の点Pのスカラー倍kPを計算する場合は、点の2倍算と、点同士の和の計算が出現する（図８参照）。ここで、この二つの計算をより詳細に分解すると、通常のＩＣカードマイコンにおいては、ＲＳＡよりも複雑な計算過程を経なければならないことがわかる。
【００６４】
先に述べたように、楕円曲線上の点P=(x1， y1)， Q=(x2， y2)の和P+Qの座標を(x3， y3)とすると、P+Q=Oでないとき
x3 = (h^2 - x1 - x2) mod p
y3 = (h*(x1 - x3) - y1) mod p
と表現できる。ここで、hは、
h = (y2 - y1)*((x2 - x1)^(-1)) mod p if P≠Q， (3x1^2 + a)*((2y1)^(-1)) mod p if P = Q
である。
【００６５】
この群演算（モーデル・ヴェイユ群の群演算）で必要な乗算剰余演算を列挙すると、
h = (y2 - y1)*(x2 - x1)^(-1) mod p if P≠Q、--- (E1)
h = (3x1^2 + a)*(2y1)^(-1) mod p if P = Q  --- (E1)'
h^2 mod p --- (E2)
h*(x1 - x3) mod p --- (E3)
となる。(E1)の処理において、A = y2 - y1， B = (x2 - x1)^(-1) mod p(またはx2 - x1)をそれぞれ、sN + A*(-1)^f，tN + B*(-1)^g（s， t， f， gは整数。但し、f， gは0又は1）に置き換えると、オーバーフローのパターンが変化する（（E1）'の場合も同様）。hは(E2)の処理において法pにおいて２乗され、この値は本来のものと同一になるが、(E3)の処理では、値が、法pで反転してしまうため、正しいy3を求めるには、(E3)の結果を補正しなければならない。明らかにf+gが偶数であれば補正は不要で、f+gが奇数の場合は、補正が必要となる。
【００６６】
ここで、実施例を示すが、楕円曲線暗号の大域的処理フローについては、図８及び対応する説明において説明したので、ここでは、２倍計算S = 2SとS = S+P[j]の計算部に絞って説明を行う。すなわち、図８における、ステップ803（2倍計算）、ステップ809，810，811，812（和の計算）の処理に本発明の処理方式を実装する方法を説明する。
【００６７】
まず、素体GF(p)の上での実施例のうち、最も簡単なものを説明する。素体上での計算は、全て、法pのもとで実行すればよい。図１５はGF(p)上での楕円曲線E: y^2 = x^3 + ax + bにおける点P(x，y)の2倍計算に本発明を適用したものである。以下、2P = (x3， y3)とする。
【００６８】
ステップ1401において、D1 = (2*y)^(-1) mod pを計算する。次に、ステップ1402にて、D2 = (3*x^2 + a) mod pを計算する。これらD1，D2に対して、テーブルD1[0] = D1， D2[0] = D2，D1[1] = p - D1， D2[1] = p - D2を計算してＲＡＭに格納する（ステップ1403）。D1[1]， D2[1]は、それぞれ、法pに対するD1， D2の反転値である。次に２つ（2ビット）の乱数v，w(v，wは、共に0又は1)を発生する（ステップ1404）。次に、ステップ1403で求めたテーブルから、D1[v]， D2[v]を取り出して、乗算剰余計算：h = D1[v]*D2[v] mod pを実行して結果をＲＡＭに格納する（ステップ1405）。ここで、D1[1]*D2[1] mod p = (p - D1)*(p - D2) mod p = D1*D2 mod pであるので、ステップ1405の終了時には、v = 0， 1いずれの場合でも、正しいhが求まる。次にステップ1406，1407にて、x3を求め、答えをＲＡＭに格納する。ステップ1408にて、D3 = (x - x3) mod pを計算する。次に、このD3と、先に用いたhに対して、テーブルh[0] = h， D3[0] = D3，h[1] = p - h， D3[1] = p - D3を求めてＲＡＭに格納する（ステップ1409）。h[1]， D3[1]は、それぞれ、法pに対するh、 D3の反転値である。次に、ステップ1409で求めたテーブルから、h[v]， D3[v]を取り出して、乗算剰余計算：h[w]*D3[w] mod pを実行して結果をＲＡＭに格納する（ステップ1410）。ここで、h[1]*D3[1] mod p = (p - h)*(p - D3) mod p = h*D3 mod pであるので、ステップ1410の終了時には、w = 0， 1いずれの場合でも、正しい値が求まる。最後に、ステップ1411にて、y3 = (y3 - y) mod pを求めてＲＡＭに格納する。これで、2Pの各座標の値が求められたことになる。これは、本発明の実施例の一つである。
【００６９】
本実施例にて、ステップ1401における逆数計算を実行する代表的な方法は、拡張ユークリッド互除法を利用するものとフェルマーの小定理を利用するものである。拡張ユークリッド互除法では、不定方程式： 2*y*D1 + p*U = 1を(2*yとpの最大公約数を求める操作（ユークリッド互除法）を繰り返すことで、結果的にD1を求める方法である。一方、フェルマーの小定理を用いる方法とは、フェルマーの小定理、すなわち、pと互いに素な正の整数gに対し、g^(p-1) mod p = 1が成り立つことから、g^(-1) mod p = g^(p-2) mod pとなることを用いるものである。つまり、D1 = (2*y)^(p-2) mod pとして、D1を求めるものである。フェルマーの小定理を用いる方法では、逆数の計算は、べき乗剰余計算に帰着する。このべき乗剰余計算に本発明の方法を適用することは容易なことであり、オーバーフロー処理からのリーク情報を減らすことができる。
【００７０】
次にGF(p)上の楕円曲線に対する点の和の計算に本発明を適用した場合の実施例を示す。以下、楕円曲線上の点P=(x1， y1)、 Q=(x2， y2)の和P+Qの座標を(x3， y3)とし、P+Q=Oでないものとする。図１６はGF(p)上での楕円曲線E: y^2 = x^3 + ax + bにおける点PとQの和の計算に本発明を適用したものである。
【００７１】
条件分岐処理（ステップ1501）にて、PとQが一致しているかどうかを判定する。もし、PとQが一致していれば、2倍算になり、図１５について説明した処理と同じものになるので、説明は省略する（ただしｘ，ｙの符号はｘ１，ｙ１の符号に読み替える）。以下、PとQが一致していない場合の処理を示す。ステップ1502において、D1 = (x2 - x1)^(-1) mod pを計算する。次に、ステップ1503にて、D2 = (y2 - y1) mod pを計算する。これらD1，D2に対して、テーブルD1[0] = D1， D2[0] = D2，D1[1] = p - D1， D2[1] = p - D2を計算してＲＡＭに格納する（ステップ1504）。D1[1]， D2[1]は、それぞれ、法pに対するD1， D2の反転値である。次に二つ（2ビット）の乱数v，w(v，wは、共に0又は1)を発生する（ステップ1505）。次に、ステップ1504で求めたテーブルから、D1[v]， D2[v]を取り出して、乗算剰余計算：h = D1[v]*D2[v] mod pを実行して結果をＲＡＭに格納する（ステツプ1506）。ここで、D1[1]*D2[1] mod p = (p - D1)*(p - D2) mod p = D1*D2 mod pであるので、ステップ1506の終了時には、v = 0， 1いずれの場合でも、正しいhが求まる。次にステツプ1507，1509にて、x3を求め、答をＲＡＭに格納する。ステツプ1509にて、D3 = (x1 - x3) mod pを計算する。次に、このD3と、先に用いたhに対して、テーブルh[0] = h， D3[0] = D3，h[1] = p - h， D3[1] = p - D3を求めてＲＡＭに格納する（ステップ1510）。h[1]， D3[1]は、それぞれ、法pに対するh， D3の反転値である。次に、ステップ1510で求めたテーブルから、h[w]， D3[w]を取り出して、乗算剰余計算：h[w]*D3[w] mod pを実行して結果をＲＡＭに格納する（ステップ1511）。ここで、h[1]*D3[1] mod p = (p - h)*(p - D3) mod p = h*D3 mod pであるので、ステップ1511の終了時には、w = 0， 1いずれの場合でも、正しい値が求まる。最後に、ステツプ1512にて、y3 = (y3 - y1) mod pを求めてＲＡＭに格納する。これで、P+Qの各座標の値が求められたことになる。これは、本発明の実施例の一つである。
【００７２】
図１６の実施例は、容易にガロア体GF(p^n)(pは素数、 nは正の整数)に拡張することができる。先に述べたように、GF(p^n)は、GF(p)係数の多項式全体がつくる環（多項式環）GF(p)[X]のGF(p)における既約多項式Φ(X)（reduction polynomialと呼ばれることもある）の倍元全体が生成する素イデアル(prime ideal)（Φ(X)）による剰余環(quotient ring)GF(p)[x]/(Φ(X))と同型(homomorphic)であり、計算機では、GF(p)[x]/(Φ(X))として実現される。その演算を実行するにあたり、A(X)， B(X)をGF(p)[X]の元（すなわち、GF(p)係数の多項式）とすると、GF(p)[X]/(Φ(X))での演算は、
（和） ｛A(X) + B(X)｝ mod Φ(X)
（積） A(X)*B(X) mod Φ(X)
とすることによって実現することができる。但し、係数の演算は、mod pで行う。
【００７３】
実例を示す。素数p = 5， n = 2とし、reduction polynomial Φ(X)をX^2 + X + 1とする。Φ(X)が既約であることは、Φ(0) = 1， Φ(1) = 3， Φ(2) = 7 ≡ 2(mod 5)， Φ(3) = 13 ≡ 3(mod 5)， Φ(4) = 21 ≡ 1(mod 5)であることからすぐに分かる。A(X) = 4X^2 + 3X + 2、 B(X) = 3X^2 + 4X + 1とすると、この、二つの多項式のGF(5)[X]/(X^2+X+1)における和と積は、
0003950638.tif 000003
として計算することができる。この事実を踏まえれば、実施例を構成することは容易である。
【００７４】
素数p≧3の場合を考える。このとき、全ての楕円曲線は、E: y＾2 = x^3 + ax + bの形に変換できる。これをWeierstrassの標準形と呼ぶ。ここで、E上の点の座標の各成分は、GF(p^n)の元であるので、A(X)， B(X)をGF(p)[X]/（Φ(X)）の元として、(A(X)， B(X))のように表現することができる。
【００７５】
以下、P = (A(X)， B(X))の2倍計算についての実施例を示す。和の計算は、GF(p)の場合に対する図１６の実施例及び2倍計算の実施例から、容易に類推できるので、2倍計算の場合のみ説明する。
【００７６】
図１７に2倍計算の実施例を示す。ステップ1601において、D1（X) = (2*B(X))^(-1) mod Φ(X)を計算する。次に、ステツプ1602にて、D2（X) = (3*A(X)^2+a) mod Φ(X)を計算する。これらD1，D2に対して、テーブルD1[0](X) = D1(X)， D2[0] = D2(X)，D1[1]（X） = Φ（X) - D1(X)， D2[1](X) = Φ(X) - D2(X)を計算してＲＡＭに格納する（ステップ1603）。D1[1](X)， D2[1](X)は、それぞれ法Φ(X)に対するD1(X)， D2(X)の反転値である。次に２つ（2ビット）の乱数v，w(v，wは、共に0又は1)を発生する（ステップ1604）。次に、ステップ1603で求めたテーブルから、D1[v](X)， D2[v](X)を取り出して、乗算剰余計算：h(X) = D1[v](X)*D2[v](X) mod Φ(X)を実行して結果をＲＡＭに格納する（ステップ1605）。ここで、D1[1](X)*D2[1](X) mod Φ(X) = (Φ(X) - D1(X))*(Φ(X) - D2(X)) mod Φ(X) = D1(X)*D2(X) mod Φ(X)であるので、ステップ1605の終了時には、v = 0， 1いずれの場合でも、正しいh(X)が求まる。次にステップ1606，1607にて、A3(X)を求め、答えをＲＡＭに格納する。ステップ1608にて、D3(X) = (A(X) - A3(X)) mod Φ(X)を計算する。次に、このD3(X)と先に用いたh(X)に対して、テーブルh[0](X) = h(X)， D3[0](X) = D3(X)，h[1](X) = Φ(X)  h(X)， D3[1](X) = Φ(X) - D3(X)を求めてＲＡＭに格納する（ステップ1609）。h[1](X)， D3[1](X)は、それぞれ、法Φ(X)に対するh(X)， D3(X)の反転値である。次に、ステップ1609で求めたテーブルから、h[w](X)， D3[w](X)を取り出して、乗算剰余計算：h[w](X)*D3[w](X) mod Φ(X)を実行して結果をＲＡＭに格納する（ステップ1610）。ここで、h[1](X)*D3[1](X) mod Φ(X) = (Φ(X) - h(X))*(Φ（X） - D3(X)) mod Φ(X) = h(X)*D3(X) mod Φ(X)であるので、ステップ1610の終了時には、w = 0， 1いずれの場合でも、正しい値が求まる。最後に、ステップ1611にて、B3(X) = (B3(X) - B(X)) mod Φ(X)を求めてＲＡＭに格納する。これで、2Pの各座標の値が求められたことになる。これは、本発明の実施例の一つである。
【００７７】
本実施例にて、ステップ1601における逆数計算を実行する代表的な方法は、拡張ユークリッド互除法を利用するものとフェルマーの小定理を利用するものである。拡張ユークリッド互除法では、不定方程式： 2*B(X)*D1(X) + Φ(X)*U(X) = 1を(2*B(X)とΦ(X)の最大公約数を求める操作（ユークリッド互除法）を繰り返すことで、結果的にD1(X)を求める方法である。一方、フェルマーの小定理を用いる方法とは、フェルマーの小定理、すなわち、Φ(X)と互いに素なg(X)に対し、g(X)^(p^n-1) mod Φ(X) = 1が成り立つことから、g(X)^(-1) mod Φ(X) = g(X)^(p^n-2) mod Φ(X)となることを用いるものである。つまり、D1(X) = (2*B(X))^(p^n-2) mod Φ(X)として、D1(X)を求めるものである。フェルマーの小定理を用いる方法では、逆数の計算は、べき乗剰余計算に帰着する。このべき乗剰余計算に本発明の方法を適用することは容易なことであり、オーバーフロー処理からのリーク情報を減らすことができる。
【００７８】
次に、p = 2の場合の実施例を説明する。この場合は、これまでとは若干事情が異なる。これは、ガロア体GF(2^n)をreduction polynomial Φ(X)を用いてGF(2)[X]/(Φ(X))の形で表現した際、多項式の係数がGF(2)であることから生ずるものである。GF(2)においては、符号は無意味である。というのは、この体の上では、-1 = 1だからである。このことから本発明の趣旨の一つである、「法Φ(X)での反転」が無意味となるからである。また、GF(2)[X]の多項式A(X)の偶数倍も係数がmod 2で計算されるため0となって、計算結果に影響を与えない。従って、-A(X) ≡ A(X)となる。よって、Φ(X)とA(X)のGF(2)における線形結合は、0を除くと、本質的には、Φ(X)， Φ(X)+A(X)， A(X)だけとなる。この事実を踏まえて、p = 2の場合の実施例を示す。
【００７９】
ここでは、Weierstrass標準形E:y^2 + xy = x^3 + ax + bを持つ楕円曲線を考える。E上の点P = (A(X)， B(X))に対し、2P = (A3(X)， B3(X))とする。実施例を構成するにあたって、2倍公式を次のように変形しておく。
【００８０】
A3(X) = (h(X)^2 + h(X) + a) mod Φ(X)
B3(X) = (h(X)*(A(X) + A3(X)) + A3(X) + B(X)) mod Φ(X)
ここで、h(X)は、h（X） = (A(X)^2 + B(X))*A(X)^(-1) mod Φ(X)とする。
【００８１】
図１８に2倍計算の実施例を示す。ステツプ1701において、D1（X) = (A(X))^(-1) mod Φ(X)を計算する。次に、ステツプ1702にて、D2（X) = (A(X)^2+B(X)) mod Φ(X)を計算する。これらD1（X），D2（X）に対して、テーブルD1[0](X) = D1(X)， D2[0](X) = D2(X)，D1[1]（X） = Φ（X) + D1(X)， D2[1](X) = Φ(X) + D2(X)を計算してＲＡＭに格納する（ステップ1703）。次に４つ（4ビット）の乱数v， w， i， j(v， w， i， jは、全て0又は1)を発生する（ステップ1704）。次に、ステップ1703で求めたテーブルから、D1[v](X)， D2[w](X)を取り出して、乗算剰余計算：h(X) = D1[v](X)*D2[w](X) mod Φ(X)を実行して結果をＲＡＭに格納する（ステップ1705）。ここで（Φ(X)+D1(X)）*D2(X) mod Φ(X) = D1(X)*(Φ(X)+D2(X)) mod Φ(X) = (Φ(X) + D1(X))*(Φ(X) + D2(X)) mod Φ(X) = D1(X)*D2(X) mod Φ(X)であるので、ステツプ1705の終了時には、v， w = 0， 1のどの場合でも、正しいh(X)が求まる。次にステップ1706，1707にて、A3(X)を求め、答えをＲＡＭに格納する。ステップ1708にて、D3(X) = (A(X) + A3(X)) mod Φ(X)を計算する。次に、このD3(X)と先に用いたh(X)に対して、テーブルh[0](X) = h(X)， D3[0](X) = D3(X)，h[1](X) = Φ(X) + h(X)， D3[1](X) = Φ(X) + D3(X)を求めてＲＡＭに格納する（ステップ1709）。次に、ステップ1709で求めたテーブルから、h[i](X)， D3[j](X)を取り出して、乗算剰余計算：h[i](X)*D3[j](X) mod Φ(X)を実行して結果をＲＡＭに格納する（ステップ1710）。ここで、（Φ(X)+h(X)）*D3(X) mod Φ(X) = h(X)*(Φ(X)+D3(X)) mod Φ(X) = (Φ(X) + h(X))*(Φ(X) + D3(X)) mod Φ(X) = h(X)*D3(X) mod Φ(X)であるので、ステップ1710の終了時には、i， j = 0， 1のどの場合でも、正しい値が求まる。最後に、ステップ1711にて、B3(X) = (B3(X)+A3(X)+B(X)) mod Φ(X)を求めてＲＡＭに格納する。これで、2Pの各座標の値が求められたことになる。これは、本発明の実施例の一つである。
【００８２】
本実施例にて、ステップ1701における逆数計算を実行する代表的な方法は、拡張ユークリッド互除法を利用するものとフェルマーの小定理を利用するものである。拡張ユークリッド互除法では、不定方程式： A(X)*D1(X) + Φ(X)*U(X) = 1を(A(X)とΦ(X)の最大公約数を求める操作（ユークリッド互除法）を繰り返すことで、結果的にD1(X)を求める方法である。一方、フェルマーの小定理を用いる方法とは、フェルマーの小定理、すなわち、Φ(X)と互いに素なg(X)に対し、g(X)^(2^n-1) mod Φ(X) = 1が成り立つことから、g(X)^(-1) mod Φ(X) = g(X)^(2^n-2) mod Φ(X)となることを用いるものである。つまり、D1(X) = (A(X))^(2^n-2) mod Φ(X)として、D1(X)を求めるものである。フェルマーの小定理を用いる方法では、逆数の計算は、べき乗剰余計算に帰着する。このべき乗剰余計算に本発明の方法を適用することは容易なことであり、オーバーフロー処理からのリーク情報を減らすことができる。
【００８３】
楕円曲線上の点のモーデル・ヴェイユ群演算に関する上記実施例は、いずれも、符号の影響が、即時に解消されるものであった。ここで、即時解消されないような場合の実施例を示す。
【００８４】
図１９は、GF(p)上の楕円曲線E: y^2 = x^3 + ax + b上の点P = (x， y)の2倍計算に本発明を適用したものである。以下、2P = (x3， y3)とする。ステップ1801において、D1 = (2*y)^(-1) mod pを計算する。次に、ステップ1802にて、D2 = (3*x^2 + a) mod pを計算する。D2に対して、テーブルD2[0] = D2，D2[1] = p - D2を計算してＲＡＭに格納する（ステップ1803）。D2[1]は、法pに対するD2の反転値である。次に２つ（2ビット）の乱数v、w(v、wは、共に0又は1)を発生する（ステップ1804）。次に、ステップ1803で求めたテーブルから、D2[v]を取り出して、乗算剰余計算：h = D1*D2[v] mod pを実行して結果をＲＡＭに格納する（ステップ1805）。ここで、D1*D2[1] mod p は、D1*D2 mod pであるか、または、p - (D1*D2 mod p)であり、図１５の実施例とは異なり、ステツプ1805終了時点では、正しい値になるとは限らない。次にステツプ1806，1807にて、x3を求め、答えをＲＡＭに格納する。ここで、ステップ1806において、hがmod pで２乗されるため、ステツプ1805の結果が、D1*D2 mod pであっても、p - (D1*D2 mod p)であっても、正しいx3の値が求まる。ステツプ1808にて、D3 = (x - x3) mod pを計算する。次に、このD3に対して、テーブルD3[0] = D3，D3[1] = p - D3を求めてＲＡＭに格納する（ステップ1809）。D3[1]は、法pに対するD3の反転値である。次に、ステップ1809で求めたテーブルから、D3[w]を取り出して、乗算剰余計算：h*D3[w] mod pを実行して結果をＲＡＭに格納する（ステップ1810）。ここで、h*D3[1] mod p = h*(p - D3) mod p =p -(h*D3 mod p)であるので、ステップ1810の終了時では、v = 0であれば、h*D3 mod p、v = 1であれば、p - (h*D3 mod p)となっている。ステツプ1811にて、テーブルy3[0] = y3，y3[1] = p - y3を求めてＲＡＭに格納する。次に、条件分岐処理（ステツプ1812）にて、vとwの排他的論理和(exclusive OR) v EXOR wの値が、0であるか1であるかを判定し、0であれば、ステップ1813に進み、1であれば、ステップ1814に進む。排他的論理和 v EXOR wは、vとwが同じであれば0、異なれば1となる。従って、最終的に、該排他的論理和が0のときには、ステップ1813によって正しいy3が求められ、1のときは、ステップ1814にて、正しいy3が求められる。これで、2Pの各座標の値が求められたことになる。これは、本発明の実施例の一つである。
【００８５】
本実施例にて、ステップ1801における逆数計算を実行する代表的な方法は、拡張ユークリッド互除法を利用するものとフェルマーの小定理を利用するものである。拡張ユークリッド互除法では、不定方程式： 2*y*D1 + p*U = 1を(2*yとpの最大公約数を求める操作（ユークリッド互除法）を繰り返すことで、結果的にD1を求める方法である。一方、フェルマーの小定理を用いる方法とは、フェルマーの小定理、すなわち、pと互いに素な正の整数gに対し、g^(p-1) mod p = 1が成り立つことから、g^(-1) mod p = g^(p-2) mod pとなることを用いるものである。つまり、D1 = (2*y)^(p-2) mod pとして、D1を求めるものである。フェルマーの小定理を用いる方法では、逆数の計算は、べき乗剰余計算に帰着する。このべき乗剰余計算に本発明の方法を適用することは容易なことであり、オーバーフロー処理からのリーク情報を減らすことができる。
【００８６】
また、本実施例を、図１６の実施例等に倣ってGF(p^n)の上の楕円曲線上の2倍算に拡張することは、全く容易である。
【００８７】
【発明の効果】
本発明によれば、ＩＣカードチップなどの情報処理装置において、データとして本来の値とは異なる「モジュラ反転値」を用いて剰余乗算の計算を行い、その計算結果を修正することで正しい結果を求めることにより、消費電流の波形から処理や暗号鍵の推測を行うことが困難になる。
【図面の簡単な説明】
【図１】ＩＣカードの概観及び端子の構成を示す図である。
【図２】マイクロコンピュータの構成図である。
【図３】消費電流の波形の例を示す図である。
【図４】べき乗剰余計算（ウインドウ幅2ビットのアディション・チェイン方式）の処理手順を示す図である。
【図５】べき乗剰余計算（ウインドウ幅2ビットのスライディング・ウインドウ方式）の処理手順を示す図である。
【図６】楕円曲線の形状を示す図である。
【図７】楕円曲線上の加法を説明する図である。
【図８】楕円曲線上の点Pのスカラー倍の計算アルゴリズム（2ビットのアディション・チェイン方式）を示す図である。
【図９】モンゴメリ法を用いたべき乗剰余計算に本発明を適用した場合の第１の実施例の処理手順を示す図である。
【図１０】モンゴメリ法を用いたべき乗剰余計算に本発明を適用した場合の第２の実施例の処理手順を示す図である。
【図１１】通常のべき乗剰余計算に本発明を適用した場合の第１の実施例の処理手順を示す図である。
【図１２】通常のべき乗剰余計算に本発明を適用した場合の第２の実施例の処理手順を示す図である。
【図１３】モンゴメリ法を用いたべき乗剰余計算に本発明を適用した場合の第３の実施例の処理手順を示す図である。
【図１４】モンゴメリ法を用いたべき乗剰余計算に本発明を適用した場合の第３の実施例の処理手順を示す図（続き）である。
【図１５】  GF(p)上の楕円曲線上の点の2倍計算に本発明を適用した場合の第１の実施例の処理手順を示す図である。
【図１６】  GF(p)上の楕円曲線上の点の和計算に本発明を適用した場合の第１の実施例の処理手順を示す図である。
【図１７】  GF(p^n)上の楕円曲線上の点の2倍計算に本発明を適用した場合の実施例の処理手順を示す図である。
【図１８】  GF(2^n)上の楕円曲線上の点の2倍計算に本発明を適用した場合の実施例の処理手順を示す図である。
【図１９】  GF(p)上の楕円曲線上の点の和計算に本発明を適用した場合の第２の実施例の処理手順を示す図である。
【符号の説明】
906,1005,1106,1207,1304,1404,1604…ステップ（剰余乗算の選択）、912〜915,1012〜1015,1112〜1115,1213〜1216,1311〜1314,1405,1410,1605,1610…ステップ（選択的な剰余乗算）、917,1017,1116,1217,1317…（結果の補正）、919〜920,1019〜1020,1118〜1119,1219〜1220,1319〜1320…ステップ（結果の出力）
【図１】
0003950638.tif 000004
【図２】
0003950638.tif 000005
【図３】
0003950638.tif 000006
【図４】
0003950638.tif 000007
【図５】
0003950638.tif 000008
【図６】
0003950638.tif 000009
【図７】
0003950638.tif 000010
【図８】
0003950638.tif 000011
【図９】
0003950638.tif 000012
【図１０】
0003950638.tif 000013
【図１１】
0003950638.tif 000014
【図１２】
0003950638.tif 000015
【図１３】
0003950638.tif 000016
【図１４】
0003950638.tif 000017
【図１５】
0003950638.tif 000018
【図１６】
0003950638.tif 000019
【図１７】
0003950638.tif 000020
【図１８】
0003950638.tif 000021
【図１９】
0003950638.tif 000022