説明

暗号処理装置、暗号処理方法及びコンピュータプログラム

【課題】逆元演算を実行する際に表れるサイドチャネル情報から秘密情報が漏洩されることを防止する新規な暗号モジュールを提供する。
【解決手段】記憶部に記録されている数値データを複数種類の演算処理で更新しながら逆元演算を実行する逆元演算部12を備え、逆元演算の実行過程で外部から認知可能な物理量の変化パタンが生じる暗号モジュール1において、逆元演算部12(制御部125)は、数値データの更新を行わず、且つ処理により生じる物理量の変化が変化パタンに影響を与えるダミー演算処理を実行し、通常処理を実行するとともに通常処理時とは異なるパタンで変化パタンを生じさせる。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、暗号処理の際のセキュリティ技術に関し、特にサイドチャネル攻撃により秘密情報が漏洩することを防止する暗号処理技術に関する。
【背景技術】
【0002】
ICカードのように高度なセキュリティ性が要求される暗号モジュールは、所要の処理を実行するときの消費電力や電磁波のような物理量の変化パタン(以下、「サイドチャネル情報」という。)の解析により、秘密鍵が漏洩する(以下、「サイドチャネル攻撃」という。)ことが知られている。
そのため、サイドチャネル攻撃への対処が重要になってくる。例えば、RSA(ISO/IEC 18033-2などで標準化)やDSA(FIPS PUB 186-2で規定)のようなデジタル署名アルゴリズムを実装する際には、鍵生成処理や署名生成処理などにおいて、べき乗剰余演算(Modular exponentiation)が行われるが、このべき乗剰余演算処理の過程から、サイドチャネル攻撃によって秘密鍵が漏洩する可能性があることが知られている。
【0003】
べき乗剰余演算は、「t=g^k mod p」で表され、「g」をk乗した結果を「p」で除算したときの剰余を算出する演算である。べき乗剰余演算の処理過程からサイドチャネル攻撃による秘密鍵の漏洩を防止する方法として、擬似演算処理(以下、擬似乗算の処理を「ダミー乗算処理」、擬似減算の処理を「ダミー減算処理」、これらの処理を区別する必要のない場合は「ダミー演算処理」と称する。)を行う方法、「g」のスクランブル(BlindingやDuplicate Method)、「p」の変換、べき数「k」のスクランブル、エンコードなどが知られている。
【0004】
ダミー演算処理、例えばダミー乗算処理を用いる方法は、べき乗剰余演算の途中に本来は不要な乗算処理を実行して、べき乗剰余演算の実行過程を観察することで得られるサイドチャネル情報を、対策を施さない場合の処理のときと異なるものとすることで、べき数kの漏洩を防止する。
特許文献1は、このようなダミー乗算を用いてサイドチャネル攻撃による秘密鍵の漏洩を防止する例である。
【特許文献1】特開2007−316491号公報
【0005】
「g」のスクランブルには、べき乗剰余演算を2つの演算処理に分けて実行する方式(Duplicate Method)がある。この方式は、「g=g1*g2 mod p」となるランダムに定めた2つベースg1、g2について、それぞれ「t1=g1^k mod p」と「t2=g2^k mod p」とを求め、最後に「t=t1*t2 mod p」とする。
【0006】
「p」の変換とは、「p'=R*p」として、「t'=g^k mod p'」を求めた後に、「t=t' mod p」とする手法である。Rは乱数である。また、「k」のスクランブルは,乱数Rによって、「k'=k+R(p-1)」として,「t=g^k' mod p」とする手法である。
【0007】
このように、べき乗剰余演算に対するサイドチャネル攻撃への対策は、従来から多々講じられてきた。これは、べき乗剰余演算をよく知られたバイナリ法などで実装するとその実行過程を物理的に観察することで得られるサイドチャネル情報からダイレクトにべき数kを得ることができると知られていて、さらに、良く知られたRSAやDSAなどにおいては、べき数が得られることは、秘密鍵そのものが得られることと等価である。そのために、従来から、べき乗剰余演算に対するサイドチャネル攻撃への対策は、非常に重要であった。
【0008】
その一方で、RSA鍵生成処理やDSA署名生成処理で実行される逆元演算については、実行過程から得られるサイドチャネル情報と秘密情報との関係が不明であったために、これまでは処理速度や実装面積などについての工夫しか施されておらず、秘密情報の漏洩防止の議論がなされていなかった。しかし、最近、発明者らの研究によって、逆元演算の入力データが漏洩することがわかった。
【0009】
逆元演算は、数値データa,b(aとbとは互いに素)を入力データとし、数値データvを出力データとして、「v=1/a mod b」で表すことができる。拡張2進GCD法による逆元演算は、主に、加減算処理とシフト処理(例えば「2」による除算)や「2」による乗算)との組み合わせで行われる。
以下、説明の便宜上、入力データbを奇数とする。
【0010】
まず、入力データである数値データa,bの初期値をa0,b0とする。数値データa,bの少なくとも一方が偶数であれば偶数である方の数値データにシフト処理(2による除算)を行って数値データa,bを更新する。数値データa,bの両方が奇数ならば、大きい数値データから小さい数値データを減算して大きい数値データを更新する。その際、初期値である下記の2行2列の行列データGと、初期値0である数値データgに数値データa,bに行った更新に対応する演算を行う。
【0011】
【数1】


