(57)【要約】  本発明の課題はサイドチャネル攻撃に対するセキュリティをさらに高める安全なデータ処理方法を提供することである。この課題は、とりわけビットに依存したレジスタ内容のスワップを行うための、コプロセッサの命令に対する命令コードを求めることにより解決される。その際、コプロセッサの技術的形態ゆえに、レジスタＡからレジスタＢへのレジスタ内容のシフトは外部からはレジスタＡからレジスタＣへのシフトと区別ができないということが利用される。
2009531725.tif 000002
【特許請求の範囲】
【請求項１】
第１のプロセッサにおいてビット（ｂi）の列により２進数として表現可能な鍵を用いた数学的演算を楕円曲線上の点に適用するようにした安全にデータを求めるための方法であって、別のプロセッサにおいて少なくとも１つのレジスタ内容に対する第１の演算（Ｘ）を生じさせる第１の命令（ｘ）と、前記別のプロセッサにおいて第２の演算（Ｙ）を生じさせる第２の命令（ｙ）を有する様式の方法において、
前記２つの命令（ｘ，ｙ）に応じて少なくとも１つの値（ｄ）を求めるステップと、
第１の補助変数（Ｒ）及び第２の補助変数（Ｓ）を初期化するステップと、
前記鍵の各ビット（ｂi）について、
（ａ）第１の補助変数（Ｒ）を前記別のプロセッサの第１のレジスタに、第２の補助変数（Ｓ）を第２のレジスタに伝送するステップ、
（ｂ）ビット（ｂi）の値と前記少なくとも１つの値（ｄ）に応じて第１の命令（ｘ）又は第２の命令（ｙ）が割り当てられるように、出力変数（Ａ）に命令を割り当てるステップ、
（ｃ）前記別のプロセッサの命令レジスタに前記出力変数（Ａ）を伝送するステップ、
（ｄ）前記別のプロセッサにおいて更新された第１及び第２の補助変数（Ｒ，Ｓ）を求めるステップを逐次的に実行するステップと、
前記ビット（ｂi）に関するステップが終了した後に、第１（Ｒ）及び／又は第２（Ｓ）の補助変数を出力し、第１（Ｒ）及び／又は第２（Ｓ）の補助変数から前記数学的演算の結果を求めるステップとを有することを特徴とする、安全にデータを求めるための方法。
【請求項２】
前記別のプロセッサのレジスタ内容に対して前記第１の命令（ｘ）に対応する前記第１の演算（Ｘ）を適用すると、前記第１のレジスタの内容と前記第２のレジスタの内容がスワップされるが、前記別のプロセッサのレジスタ内容に対して前記第２の命令（ｙ）に対応する前記第１の演算（Ｙ）を適用しても、前記第１のレジスタの内容と前記第２のレジスタの内容はスワップされない、請求項１記載の方法。
【請求項３】
前記第１の補助変数（Ｒ）は有限体上の楕円曲線の点を表すものであり、前記初期化ステップにおいて固定点（Ｐ）を割り当てられる、請求項１又は２記載の方法。
【請求項４】
前記第２の補助変数（Ｓ）は有限体上の楕円曲線の点を表すものであり、前記初期化ステップにおいて０の値を割り当てられる、請求項１から３のいずれか１項記載の方法。
【請求項５】
前記数学的演算はスカラー乗算（ｋ*Ｐ）を含む、請求項１から４のいずれか１項記載の方法。
【請求項６】
前記別のプロセッサで行われる前記第１（Ｒ）及び第２（Ｓ）の補助変数の更新は、
第１の算術演算において楕円曲線上の２つの点の加算を行い、第２の算術演算において楕円曲線上の点を２倍するスカラー乗算又は楕円曲線上の点をそれ自身に加える加算を行うステップと、
前記ビット（ｂi）の値に応じて前記第１及び第２の算術演算のそれぞれの結果が前記２つの補助変数（Ｒ，Ｓ）の一方に割り当てられるように、更新された第１及び第２の補助変数を求めるステップとを含む、請求項１から５のいずれか１項記載の方法。
【請求項７】
前記値（ｄ）は前記２つの命令（ｘ，ｙ）のビット表現間の違いから得られる差分値である、請求項１から６のいずれか１項記載の方法。
【請求項８】
前記ステップ（ｂ）において、現ビット（ｂi）の値に応じて前記差分値（ｄ）を前記第１の命令（ｘ）に付け加える、その際、
逐次処理における現ビット（ｂi）を含む第１のコンピュータワード（ｈ１）を生成し、
前記第１のコンピュータワード（ｈ１）に前記差分値（ｄ）を乗じて第１の積（ｍ１）を求め、
前記第１の積（ｍ１）を前記第１の命令（ｘ）に加算して第１の中間値を求め、前記第１のコンピュータワード（ｈ１）から、現ビット（ｂi）の位置にあるビットがゼロにセットされた第２のコンピュータワード（ｈ２）を生成し、
前記第２のコンピュータワード（ｈ２）に前記差分値（ｄ）を乗じて第２の積（ｍ２）を求め、
出力変数（Ａ）が前記第１の命令（ｘ）に割り当てられるか又は第２の命令（ｙ）に割り当てられるように、前記第１の中間結果から前記第２の積（ｍ２）を減算して出力変数（Ａ）を求める、請求項７記載の方法。
【請求項９】
前記ステップ（ｂ）において、出力変数（Ａ）が前記第１の命令（ｘ）に割り当てられるか又は第２の命令（ｙ）に割り当てられるように、前記ビット（ｂi）の値に応じて前記差分値（ｄ）を前記第２の命令（ｙ）から減算する、請求項７記載の方法。
【請求項１０】
逐次処理における現ビット（ｂi）は最下位ビット（ＬＳＢ）である、請求項１から９のいずれか１項記載の方法。
【請求項１１】
前記第１の命令（ｘ）は前記別のプロセッサの第３のレジスタの内容を前記別のプロセッサの第１のレジスタに送らせるものであり、前記第２の命令（ｙ）は前記第３のレジスタの内容を前記別のプロセッサの第２のレジスタに送らせるものであり、前記ステップ（ａ）の後、さらに別のステップにおいて、前記第１のレジスタの内容を前記第３のレジスタに送る命令と、前記第２のレジスタの内容を前記第１のレジスタに送る命令が、前記別のプロセッサの命令レジスタに送られる、請求項１から１０のいずれか１項記載の方法。
【請求項１２】
前記第１（ｘ）及び第２（ｙ）の命令は同じハミング重みを有する、請求項１から１１のいずれか１項記載の方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は安全にデータを求める方法に関するものであり、第１のプロセッサにおいて、楕円曲線の点に対して鍵を用いた数学的演算を適用する。なお、鍵はビット（ｂi)の列により２進数として表現可能である。
【０００２】
非対称暗号系は秘密鍵と公開鍵の鍵ペアによって高レベルのセキュリティを保証することにより、攻撃者が有限時間内に秘密鍵又は公開鍵で暗号化されたメッセージを解読することをほぼ不可能にする。楕円曲線に基づく暗号系のような通常の暗号系が基礎とする暗号化は、多項式時間内に実行可能であるが、鍵のビット長の指数時間内でしか反転ができない。今日、楕円曲線に基づくシステムでは、ｎ＝１６０〜１９２ビットの長さの鍵が使用されており、ＲＳＡアルゴリズムに基づくシステムでは、ほぼ同じセキュリティレベルのためにｎ＝１０２４〜１５３６ビットの長さを当てている。
【０００３】
このように、楕円曲線に基づいた暗号化法は他の暗号化法よりも効率的であり、同程度のセキュリティレベルを達成する場合でもシステムパラメータの伝送に必要な帯域幅が狭くて済む。
【０００４】
ここでは、例として、２人の通信加入者の間の共通鍵を取り決める周知のディフィ・ヘルマン法が楕円曲線の輪郭に基づいているとする。この場合、第１の通信加入者Ａはセキュリティパラメータｒaを、第２の通信加入者Ｂはセキュリティパラメータｒbを知っている。両通信加入者が楕円曲線とこの楕円曲線上の共通の点Ｐとに関して合意した後、通信加入者Ａは値Ｑa＝ｒa*Ｐを、通信加入者Ｂは値Ｑb＝ｒb*Ｐを求める。
【０００５】
続いて、通信加入者Ａから値Ｑaが通信加入者Ｂに伝送され、値Ｑbが通信加入者Ｂから通信加入者Ａに伝送される。さらにスカラー乗算により、通信加入者Ａは共通鍵Ｋ＝ｒa*Ｑb＝ｒa*ｒb*Ｐを求め、通信加入者Ｂも同じ共通鍵Ｋ＝ｒb*Ｑa＝ｒb*ｒa*Ｐを求める。
【０００６】
このように、このスカラー乗算は楕円曲線に基づいた暗号化法の基本ブロックを形成するものである。楕円曲線の使用は特に有利である。というのも、莫大な計算コストをかけなければ反転は、つまり、既知の点Ｑa,bとＰからＱa,b＝ｒa,b*Ｐとなるスカラーｒa,bを求めることはできないからである。今日の知識レベルによれば、スカラー乗算は多項式時間で計算可能であるが、指数時間でしか反転ができない。
【０００７】
しかし、楕円曲線に基づいた公知の暗号化法はいわゆるサイドチャネル攻撃に対して脆弱である。サイドチャネル攻撃は暗号化の反転に基づいた攻撃法に対する代案であり、暗号化の基礎をなすアルゴリズムをできるだけ効率的に破るものである。サイドチャネル攻撃は、とりわけ、暗号化されたメッセージの交換又はディジタル署名の生成又はメッセージの復号化のために秘密鍵情報が記憶された携帯ツール、例えばスマートカードやドングルのような携帯ツールで行使することが可能である。
【０００８】
攻撃者は相応する回路のデータラインにアクセスすることが比較的容易であることを利用して、電流、電磁放射、誘発させた故障の結果、又は所定の計算の所要時間などの物理量を測定する。単純電力解析（ＳＰＡ）に基づいて測定値を直接に評価したり、又はストレージオシロスコープにより電流などの測定値を記録し、その後で統計的な評価を行うことにより、基礎となるアルゴリズムに関する情報を効率的に得ることができ、最悪の場合には、現行の鍵に関する情報を得ることもできる。
【０００９】
後者については、例を挙げて詳しく説明しなければならない：
暗号化法では、楕円曲線に基づくアルゴリズムであろうと、ＲＳＡ法に基づくアルゴリズムであろうと、数学的演算の使用が予想される。
【００１０】
楕円曲線の場合であれば、スカラー乗算Ｑ＝ｋ*Ｐが数学的演算として実行される。ここで、Ｐは有限体Ｋ上の楕円曲線の点であり、ｋは鍵又は鍵から導かれる量である。
【００１１】
スカラー乗算の考えられる１つの変換は演算装置上で以下のアルゴリズムを実行することにより行うことができる。ここで、鍵ｋは２進表現（ｂi,ｉ＝ｎ−１...０）により設定されている。
アルゴリズム１：ＥＣ−楕円曲線：Ｑ＝ｋ*Ｐ
（1.1）Ｑ←０
（1.2）ｉ←ｎ−１
（1.3）ｉ＞−１である間
（1.3.1）Ｑ←２*Ｑ
（1.3.2）ｂi＝１ならば、Ｑ←Ｑ＋Ｐ
（1.3.3）ｉ←ｉ−１
（1.4）Ｑを返す
単純電力解析（ＳＰＡ）の場合、スカラー乗算の電力消費プロファイルが解析される。このスカラー乗算は主に加算と２倍算とから成る。しかしながら、これらの演算はＫにおける基本演算の数という点で著しく異なるため、電力消費も異なる。したがって、適当なサイドチャネル攻撃により、個々のビット、ひいてはｋそのものの２進表現を逆推論することができる。
【００１２】
このような攻撃に対して考えられる防衛ステップは、可能な２つのビット状態０と１に関して、各ビットの値に依存する電流の流れと計算所要時間を、以下に示すように等しくしてしまうことである。
【００１３】
楕円曲線Ｅの点Ｐはそのｘ座標とｙ座標とにより与えられる。楕円曲線Ｅの曲線方程式によれば、１つのｘ値に対して高々２つの異なるｙ値ｙ1及びｙ2が存在するので、点（ｘ，ｙ1）及び（ｘ，ｙ2）は楕円曲線Ｅ上の点である。それゆえ、楕円曲線Ｅ上の点を一意的に決定するには、ｘ座標の他にあと１ビットの追加情報しか必要ない。
【００１４】
有限素体上の楕円曲線Ｅの場合であれば、例えば各点のｙ座標のいわゆる最下位ビット（ＬＳＢ）又はｙ座標の符号だけで付加情報として十分である。
【００１５】
楕円曲線のこれらの特徴は、いわゆるMontgomery-Leiterアルゴリズムにおいて利用される。Montgomery-Leiterアルゴリズムは楕円曲線上でスカラー乗算を実施するための広く知られた方法である。Montgomery-Leiterアルゴリズムは、点Ｐのスカラー倍のｘ座標の計算にＰのｘ座標だけが使用されるように実装されうる。また、Montgomery-Leiterアルゴリズムは、後で示されるように、単純電力解析に対抗する非常に良い方法でもあるので、組込システムで実行される暗号系において実装されることが多い。
【００１６】
以下に説明するMontgomery-Leiterアルゴリズムの方法によれば、楕円曲線上にある点Ｐのスカラー倍ｋ*Ｐが計算される。
【００１７】
２進表現で与えられたスカラーｋ＝（ｂn-1,...,ｂi,...,ｂ0）は、いわゆる最上位ビット（ＭＳＢ，Ｎ１）から始めて、ビットごとに処理される。
アルゴリズム２：ＥＣ−楕円曲線：Ｑ＝ｋ*Ｐ
Montgomery-Leiter：
（2.1）Ｒ←Ｐ，Ｓ←０
（2.2）ｉ←ｎ−１
（2.3）ｉ＞−１である間
（2.3.1）ｂi＝１ならば、｛Ｓ←Ｓ＋Ｒ，Ｒ←２*Ｒ｝
（2.3.2）でなければ、｛Ｒ←Ｒ＋Ｓ，Ｓ←２*Ｓ｝
（2.3.3）ｉ←ｉ−１
（2.4）Ｒ，Ｓを返す
（2.5）点Ｒ，Ｓ及びＰからｋ*Ｐを再構成する
図示の例では、加算と２倍算はビットに依存せずに完全に同じ形で行われている。それゆえ、演算シーケンスの面からはビット列を逆推論することができない。しかしながら、ジャンプ命令（「ならば」、「でなければ」）には問題がある。というのも、ジャンプ命令は異なるアドレスへのジャンプをもたらすものであり、異なるアドレスへのジャンプは異なる電力消費として現れるからである。
【００１８】
したがって、本発明の課題は、サイドチャネル攻撃に対するセキュリティをさらに高める安全なデータ処理方法を提供することである。
【００１９】
本発明によれば、この課題は請求項１に記載された特徴を備えた方法により解決される。本発明の有利な実施形態は従属請求項に記載されている。
【００２０】
本発明による安全にデータを求める方法では、第１のプロセッサにおいて、鍵を用いた数学的な演算が楕円曲線の点に対して適用される。なお、鍵はビット（ｂi)の列により２進数として表現可能である。本方法は、別のプロセッサにおいて少なくとも１つのレジスタ内容に対する第１の演算（Ｘ）を生じさせる第１の命令（ｘ）と、前記別のプロセッサにおいて第２の演算（Ｙ）を生じさせる第２の命令（ｙ）を有している。これら２つの命令（ｘ，ｙ）に対応して、少なくとも１つの値（ｄ）が求められる。第１の補助変数（Ｒ）と第２の補助変数（Ｓ）は初期化される、つまり、初期値にセットされる。鍵の各ビット（ｂi）に対して、以下のステップが逐次的に実行される：
第１の補助変数（Ｒ）を別のプロセッサの第１のレジスタに送り、第２の補助変数（Ｓ）を前記別のプロセッサの第２のレジスタに送る。ビット（ｂi）の値と前記少なくとも１つの値（ｄ）とに応じて、第１の命令（ｘ）又は第２の命令（ｙ）が割り当てられるように、出力変数（Ａ）に命令を割り当てる。出力変数（Ａ）を前記別のプロセッサの命令レジスタに送る。
【００２１】
最後に、前記別のプロセッサで更新された第１（Ｒ）及び第２（Ｓ）の補助変数を求める。ビット（ｂi）に対してこれらのステップが終了した後で、第１（Ｒ）及び／又は第２（Ｓ）の補助変数と第１（Ｒ）及び／又は第２（Ｓ）の補助変数から数学的演算の結果が求められる。
【００２２】
本発明において、別のプロセッサとは、この概念の一般性を損なうことなく、コプロセッサ、とりわけ暗号化コプロセッサを意味する。このコプロセッサは限定された命令セットを有しており、コプロセッサにおいて等価な演算が行われるのか又は不等価な演算が行われるのかが測定によりほぼ識別できるようにハードウェア的に保護されている。
【００２３】
それゆえ、本発明の方法では、とりわけ、コプロセッサに対する指示、いわゆる命令コードが求められる。これらの命令コードは、コプロセッサ内でレジスタ内容のスワップを１回生じさせるか、又はまったく生じさせないものである。コプロセッサの技術的形態ゆえに、例えばレジスタＡからレジスタＢへのレジスタ内容のシフトは外部からはレジスタＡからレジスタＣへのシフトと区別ができない。それゆえ、上に述べた課題解決のための一般的なアプローチは、特に、処理されるべき補助変数を含んだメモリ領域へのアドレスを求める代わりに、ビットに依存したレジスタ内容のスワップを行うためのコプロセッサ命令の命令コードを求めることからなる。その際、レジスタ内容のアドレスはコプロセッサにおいて何の役割も演じないことが利用される。というのも、補助変数はすでにコプロセッサのレジスタにロードされており、レジスタはその時その時の命令コードによって暗黙的にアドレッシングされるからである。
【００２４】
この点で、本発明の方法は、とりわけ電力解析によるサイドチャネル攻撃からの保護を明らかに高めるという利点を有している。といのも、２つのレジスタの間でのスワップは専らコプロセッサの内部で行われ、スワップするかしないかは２つの命令コードの送信に基づいており、しかもこの２つの命令コードの実行はコプロセッサにおいては区別できないからである。
【００２５】
本発明の別の重要な利点として、２つの命令コードの差の計算を介してif-else分岐を陰伏的に行うことにより、サイドチャネル攻撃に対して特に脆弱なif-else分岐が回避される。
【００２６】
本発明の使用はコプロセッサに限定されない。したがって、例えば、自己書換えプログラムを実現するために異なる命令コードを選択する際に本発明の方法を使用することが可能であり、このようして陰伏的なif-else分岐を実現することができる。さらに、本発明の方法は冪乗ルーチンとスカラー乗算の他の実装にも転用可能である。
本発明の有利な実施形態によれば、第１の命令（ｘ）と第２の命令（ｙ）は同じハミング重みを有する。よって、有利には、両命令（ｘ，ｙ）ともサイドチャネル攻撃が外部から区別できるようなものでないことが保証される。
【００２７】
以下では、本発明を図面に示した実施例に基づき詳細に説明する。
【００２８】
図１は、コプロセッサの異なるレジスタに補助変数（Ｒ，Ｓ）を割り当てる様子を概略的に示しており、
図２は、コプロセッサ内部の命令コードによりコプロセッサのレジスタに補助変数（Ｒ，Ｓ）を割り当てる様子を概略的に示している。
【００２９】
アルゴリズム２に示されている従来の技術によるMontgomery-Leiterの流れによれば、ステップ（2.3.1）及び（2.3.2）では、ビット（ｂi）に応じて補助変数（Ｒ，Ｓ）のみがスワップされていることが分かる。
（3.1）ｂi＝１ならば、｛Ｓ←Ｓ＋Ｒ，Ｒ←２*Ｒ｝
（3.2）でなければ、｛Ｒ←Ｒ＋Ｓ，Ｓ←２*Ｓ｝
したがって、鍵ビットの値が０である場合には、ループの始めと終わりに補助変数をスワップすることでアルゴリズム２をさらに簡略化することができる。その場合には、Ｆ１＝｛Ｓ←Ｓ＋Ｒ，Ｒ←２*Ｒ｝として、２つのジャンプアドレスの一方のみを参照するだけでよい。
（4.1）ｂi＝１ならば、Ｆ１
（4.2）でなければ、｛（Ｒ，Ｓ）をスワップする、Ｆ１、（Ｒ，Ｓ）をスワップする｝
このような方法の基礎をなすMontgomery-Leiterアルゴリズムのハードウェア実装は図１に示されている。２つの補助変数（Ｒ）１０１及び（Ｓ）１０２は鍵ビット（ｂi）の値に従ってそれぞれコプロセッサ１０３の第１のレジスタ１０４又は第２のレジスタ１０５にシフトされる。鍵ビットの値が例えば１ならば、補助変数（Ｒ）１０１は第１のレジスタ１０４にシフトされ１０６、補助変数（Ｓ）１０２は第２のレジスタ１０５にシフトされる１０９。鍵ビットの値が０である場合には、補助変数（Ｒ）１０１は第２のレジスタ１０５にシフトされ１０７、補助変数（Ｓ）１０２は第２のレジスタ１０４にシフトされる１０８。
【００３０】
コプロセッサ１０３ではどちらの場合にも関数Ｆ１が実行されるので、関数Ｆ１の結果は必要に応じてさらに１回スワップされなければならない。
【００３１】
しかし、上に説明した方法では、ビット値に応じて、コピー時に１つのコンピュータワードにつき２回のメモリアクセスが必要であるため、サイドチャネル攻撃により検知される可能性が依然として存在するという欠点がある。体の要素が長ければ、多くのアクセスが必要になる。その影響は電力消費に大きく現れる。
【００３２】
本発明によれば、この欠点は補助変数（Ｒ，Ｓ）のスワップをコプロセッサ内で行うことで解消される。
【００３３】
図２にはこのプロセスが示されている。その時その時の鍵ビット（ｂi）に関係なく、補助変数（Ｒ）２０１はコプロセッサ２０３の第１のレジスタ２０４にシフトされ２０６、第２の補助変数（Ｓ）２０２はコプロセッサ２０３の第２のレジスタ２０５にシフトされる２０７。しかし、コプロセッサ２０３の命令コードはその時その時の鍵ビット（ｂi）に依存して求められ、コプロセッサの命令レジスタにシフトされる。鍵ビットの値が１の場合、第１の命令コードが命令レジスタにシフトされ、その結果、第１のレジスタ２０４にある補助変数（Ｒ）は第３のレジスタ２１２にシフトされ２０４、第２のレジスタ２０５にある補助変数（Ｓ）は第４のレジスタ２１３にシフトされる２１１。これに対して鍵ビットの値が０の場合には、第２の命令コードが命令レジスタにシフトされ、その結果、第１のレジスタ２０４にある補助変数（Ｒ）は第４のレジスタ２１３にシフトされ２０９、第２のレジスタ２０５にある補助変数（Ｓ）は第３のレジスタ２１２にシフトされる２１０。
【００３４】
別の実施例では、Ｒ，Ｓ，Ｃをコプロセッサの内部データレジスタとする。コプロセッサに対する上記の命令列は次のように表される：
（5.1）if ｂi＝０ then ｛（Ｒ，Ｓ）をスワップする｝
（5.2）else ｛（Ｒ，Ｓ）をスワップしない｝
第３のデータレジスタＣを用いれば、命令列は次のようにも表すことができる：
（6.1）if ｂj＝０ then ｛Ｃ←Ｒ，Ｒ←Ｓ，Ｓ←Ｃ｝
（6.2）else then｛Ｃ←Ｒ，Ｒ←Ｓ，Ｒ←Ｃ｝
又は
（7.1）Ｃ←Ｒ，Ｒ←Ｓ
（7.2）if ｂi＝０ then ｛Ｓ←Ｃ｝
（7.3）else then ｛Ｒ←Ｃ｝
ステップ（7.1）で行われる代入Ｓ←Ｃ及びＲ←Ｃは電力消費に測定可能な違いをもたらさないが、ビットに応じた分岐は依然としてサイドチャネル攻撃から保護されていない。したがって、以下では、命令Ｓ←Ｃを命令コード（ｘ）で、命令Ｒ←Ｃを命令コード（ｙ）で記述し、さらに一般性を損なうことなくｘ＜ｙであると仮定する。命令コードを有する命令は、相応する命令コードをコプロセッサの命令レジスタに書き込むことにより、コプロセッサによって実行される。これらの仮定の下で、命令列は次のように表すことができる：
（8.1）if ｂi＝０ then ｛Ａ←ｘ｝
（8.2）else then ｛Ａ←ｙ｝
（8.3）Ｃ←Ｒ，Ｒ←Ｓ
（8.4）命令コードをＡから命令レジスタに書き込む
残された唯一の測定可能なビット依存性は上記アルゴリズムにおける命令コードの代入により生じる。本発明によれば、（8.1）及び（8.2）におけるジャンプ命令は、命令（ｘ）と（ｙ）の間に差ｄ＝ｙ−ｘを求めることにより回避することができる。したがって、ジャンプ命令の結果は以下のようにビットに依存して計算される。
Ａ＝ｘ＋ｄ・ｂi
この方法は２つのコンピュータワードｈ及びｈ’を加えることによりさらに改善することができる。なお、これら２つのコンピュータワード（ｈ，ｈ’）は、その時その時の鍵ビットｂiであるコンピュータワードｈの最下位ビットによってのみ区別されるものである。ゆえに、ｂiは減算ｈ−ｈ’＝ｂiにより得られ、求められるべき命令コードは次のようにして計算することができる：
Ａ＝ｘ＋ｈ・ｄ−ｈ’・ｄ
この多項式は次のアルゴリズムで記述される：
（9.1）ｂiをワードｈのＬＳＢへと巡回させる
（9.2）ｈをｈ’にコピーし、ｈ’のＬＳＢを削除する
（9.3）Ａ←ｘ
（9.4）ｍ←ｈ*ｄ
（9.5）Ａ←Ａ＋ｍ
（9.6）ｍ←ｈ’*ｄ
（9.7）Ａ←Ａ−ｍ
この結果をアルゴリズム２で記述されたMontgomery-Leiterアルゴリズムに適用すれば、次のアルゴリズムが得られる：
（10.1）ｘ←命令{Ｓ←Ｃ}    //Ｒ，Ｓのレジスタ内容をスワップする
（10.2）ｙ←命令{Ｒ←Ｃ}    //Ｒ，Ｓのレジスタ内容をスワップしない
（10.3）Ｒ←Ｐ，Ｓ←０
（10.4）ｄ←ｙ−ｘ    ただしｘ＜ｙ
（10.5）for ｉ←ｎ−１ to ０ do
（10.6）    ｂiをワードｈのＬＳＢへと巡回させる
（10.7）    ｈをｈ’にコピーし、ｈ’のＬＳＢを削除する
（10.8）    Ａ←ｘ
（10.9）    ｍ←ｈ*ｄ
（10.10）    Ａ←Ａ＋ｍ
（10.11）    ｍ←ｈ’*ｄ
（10.12）    Ａ←Ａ−ｍ
（10.13）    Ｃ←Ｒ，Ｒ←Ｓ
（10.14）    Ａをコプロセッサの命令レジスタにロードする
（10.15）    コプロセッサにおいてＳ←Ｓ＋Ｒ，Ｒ←２*Ｒを計算する
（10.16）    Ｃ←Ｒ，Ｒ←Ｓ
（10.17）    Ａをコプロセッサの命令レジスタにロードする
（10.18）end
（10.19）点Ｒ，Ｓ及びＰからｋ*Ｐを再構成する
別の実施例では、例えばＩｎｆｉｎｅｏｎ社製のチップＳＬＥ６６ＣＸ３２０Ｐ上でコプロセッサＡＣＥを使用した場合の本発明による実装が記述される。
【００３５】
暗号化コプロセッサＡＣＥは４つのデータレジスタＣＲ０，ＣＲ１，ＣＲ２及びＣＲ３とオペランドレジスタＣを有している。この実施例では、２つの補助変数がデータレジスタＣＲ１及びＣＲ２にロードされる。次に、データレジスタＣＲ１及びＣＲ２の内容はスワップされなければならない。秘密ビットはワーキングレジスタＡの最下位ビット（ＬＳＢ）であるとする。これはこのケースでは８ビットの長さを有している。
【００３６】
暗号化コプロセッサＡＣＥはとりわけ命令move_CR1_C及びmove_CR2_cを使用することでき、これらの命令を用いてレジスタＣの内容をレジスタＣＲ１ないしレジスタＣＲ２にシフトする。第１の命令の命令コードｘは０ｘ６ｂであり、第２の命令の命令コードｙは０ｘ７３である。２つの命令コードの差ｄは８であるから、上記アルゴリズム（９．４）におけるｈ・ｄとの乗算はシフト命令で代用することができ、このようにしてアルゴリズムは簡略化される。下記のアルゴリズムは第１及び第２の命令に対する所望の命令コードを求める様子を示したものであり、演算＆はＡＮＤ論理演算を表している。
【００３７】
命令コードの選択
（11.1）Ａを左に３ビットだけサイクリックに巡回させる
（11.2）Ｂ←Ａ＋０ｘ６ｂ
（11.3）Ａ←Ａ＆０ｘｆ７を計算する（下位第３ビットをマスクする）
（11.4）Ａ←Ｂ−Ａ
ステップ（11.1）において、鍵は、したがってまた識別のためのビットは、３ビット分のシフト命令により左へサイクリックに巡回させられる。これは差８を掛けることに相当する。ステップ（11.2）では、命令コードｘの値が加算される。ステップ（11.3）では、識別のためのビットが削除され、続いて残りの部分が第４のステップ（11.4）においてさらに差し引かれる。
【００３８】
下記の実装は代替的な解決手段である。なお、演算｜はＯＲ論理演算を表している：
命令コードの選択
（12.1）Ａ＆０ｘｆｄを計算する（下位第２ビットをマスクする）
（12.2）Ａ←Ａ＋１
（12.3）Ａ＆０ｘ０３を計算する（下位第２ビットまでのすべてのビットをマスクする）
（12.4）Ａを左に３ビットだけサイクリックに巡回させる
（12.5）Ａ｜０ｘ６３を計算する
ステップ（12.1）から（12.3）における代入の効果は、識別のために使用される鍵の最下位ビットに応じ、ビットの値が０である場合にはレジスタＡに値１が代入され、ビットの値が１である場合にはレジスタＡに値２が代入されることにある。ステップ（12.4）では、レジスタＡの内容が左に３ビットだけ巡回される。これは８を掛けることに相当する。ステップ（12.5）では、命令コードが算出される。所望の命令コードはそれ以降レジスタＡの中にある。
【００３９】
アルゴリズム１２を使用すれば、サイドチャネル攻撃から保護された２つのレジスタのスワップは完全となる：
（13.1）Ａ＆０ｘｆｄを計算する（下位第２ビットをマスクする）
（13.2）Ａ＝Ａ＋１
（13.3）Ａ＆０ｘ０３を計算する（下位第２ビットまでのすべてのビットをマスクする）
（13.4）Ａを左に３ビットだけ巡回させる
（13.5）Ａ｜０ｘ６３を計算する
（13.6）ＡＣＥレジスタＣＲ１をＣへシフトする
（13.7）ＡＣＥレジスタＣＲ２をＣＲ１へシフトする
（13.8）命令コードＡをコプロセッサＡＣＥの命令レジスタに書き込む
アルゴリズム１３では、アルゴリズム１２から暗号化コプロセッサに対する命令コードを求める計算ステップが、所与の鍵ビットに依存してコプロセッサのレジスタＣＲ１及びＣＲ２の内容をスワップするアルゴリズム８からのステップと組み合わされる。
【００４０】
しかし、本発明は本明細書で示した実施例に限定されない。
【図面の簡単な説明】
【００４１】
【図１】コプロセッサの異なるレジスタに補助変数（Ｒ，Ｓ）を割り当てる様子を概略的に示す。
【図２】コプロセッサ内部の命令コードによりコプロセッサのレジスタに補助変数（Ｒ，Ｓ）を割り当てる様子を概略的に示す。
【図１】
2009531725.tif 000003
【図２】
2009531725.tif 000004
【国際調査報告】
2009531725.tif 000005
2009531725.tif 000006
2009531725.tif 000007
2009531725.tif 000008
2009531725.tif 000009
2009531725.tif 000010