なお、説明の便宜上、上記の行列を[1,0;0,1]と表現する。例えば、行列[a;b]は下記のような2行1列の行列である。
【0012】
【数2】

【0013】
数値データの更新は、次のように行う。但し、a,b,gは、数値データa,b,g、Gは行列データGである(以下、本明細書において同じ)。
aをシフトする場合は、G=[1,0;0,2]*Gとg=g+1、
bをシフトする場合は、G=[2,0;0,1]*Gとg=g+1、
a=a−bを行う場合は、G=[1,-1;0,1]*G、
b=b−aを行う場合は、G=[1,0;-1,1]*G。
これにより、a,b,G,gとの間には、下記の関係が保たれる。
「a*2^g=G[1,1]*a0+G[1,2]*b0」
「b*2^g=G[2,1]*a0+G[2,2]*b0」
この2つの式は、行列表現すると、下記のようになる。
[a;b]*2^g=G*[a0;b0]。
【0014】
このようなシフト処理と減算処理との組み合わせを数値データbが「0」になるまで続ける。そのとき、aはa0とb0の最大公約数である「1」となる。その後、出力データvの初期値としてG[1,1]を設定しておき、このvをg回「2」除算し、「2」で割り切れない場合には数値データbの初期値であるb0を加算する。
このようにして求めた出力データvが、「1/a mod b」となる値である。
【0015】
逆元2進GCD法の主たる演算である減算処理とシフト処理とでは、処理の中味が異なるため,この違いが処理時間あるいは消費電力など何かしらの物理量の変化パターンの違いとなって観察できる場合がある。図7aは消費電力の時間変化を表したグラフで、処理時間は同じだが消費電力が異なる場合の例である。減算処理時の消費電力がシフト処理時の消費電力よりも大きいために、消費電力の変化パタンから、減算処理とシフト処理とを区別することができ、サイドチャネル情報が得られる。このサイドチャネル情報に所定の変換アルゴリズムを適用すれば、数値データaなどの逆元の入力データを得ることができる。そして、べき乗剰余演算のべき数kと同様に、RSAの鍵生成処理やDSAの署名生成処理において逆元演算の入力データが得られることは秘密鍵そのものが得られることと等価である。
【発明の開示】
【発明が解決しようとする課題】
【0016】
本発明は、上記の問題に鑑み、逆元演算を実行する際に表れるサイドチャネル情報から秘密情報が漏洩されることを防止する新規な暗号処理技術を提供することを、その課題とするものである。
【課題を解決するための手段】
【0017】
本発明は、上記の課題を解決するために、暗号処理装置、暗号処理方法及びコンピュータプログラムを提供する。
本発明の暗号処理装置は、メモリに記録された数値データを複数種類の演算処理により更新しながら逆元演算を実行する際に、装置外部から認知可能な物理量の変化パタンが生じる暗号処理装置において、前記逆元演算の実行過程で、冗長処理を付加的に実行しつつ当該逆元演算による最終実行結果を有効なものとすることで、前記実行過程で生じる物理量の変化パタンを前記冗長処理が存在しない場合と異なるパタンに変容させる冗長処理手段を設けたことを特徴とする。
この暗号処理装置では、逆元演算の実行過程で、冗長処理が付加的に実行されるので通常処理により得られる物理量の変化パタンとは異なる変化パタンが生じる。サイドチャネル情報から秘密情報を得ようとする者は、この変化パタンからサイドチャネル情報を得ることになるが、サイドチャネル情報に冗長処理による情報が含まれるため、物理量の変化パタンを観測するだけでは秘密情報を得ることができなくなる。
【0018】
冗長処理手段は、種々の実施の態様をとり得る。第1の態様では、前記逆元演算の実行過程で、前記複数種類の演算処理の結果を更新しないダミー演算処理を実行する。通常処理では、必ず複数種類の演算処理による数値データの更新を伴う。ダミー演算処理は、数値データを更新しないので、逆元演算の最終処理結果に影響を与えることなく、つまり、最終処理結果を有効なものとしつつ、実行過程で生じる物理量の変化を通常処理時と異なるパタンに変容させることができる。更新しない複数種類の演算処理のいずれかにより生じる物理量の変化パタンを、通常処理時の物理量の変化と同じにすれば、ダミー演算処理による変化パタンか、通常処理による変化パタンかの区別がつかなくなるため、変化パタンから秘密情報が漏洩する可能性をより低くすることができる。
【0019】
第1の態様での冗長処理手段は、また、2つの前記数値データの大小を判別する大小判別手段と、前記2つの数値データのそれぞれが奇数か偶数かを判別する奇数・偶数判別手段とを備え、前記大小判別手段による判別結果及び前記奇数・偶数判別手段による判別結果の組み合わせが所定の条件を満たすときに前記ダミー演算処理の実行を開始するように構成することができる。これにより、ダミー演算処理が付加的に実行されるタイミングを適切に定めることができる。
【0020】
冗長処理手段の第2の態様では、前記複数種類の演算処理の処理により更新される数値データをスクランブルするスクランブル手段と、前記逆元演算による前記数値データの最終更新前に前記スクランブルを復元する逆スクランブル手段とを有するものとする。逆スクランブル手段は、スクランブルの手順を記録しておき、その逆の手順の処理を行うことで、スクランブル前の数値データを得ることができる。この態様でも、逆元演算の処理結果に何らの異常を生じさせず、物理量の変化パタンだけを通常処理時のものと異ならせることができるため、変化パタンから秘密情報が漏洩する可能性をより低くすることができる。
【0021】
冗長処理手段の第3の態様では、前記逆元演算の実行過程でランダムに不規則な要素を発生させる要素発生手段と、正しい演算結果が求まるよう組み合わされた演算処理と当該演算処理を実行する条件の複数の組の中から、前記発生した要素にもとづいて、演算処理を選択して実行する演算処理選択手段を有するものとする。不規則な要素としては、例えば乱数発生手段によってランダムに発生する数値である。このような態様では、あらかじめ不規則な要素に対応させて、正しい解が求まるような、所定の数を乗ずるようにしているので、逆元演算の処理結果に何らの異常を生じさせず、物理量の変化パタンだけを通常処理時のものと異ならせることができる。そのため、第1態様と同様、変化パタンから秘密情報が漏洩する可能性をより低くすることができる。逆元演算の処理結果に何らの異常を生じさせず、物理量の変化パタンだけを通常処理時のものと異ならせることができる。そのため、第1態様と同様、変化パタンから秘密情報が漏洩する可能性をより低くすることができる。
【0022】
本発明の暗号処理方法は、メモリに記録された数値データを複数種類の演算処理によって更新しながら逆元演算を実行する装置が行う暗号処理方法であって、前記逆元演算の実行過程で、冗長処理を付加的に実行しつつ当該逆元演算による最終実行結果を有効なものとすることで、前記逆元演算の実行過程で生じる物理量の変化パタンを前記冗長処理が存在しない場合と異なるものとすることを特徴とする。
【0023】
本発明のコンピュータプログラムは、メモリを有するコンピュータを、暗号処理装置として動作させるためのコンピュータプログラムであって、前記コンピュータを、前記メモリに記録された数値データを複数種類の演算処理により更新しながら実行する逆元演算の実行過程で、冗長処理を付加的に実行しつつ当該逆元演算による最終実行結果を有効なものとすることで、前記実行過程で生じ、且つ、前記暗号処理装置の外部から認知可能な物理量の変化パタンを前記冗長処理が存在しない場合と異なるパタンに変容させる冗長処理手段として機能させるコンピュータプログラムである。
【発明の効果】
【0024】
本発明によれば、冗長処理を付加的に実行しつつ逆元演算による最終実行結果を有効なものとすることで、逆元演算の実行過程で生じる物理量の変化パタンが、冗長処理が存在しない場合の処理(以下、冗長処理が存在する場合と区別するために「通常処理」と称する場合がある。)と異なるパタンに変容するので、この変化パタンが外部に認知されても、逆元演算がどのように行われたかを解析することができなくなるという特有の効果が得られる。
【発明を実施するための最良の形態】
【0025】
以下、本発明を、高セキュリティ性のICカードなどの暗号モジュールに適用した場合の実施の形態例を、図面を参照して説明する。
図1は、この実施形態による暗号モジュールのハードウェア構成図である。この暗号モジュール1は、CPU(Central Processing Unit)10と、I/Oインタフェース20と、CPU10で実行される各種プログラムを格納するプログラムメモリ31及びプログラムの実行時に用いられるデータが格納されるデータメモリ32を含むメモリ30とをハードウエア資源として含み、I/Oインタフェース20を介して、図示しない外部装置と通信できるように構成される。暗号モジュール1は,外部装置との間で通信して,RSAやDSAなどのデジタル署名アルゴリズムで使用するパラメータやメッセージを受信し,処理結果を送信する。
【0026】
暗号モジュール1は、上記のハードウエア資源とプログラムメモリ31に格納された本発明のコンピュータプログラムとの協働により、特徴的な暗号処理を行うための種々の機能を実現する。図2は、このようにして実現される暗号モジュール1の機能ブロック図である。暗号モジュール1は、べき乗剰余演算部11、逆元演算部12、素数生成部13、乱数生成部14、RSA鍵生成部15、DSA署名生成部16、及び記憶部17の機能を実現する。
【0027】
べき乗剰余演算部11は、「t=g^k mod p」で表されるべき乗剰余演算処理を行う。べき乗剰余演算部11は、従来と同様のサイドチャネル攻撃に対する対策が施されており、ダミー乗算、「g」のスクランブル、「p」の変換、「k」のスクランブル、エンコードなどを行う。
【0028】
逆元演算部12は、「v=1/k mod p」で表される逆元演算を行う。逆元演算部12は、判別部121、加減算処理部122、シフト処理部123、スクランブル部124、及び制御部125の機能ブロックを有する。
判別部121は、数値データの大小判別、数値データを「2」で除算したときの剰余の大小判別及び当該剰余による数値データの偶数、奇数の判別、数値データの符号の判別など、特徴的な逆元演算を実行する上で必要となる各種の判別を行う。判別部121は、この判別結果を制御部125に送る。
【0029】
加減算処理部122は、数値データの加算処理及び減算処理を行う。シフト処理部123は、数値データを「2」で除算及び乗算(シフト処理)する。スクランブル部124は、乱数生成部14で生成された乱数を用いて数値データのスクランブルを行う。制御部125は、判別部121の判別結果に応じて加減算処理部122及びシフト処理部123に加減算処理及びシフト処理を実行させる。制御部125は、判別結果により、減算処理のときは、どの数値データからどの数値データを減算するかを指示し、加算処理のときはどの数値データを用いた加算であるかを指示し、シフト処理のときは、どの数値データのシフト処理を行うかを指示する。
【0030】
逆元演算部12は、上記の機能ブロックにより、逆元演算のサイドチャネル攻撃に対する種々の対策を実現する。例えば、判別部121、加減算処理部122、シフト処理部123、及び制御部125によるダミー演算処理(第1の対策)、スクランブル部125による数値データのスクランブルとその逆の手順による逆スクランブル(第2の対策)、及び、判別部121、加減算処理部122、シフト処理部123、及び制御部125による演算過程における大小判別のランダムなエラー又はノイズの混入とそのリカバリ(第3の対策)、の3つの対策を実現する。
逆元演算部12では、これら3つの対策の少なくとも1つにより(好適には、3つを組み合わせて)、サイドチャネル情報による秘密情報の漏洩を効果的に防止する。これらの詳細については、後述する。
【0031】
素数生成部13は、RSA鍵生成処理のときに用いる素数を生成し、乱数生成部14は、DSA署名処理のときに用いる乱数を生成する。
【0032】
RSA鍵生成部15は、べき乗剰余演算部11、逆元演算部12、及び素数生成部13を用いてRSA鍵を生成する。このRSA鍵の生成処理は、例えば図3の処理手順で行われる。まず、パラメータとして「e」及び素数p、qのサイズを、I/Oインタフェース20を介して外部装置から取得する(ステップS100)。「e」は、システムの固定値の場合が多い。代表的な例として「e=2^16+1」である。
次に、パラメータとして取得したサイズを満たす素数p、qを、素数生成部13で生成する(ステップS110)。素数p、qは、「gcd(e,p-1)=1」、「gcd(e,q-1)」を満たす。これらを用いて逆元演算部12で、「d=1/e mod lcm(p-1,q-1))」を行い、「d」を求める(ステップS120)。また、素数p、qの積nを算出する。これにより、公開鍵(e,n)、秘密鍵(d,p,q)が得られる(ステップS130)。
【0033】
DSA署名生成部16は、べき乗剰余演算部11、逆元演算部12、及び乱数生成部14によりDSA署名処理を行う。DSA署名生成処理は、例えば図4の処理手順で行われる。まず、メッセージMをI/Oインタフェース20を介して外部装置から取得する(ステップS200)。また、署名生成鍵(秘密鍵)xを取得する。公開パラメータを(g,p,q)とする。次に、べき数kを乱数発生部14で生成する(ステップS210)。べき数kは(0<k<q)の範囲にある乱数である。次に、べき乗剰余演算部11でべき乗剰余演算「(g^k mod p) mod q」を行い、署名データの一つである「r」を求める(ステップS220)。次に、べき数kの逆元k’を逆元演算部12で算出する「k'=1/k mod p)」(ステップS230)。次に署名sを求める。署名sは、「s=k'・(SHA1(M)+xr) mod q」により求められる(ステップS240)。以上の手順により、署名データ(r,s)を得る(ステップS250)。
【0034】
記憶部17は、暗号モジュール1で実行する各種処理に用いる数値データ、メッセージ、パラメータなどを格納するメモリである。特に、この実施形態では、逆元演算部12により行われる逆元演算で更新の対象となる数値データ、逆元演算の実行過程で生成される一時データを格納する。
【0035】
RSA鍵生成部15で行うRSA鍵生成処理及びDSA署名生成部16で行うDSA署名生成処理は、いずれも逆元演算をその処理内容に含む。逆元演算では、上記の通り、サイドチャネル攻撃に対する第1〜第3の対策を施す。以下の説明では、逆元演算を拡張2進GCD法により実行する場合を例として、第1〜第3の対策について説明する。
【0036】
<第1の対策>
第1の対策としては、加減算処理部122による減算処理を、逆元演算に必要な通常処理の他にダミー演算処理、例えばダミー減算処理として周期的に行うことで、シフト処理部123によるシフト処理の連続実行回数を固定して行う。
ダミー減算処理も通常処理(ダミーでない通常の(減算)処理)と同じ処理内容なので、物理量の一例となる消費電力の変化パタンは同じである。判別部121が、数値データの大小判別結果及び数値データの偶数、奇数判別を行い、この判別結果により制御部125が加減算処理部122による減算処理とシフト処理部123によるシフト処理とを行うが、シフト処理を連続して決まった回数行わせた後に通常処理又はダミー減算処理を必ず行う。
通常処理もダミー減算処理も同じ消費電力となるので、サイドチャネル情報では、どちらの処理なのかは区別できない。そのために、サイドチャネル情報からの秘密鍵情報の漏洩を防止できる。例えば、シフト処理の連続実行回数を1回に固定して、シフト処理が終了する度に通常処理又はダミー減算処理を行う。
そのための最も安易な方法は、シフト処理が連続する場合には、連続するシフト処理の間に毎回ダミー減算処理を入れることである。
【0037】
以下のアルゴリズムでは、シフト処理と、通常処理又はダミー減算処理とを交互に実行できる。図5は、このアルゴリズムのフローチャートである。これにより、通常処理又はダミー減算処理と、シフト処理とが交互に行われ、結果として、シフト処理の連続実行回数は1回に固定される。このアルゴリズムにおいて数値データaは、べき乗剰余演算のべき数kと同様に、漏洩すると秘密鍵の暴露につながる情報である。また、アルゴリズム中の「t=a-b」、「t=b-a」、及び「t=v+b0」がダミー減算処理である。
【0038】
INPUT:(a,b), OUTPUT: v,
begin
b0=b; G=[1,0;0,1]; g=0;
while(b>0){
if(a>b){
if(a%2<b%2){ t=a-b; T=[1,-1;0,1]*G; }
else{ a=a-b; G=[1,-1;0,1]*G; }
if(a%2==0){ a=a/2; G=[1,0;0,2]*G; g=g+1; }else
if(b%2==0){ b=b/2; G=[2,0;0,1]*G; g=g+1; }
}else{
if(b%2<a%2){ t=b-a; T=[1,0;-1,1]*G; }
else{ b=b-a; G=[1,0;-1,1]*G; }
if(a%2==0){ a=a/2; G=[1,0;0,2]*G; g=g+1; }else
if(b%2==0){ b=b/2; G=[2,0;0,1]*G; g=g+1; }
}
}
v=G[1,1];
while(g>0){
if(v%2!=0){ v=v+b0; }else{ t=v+b0; } v=v/2; g=g-1;
}
return(v);
end;
【0039】
「/」は除算、「%」は剰余算である。「[]」は配列又は行列で、「[i11,i12; i21,i22]」ならば2行2列の行列を表す。「Y[i,j]」は行列Yのi行j列目の要素を表す。大文字と小文字は別変数である。
【0040】
1つ目の「while」ループ(以下、「第1ループ」という。)の開始時の数値データa,bの値の状態、具体的には、数値データa,bの大小、数値データa,bのそれぞれが偶数か奇数かによって8個のルートに分岐する。このアルゴリズムであれば、どのルートであっても、加減算処理部122による減算処理とシフト処理部123によるシフト処理とが1回ずつ実行される。
【0041】
a>b, a%2=0, b%2=0 → a=a-b, a=a/2
a>b, a%2=0, b%2=1 → t=a-b, a=a/2(ダミー減算処理)
a>b, a%2=1, b%2=0 → a=a-b, b=b/2
a>b, a%2=1, b%2=1 → a=a-b, a=a/2
a<=b, a%2=0, b%2=0 → b=b-a, a=a/2
a<=b, a%2=0, b%2=1 → b=b-a, a=a/2
a<=b, a%2=1, b%2=0 → t=b-a, b=b/2(ダミー減算処理)
a<=b, a%2=1, b%2=1 → b=b-a, b=b/2
【0042】
判別部121が、数値データaが数値データbよりも大きく且つ数値データaを「2」で除算したときの剰余(a%2)が「0」(数値データaが偶数)、剰余(b%2)が「1」(数値データbが奇数)であると判別したとき、あるいは数値データbが数値データa以上で数値データbを2で除算したときの剰余(b%2)が「0」(数値データbが偶数)、剰余(a%2)が「1」(数値データaが奇数)であると判別したときに、制御部125は、ダミー減算処理を実行する。すなわち、ダミー減算処理が実行されるのは、3つの条件がそろった場合( (a>b) & (a%2=0) & (b%2=1) )などのときである。
ダミー減算処理では、数値データa,bは更新されず、一時データtとして記憶部17に格納される。一時データtは逆元演算の通常処理には関与しないために、ダミー減算処理が通常処理の処理結果に影響を与えることはない。この場合、制御部125は、本発明のダミー演算処理手段の機能を有する。
【0043】
このようなダミー演算処理(上記例では、ダミー減算処理)により、逆元演算の結果を有効にしつつ秘密情報の漏洩につながるサイドチャネル情報を外部で認知できなくする。また、通常処理の途中にダミー演算処理を実行するので、毎回ダミー演算処理を挿入するよりも効率がよい。例えば、a=10、b=23の場合は、第1ループが以下のような処理になる。この例では、最後から2番目にダミー減算処理が開始される。また、減算処理とシフト処理とが交互に行われるために、シフト処理の回数から秘密鍵が漏洩することはない。
【0044】
処理 ; 処理後の値
b=b-a,a=a/2 ; a=5, b=13
b=b-a,b=b/2 ; a=5, b=4
a=a-b,b=b/2 ; a=1, b=2
t=b-a,b=b/2 ; a=1, b=1(ダミー減算処理)
b=b-a,b=b/2 ; a=1, b=0
【0045】
図7bは、このような第1の対策により得られる消費電力の変化パタン(時間と共に変化するパタン)の例示図である。図7aに表す通常処理による消費電力の変化パタンは、サイドチャネル情報として有用である。しかし、図7bでは、減算処理とシフト処理とが交互に行われ、また、ダミー減算処理と通常処理による減算処理との区別がつかないので、サイドチャネル情報として用いることが困難になる。
【0046】
<第2の対策>
第2の対策としては、数値データa,bを乱数などを用いてスクランブルし、逆元演算による数値データの最終更新前に逆スクランブルすることにより復元することにより、実際に逆元演算で処理される値をわかりづらくする。例えば、スクランブル部124が乱数生成部14から乱数R1とR2とを取得して、数値データaを「a'=a+R1*b」として変換し、数値データbを「b’=b*R2」と変換する。ここで、R2は奇数で、「gcd(a’,R2)=1」である乱数を使用する。
これにより剰余演算の性質から、「v' = 1/a' mod b'」とすると、「v' mod b= 1/(a+R*b) mod b=1/a mod b」となる。
最終更新前に逆スクランブルとして、「v=v'mod b」を行うことにより、正しい逆元演算処理結果を求めて出力する。
但し、R2=1にすれば最後の逆スクランブルは不要にできる。
【0047】
このように、実際に逆元演算で更新される数値データをスクランブル/逆スクランブルすることで、公開情報との関係を切断でき、サイドチャネル情報から秘密情報を求めることができなくなる。この対策は、数値データa,bに関する情報を利用した攻撃を阻止できる。第三者がサイドチャネル情報のみから数値データa,bを復元することが困難になる。
【0048】
<第3の対策>
第3の対策としては、加減算処理部122による加減算処理の内容(数値データaを更新するか、数値データbを更新するか)を、ランダムに変更して行うことで、サイドチャネル情報に“不規則な要素”を含ませる。また、逆元演算による数値データの更新では、数値データa,bの条件と、その条件に対して正しい演算結果が得られる演算の組み合わせを複数用意し、ランダムに得られた不規則な要素にもとづいて、前記組み合わせを選択して演算することにより、有効な逆元演算の結果を得る。これによって数値データa,bの値の更新が不規則になり、観察したサイドチャネル情報から数値データa,bを復元することが困難になる。
【0049】
以下のアルゴリズムは、「a=a-b」と「b=b-a」の処理分岐を乱数によって反転させる例である。図6は、このアルゴリズムのフローチャートである。この処理分岐は、判別部121による数値データa,bの偶数、奇数判別、数値データa,bの絶対値の差と乱数の乗算結果の正負判別、及び数値データa,bの乗算結果の正負判別により決まる。乱数部分が「random(100)-50)」であるので、この乱数は負の値をとり得る。乱数は、例えば乱数発生部14から取得する。
【0050】
INPUT:(a,b), OUTPUT: v,
begin
b0=b; G=[1,0;0,1]; g=0; s=0;
while(abs(b)>0){
if(a%2==0){ a=a/2; G=[1,0;0,2]*G; g=g+1; }else
if(b%2==0){ b=b/2; G=[2,0;0,1]*G; g=g+1; }else
if((abs(a)-abs(b))*(random(100)-50))>0){
if(a*b>0){ a=a-b; G=[1,-1;0,1]*G; }
else{ a=a+b; G=[1,+1;0,1]*G; }
}else{
if(a*b>0){ b=b-a; G=[1,0;-1,1]*G; }
else{ b=b+a; G=[1,0;+1,1]*G; }
}
}
if(a>0){ v=G[1,1]; }else{ v=-G[1,1]; }
while(g>0){
if(v%2!=0){ v=v+b0; }else{ t=v+b0; } v=v/2; g=g-1;
}
return(v) ;
end;
【0051】
数値データa,bの符号が同じ場合には、max(|a|,|b|)>|a-b|が成立するため、「a=a-b」あるいは「b=b-a」という処理を行っても、max(|a|,|b|)は増加することはない。
|a|>|b|のときに「a=a-b」を行えば、max(|a|,|b|)は減少し、|a|>|b|のときに「b=b-a」を行えば、max(|a|,|b|)は不変である(|a|<|b|のときはその逆になる)。また、数値データa,bの符号が異なる場合には、max(|a|,|b|) > |a+b|が成立するため、「a=a+b」あるいは「b=b+a」という処理を行っても、max(|a|,|b|)は増加することはない。|a|>|b|のときに「a=a+b」を行えば、max(|a|,|b|)は減少し、|a|>|b|のときに「b=b+a」を行えば、max(|a|,|b|)は不変である。
よって圧倒的な確率で、max(|a|,|b|)は「0」に近づき、第1ループは収束する。例えば、「a=11、b=23」の場合は、第1ループは、以下のように収束する。
処理 ; 処理後の値
b=b-a ; a=11, b=12
b=b/2 ; a=11, b=6
b=b/2 ; a=11, b=3
b=b-a ; a=11, b=-8
b=b/2 ; a=11, b=-4
b=b/2 ; a=11, b=-2
b=b/2 ; a=11, b=-1
a=a+b ; a=10, b=-1
a=a/2 ; a=5, b=-1
b=b+a ; a=5, b=4
b=b/2 ; a=5, b=2
b=b/2 ; a=5, b=1
a=a-b ; a=4, b=1
a=a/2 ; a=2, b=1
a=a/2 ; a=1, b=1
b=b-a ; a=1, b=0
このように、制御部125は、本発明のリカバリ手段の機能を有する。
【0052】
また、「a=a-b」、「a=a+b」、「b=b-a」、「b=b+a」の4パターンにあわせてGの処理も用意する。すなわち、次のような処理を行う。
「a=a-b」の場合は、G=[1,-1;0,1]*G、
「a=a+b」の場合は、G=[1,+1;0,1]*G、
「b=b-a」の場合は、G=[1,0;-1,1]*G、
「b=b+a」の場合は、G=[1,0;+1,1]*G。
これにより、第1ループで不規則な要素を発生させても、a,b,Gの相互関係は正しく保持されるため、正しく逆元演算することができる。
【0053】
図7cは、このような第3の対策により得られる消費電力の時間変化の例示図である。図7cでは、発生させた不規則な要素によってサイドチャネル情報が図7aとは異なる形になっている。また、「a=a-b」、「a=a+b」、「b=b-a」、「b=b+a」の4パターンは、加算か減算かという違いであり、加算も減算もどちらも消費電力はほとんど同一であるので、エラー又はノイズによって4パターンのどの処理を行ったかのを見分けることはできない。そのために、観察したサイドチャネル情報から数値データa,bを復元することが困難になる。
【0054】
このように、本実施形態による暗号モジュール1では、逆元演算に対するサイドチャネル攻撃への対策を種々講じることができる。逆元演算のサイドチャネル情報としては、図7aのような減算処理時とシフト処理時との消費電力の相違に基づくものがある。しかし、第1、第3の対策を施した逆元演算により得られるサイドチャネル情報は、ダミー演算処理である減算処理や処理分岐の判断を、乱数によりランダムに間違わせることで、分岐先を変えることで、図7b、図7cのように単調なもの、あるいはノイズを含むものとなり、そのままではサイドチャネル情報としては無用なものにする。そのため、悪意の第三者がRSA鍵生成やDSA署名生成などのデジタル署名アルゴリズムで行われる逆元演算からサイドチャネル情報を取得して、秘密情報を得ることが著しく困難になる。これにより秘密情報が漏洩しにくくなり、セキュリティ性が格段に向上する。
【図面の簡単な説明】
【0055】
【図1】本発明を適用した暗号モジュールのハードウェア構成図。
【図2】本実施形態による暗号モジュールの機能ブロック図。
【図3】RSA鍵生成処理の処理手順図。
【図4】DSA署名生成処理の処理手順図。
【図5】第1の対策のフローチャート。
【図6】第3の対策のフローチャート。
【図7a】消費電力の変化パタン(時間変化)の例示図。
【図7b】消費電力の変化パタン(時間変化)の例示図。
【図7c】消費電力の変化パタン(時間変化)の例示図。
【符号の説明】
【0056】
1…暗号モジュール、10…CPU、20…I/Oインタフェース、30…メモリ、31…プログラムメモリ、32…データメモリ、11…べき乗剰余演算部、12…逆元演算部、121…判別部、122…加減算処理部、123…シフト処理部、124…スクランブル部、125…制御部、13…素数生成部、14…乱数生成部、15…RSA鍵生成部、16…DSA署名生成部、17…記憶部。

【特許請求の範囲】
【請求項1】
メモリに記録された数値データを複数種類の演算処理により更新しながら逆元演算を実行する際に、装置外部から認知可能な物理量の変化パタンが生じる暗号処理装置において、
前記逆元演算の実行過程で、冗長処理を付加的に実行しつつ当該逆元演算による最終実行結果を有効なものとすることで、前記実行過程で生じる物理量の変化パタンを前記冗長処理が存在しない場合と異なるパタンに変容させる冗長処理手段を設けたことを特徴とする、
暗号処理装置。
【請求項2】
前記冗長処理手段は、
前記逆元演算の実行過程で、前記複数種類の演算処理の結果を更新しない擬似演算を実行することを特徴とする、
請求項1記載の暗号処理装置。
【請求項3】
前記擬似演算は、更新しない複数種類の演算処理のいずれかにより生じる物理量の変化パタンを、前記更新を伴う演算処理により生じる物理量の変化と同じにすることを特徴とする、
請求項2記載の暗号処理装置。
【請求項4】
前記冗長処理手段は、
2つの前記数値データの大小を判別する大小判別手段と、
前記2つの数値データのそれぞれが奇数か偶数かを判別する奇数・偶数判別手段とを備え、前記大小判別手段による判別結果及び前記奇数・偶数判別手段による判別結果の組み合わせが所定の条件を満たすときに前記擬似演算処理の実行を開始することを特徴とする、
請求項2又は3記載の暗号処理装置。
【請求項5】
前記冗長処理手段は、
前記逆元演算の実行過程でランダムに不規則な要素を発生させる要素発生手段と、
正しい演算結果が求まるよう組み合わされた演算処理と当該演算処理を実行する条件の
複数の組の中から、前記発生した要素にもとづいて、演算処理を選択して実行する、演算処理選択手段を有することを特徴とする、
請求項1記載の暗号処理装置。
【請求項6】
前記冗長処理手段は、
前記複数種類の演算処理により更新される数値データをスクランブルするスクランブル手段を有することを特徴とする、
請求項1記載の暗号処理装置。
【請求項7】
メモリに記録された数値データを複数種類の演算処理によって更新しながら逆元演算を実行する装置が行う暗号処理方法であって、
前記逆元演算の実行過程で、冗長処理を付加的に実行しつつ当該逆元演算による最終実行結果を有効なものとすることで、前記逆元演算の実行過程で生じる物理量の変化パタンを前記冗長処理が存在しない場合と異なるものとすることを特徴とする、
暗号処理方法。
【請求項8】
メモリを有するコンピュータを、暗号処理装置として動作させるためのコンピュータプログラムであって、
前記コンピュータを、
前記メモリに記録された数値データを複数種類の演算処理により更新しながら実行する逆元演算の実行過程で、冗長処理を付加的に実行しつつ当該逆元演算による最終実行結果を有効なものとすることで、前記実行過程で生じ、且つ、前記暗号処理装置の外部から認知可能な物理量の変化パタンを前記冗長処理が存在しない場合と異なるパタンに変容させる冗長処理手段として機能させる、
コンピュータプログラム。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7a】
image rotate

【図7b】
image rotate

【図7c】
image rotate