(57)【要約】【課題】ＩＣチップの内部で処理されるアドレス情報と、その消費電力の関連を、減少させることによって、消費電力の変化から内部情報を取り出すことを困難にするものである。【解決手段】ＩＣチップの内部で処理されるアドレス情報と、その消費電力の関連を、条件分岐の際のプログラムカウンタの変化が小さくなるように、プログラムとデータの間のハミング距離を小さくすることによって、減少させる。【選択図】　図６
2004126841.tif 000002
【特許請求の範囲】
【請求項１】
プログラムを格納するプログラム格納部、データを保存するデータ格納部を持つ記憶装置とプログラムに従い、所定の処理を実行し、データ処理を行う中央演算装置を持ち、プログラムは中央演算装置に実行の指示を与える処理命令から構成される一つ以上のデータ処理手段からなり、一つのデータ処理手段が、その入力データを処理し、処理済データを出力する入力データ処理手段を含み、当該情報処理装置に格納されたプログラム又はデータのアドレスを示すプログラムカウンタを持つ情報処理装置において、アドレスの値がＰＣＳである位置に配置された転送命令又は条件分岐又は無条件分岐命令が実行された直後にアクセスされるデータ又はサブルーチンを、｜Ｈａｍ（ＰＣＳ，　ＰＣＤ［Ｉ］）−Ｈａｍ（ＰＣＳ，　ＰＣＤ［Ｊ］）｜≦４（１≦Ｉ＜Ｊ≦ｍ）となるようなアドレスＰＣＤ［１］，　ＰＣＤ［２］，．．．，　ＰＣＤ［ｍ］で開始される位置に配置することを特徴とするプログラム実装方法。（但し、ここで、Ｈａｍ（Ａ，Ｂ）は、アドレスＡとＢのハミング距離であり、Ａ，　Ｂの二進数表現において、相異なるビットの数と定義される。例えば、Ａ＝１１０１０１０１とＢ＝０１１１０１００のハミング距離は、３である。）
【請求項２】
プログラムを格納するプログラム格納部、データを保存するデータ格納部を持つ記憶装置とプログラムに従い、所定の処理を実行し、データ処理を行う中央演算装置を持ち、プログラムは中央演算装置に実行の指示を与える処理命令から構成される一つ以上のデータ処理手段からなり、一つのデータ処理手段が、その入力データを処理し、処理済データを出力する入力データ処理手段を含み、当該情報処理装置に格納されたプログラム又はデータのアドレスを示すプログラムカウンタを持つ情報処理装置において、アドレスの値がＰＣＳ［１］，　ＰＣＳ［２］，．．．，　ＰＣＳ［ｍ］（ｍは２以上の整数）である位置に配置された転送命令又は条件分岐又は無条件分岐命令が実行された直後にアクセスされるデータ又はサブルーチンを、
｜Ｈａｍ（ＰＣＳ［Ｉ］，　ＰＣＤ［Ｉ］）−Ｈａｍ（ＰＣＳ［Ｊ］，　ＰＣＤ［Ｊ］）｜≦４（１≦Ｉ＜Ｊ≦ｍ）となるようなアドレスＰＣＤ［１］，　ＰＣＤ［２］，．．．，　ＰＣＤ［ｍ］で開始される位置に配置することを特徴とするプログラム実装方法。
【請求項３】
プログラムを格納するプログラム格納部、データを保存するデータ格納部を持つ記憶装置とプログラムに従い、所定の処理を実行し、データ処理を行う中央演算装置を持ち、プログラムは中央演算装置に実行の指示を与える処理命令から構成される一つ以上のデータ処理手段からなり、一つのデータ処理手段が、その入力データを処理し、処理済データを出力する入力データ処理手段を含み、当該情報処理装置に格納されたプログラム又はデータのアドレスを示すプログラムカウンタを持つ情報処理装置において、アドレスの値がＰＣＳである位置に配置された転送命令又は条件分岐又は無条件分岐命令が実行された直後にアクセスされるデータ群のアドレスの集合が、
（第１群）ＰＣＤ［１，１］，　ＰＣＤ［１，２］，．．．，　ＰＣＤ［１，ｍ］
（第２群）ＰＣＤ［２，１］，　ＰＣＤ［２，２］，．．．，　ＰＣＤ［２，ｍ］
………
（第ｎ群）ＰＣＤ［ｎ，１］，　ＰＣＤ［ｎ，２］，．．．，　ＰＣＤ［ｎ，ｍ］
であるとき、ＰＣＤとのハミング距離の集合
Ｓ［ｊ］　＝　｛Ｈａｍ（ＰＣＳ，　ＰＣＤ［ｊ，ｋ］）；　ｋ　＝　１，２，３，．．．，　ｍ｝（ｊ＝１，２，３，．．．，ｎ）
が、集合としてＳ［１］＝Ｓ［２］＝．．．＝Ｓ［ｎ］を満たすようなアドレスＰＣＤ［１，１］，　ＰＣＤ［１，２］，　．．．　，　ＰＣＤ［１，ｍ］，ＰＣＤ［２，１］，　ＰＣＤ［２，２］，　．．．　，　ＰＣＤ［２，ｍ］，………，ＰＣＤ［ｎ，１］，　ＰＣＤ［ｎ，２］，　．．．　，　ＰＣＤ［ｎ，ｍ］で開始される位置に配置することを特徴とするプログラム実装方法。
【請求項４】
請求項３において、集合Ｓ［ｊ］（ｊ＝１，２，３，．．．，ｎ）内の各アドレスにアクセスする順序を予測できない情報源によって各ｊ毎に毎回変化させることを特徴とするプログラム実装方法。
【請求項５】
請求項１において、Ｈａｍ（ＰＣＳ，　ＰＣＤ［Ｉ］）＝Ｈａｍ（ＰＣＳ，　ＰＣＤ［Ｊ］）（１≦Ｉ＜Ｊ≦ｍ）とすることを特徴とするプログラム実装方式。
【請求項６】
請求項２において、Ｈａｍ（ＰＣＳ［Ｉ］，　ＰＣＤ［Ｉ］）＝Ｈａｍ（ＰＣＳ［Ｊ］，　ＰＣＤ［Ｊ］）（１≦Ｉ＜Ｊ≦ｍ）　とすることを特徴とするプログラム実装方式。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は，高いセキュリティを持つＩＣカードなどの耐タンパー情報処理装置に関するものである。
【０００２】
【従来の技術】
ヨーロッパで広く利用されているＧＳＭ（Ｇｌｏｂａｌ　Ｓｙｓｔｅｍｓ　ｆｏｒ　Ｍｏｂｉｌｅ　ｃｏｍｍｕｎｉｃａｔｉｏｎｓ）規格のモバイルホンをはじめとするモバイル端末や、ＩＣカード（ｓｍａｒｔ　ｃａｒｄ）などでは、利用者認証（ｕｓｅｒ　ａｕｔｈｅｎｔｉｃａｔｉｏｎ）や、電子商取引（ｅｌｅｃｔｒｉｃ　ｃｏｍｍｅｒｃｅ）を行うことができる。一般に、電子マネー（ｅｌｅｃｔｒｉｃ　ｍｏｎｅｙ）として利用する場合、それはＩＣカードの形態を取っており、ＧＳＭモバイルホン（ＧＳＭ　ｍｏｂｉｌｅ　ｒａｄｉｏｔｅｌｅｐｈｏｎｅ　ｓｙｓｔｅｍ）の場合は、ＳＩＭ（Ｓｕｂｓｃｒｉｂｅｒ　Ｉｄｅｎｔｉｆｉｃａｔｉｏｎ　Ｍｏｄｕｌｅ）とよばれる形態を取っている。ＳＩＭもＩＣカードも端子付きの半導体チップをプラスティックの板に張り付けたものであり、いずれもデバイスの実体は同じく半導体チップであるので、以下ＩＣカードについて説明する。
【０００３】
ＩＣカードは、勝手に書き換えることが許されないような個人情報の保持や、データの暗号化や復号化を行う装置である。ＩＣカード自体は電源を持っておらず，ＩＣカード用のリーダライタ（ｃａｒｄ　ｒｅａｄｅｒ）に差し込まれると，電源の供給を受け，動作可能となる。動作可能になると，リーダライタから送信されるコマンドを受信し，そのコマンドに従って，データの転送等の処理を行う。ＩＣカードの一般的な解説は，オーム社出版電子情報通信学会編水沢順一著「ＩＣカード」などにある。
【０００４】
ＩＣカードの構成は，図１に示すように，カード１０１の上に，ＩＣカード用チップ１０２を搭載したものである。図に示すように、一般にＩＣカードは，ＩＳＯ７８１６の規格に定められた位置に供給電圧端子Ｖｃｃ，　グランド端子ＧＮＤ，リセット端子ＲＳＴ，　入出力端子Ｉ／Ｏ，　クロック端子ＣＬＫを持ち，これらの端子を通して，電源の供給を受け、通信を行う（Ｗ．Ｒａｎｋｌ　ａｎｄ　Ｅｆｆｉｎｇ　：　ＳＭＡＲＴＣＡＲＤ　ＨＡＮＤＢＯＯＫ，　Ｊｏｈｎ　Ｗｉｌｅｙ　＆　Ｓｏｎｓ，　１９９７，　ｐ．４１参照）。
【０００５】
ＩＣカード用チップの構成は，基本的には通常のマイクロコンピュータと同じ構成である。その構成は，図２に示すように，中央処理装置（ＣＰＵ）２０１，記憶装置２０４，入出力（Ｉ／Ｏ）ポート２０７，コ・プロセッサ２０２からなる（コ・プロセッサはない場合もある）。ＣＰＵ（２０１）は，論理演算や算術演算などを行う装置であり，記憶装置２０４は，プログラムやデータを格納する装置である。入出力ポートは，リーダライタと通信を行う装置である。コ・プロセッサは，暗号処理そのもの、または、暗号処理に必要な演算を高速に行う装置である。例えば、ＲＳＡ暗号の剰余演算を行う為の特別な演算装置や、ＤＥＳ暗号の処理を行う暗号装置などがある。ＩＣカード用プロセッサの中には，コ・プロセッサを持たないものも多くある。データバス２０３は，各装置を接続するバスである。
【０００６】
記憶装置２０４は，ＲＯＭ（Ｒｅａｄ　Ｏｎｌｙ　Ｍｅｍｏｒｙ）やＲＡＭ（Ｒａｎｄｏｍ　Ａｃｃｅｓｓ　Ｍｅｍｏｒｙ），ＥＥＰＲＯＭ（Ｅｌｅｃｔｒｉｃａｌ　Ｅｒａｓａｂｌｅ　Ｐｒｏｇｒａｍｍａｂｌｅ　Ｒｅａｄ　Ｏｎｌｙ　Ｍｅｍｏｒｙ）などからなる。ＲＯＭは，変更できないメモリであり，主にプログラムを格納するメモリである。ＲＡＭは自由に書き換えができるメモリであるが，電源の供給が中断されると，記憶している内容は消滅する。ＩＣカードがリーダライタから抜かれると電源の供給が中断されるため，ＲＡＭの内容は，保持されなくなる。ＥＥＰＲＯＭは，電源の供給が中断されてもその内容を保持することができるメモリである。書き換える必要があり，ＩＣカードがリーダライタから抜かれても，保持するデータを格納するために使われる。例えば，プリペイドカードの残高などは，使用するたびに書き換えられ，かつリーダライタが抜かれてもデータを保持する必要があるため，ＥＥＰＲＯＭで保持される。
【０００７】
ＩＣカードは，プログラムや重要な情報がＩＣカード用チップの中に密閉されているため，重要な情報を格納したり，カードの中で暗号処理を行うために用いられる。従来、ＩＣカードでの暗号を解読する難しさは，暗号アルゴリズムの解読の難しさと同じであると考えられていた。
【０００８】
しかし，ＩＣカードが暗号処理を行っている時の消費電力を観測し，これを解析することにより，暗号アルゴリズムを直接的に解読するよりも容易に暗号処理の内容や暗号鍵が推定される可能性がある。消費電力は，オシロスコープを用いて、ＩＣカードのＶｃｃ端子とグランド端子の間の電圧変化を測定することによって調べることができる。Ｊｏｈｎ　Ｗｉｌｅｙ　＆　Ｓｏｎｓ社　Ｗ．Ｒａｎｋｌ　＆　Ｗ．Ｅｆｆｉｎｇ著　「Ｓｍａｒｔ　Ｃａｒｄ　Ｈａｎｄｂｏｏｋ」の８．５．１．１　Ｐａｓｓｉｖｅ　ｐｒｏｔｅｃｔｉｖｅ　ｍｅｃｈａｎｉｓｍｓ（ｐ．２６３）にこのような危険性が記載されている。
【０００９】
ＩＣカード用チップを構成しているＣＭＯＳ（相補的ＭＯＳ）トランジスタは，出力状態が１から０あるいは０から１に変わった時に電力を消費する。例えば、ＣＭＯＳインバータは、ＰＭＯＳとＮＭＯＳ及びコンデンサを図４のように接続したものである。４０２がＰＭＯＳ，４０３がＮＭＯＳ、４０５がコンデンサである。ＣＭＯＳインバータは、４０１から印加された電圧がＨｉｇｈ（＝１）のときに４０６にＬｏｗ（＝０）を返し、印加電圧がＬｏｗのときに４０６にＨｉｇｈを返すものである。この際、ドライブ電圧Ｖｄｄ（４０４）が４０２，４０３の導通、非導通に応じて、コンデンサ４０５に対する充電、放電がなされ、これに伴う電力消費が発生する。このときに発生する消費電力の時間変化は、図５の５０１のような波形となる。ＩＣカードの端子を通して観測されるのは、図５のような消費電力波形が、時間遅れを伴って重ね合わされたものである。
【００１０】
特に，データバス２０３においては、バスドライバーの消費電力や，配線及び、配線に接続されているトランジスタの静電容量のため，バスの値が１から０あるいは０から１に変わるときに電力を消費する。そのため，消費電力を観測すれば，ＩＣカード用チップの中で，何が動作しているかが分かる可能性がある。
【００１１】
図３は，ＩＣカード用チップの１サイクルでの消費電力の波形を示したものである。処理しているデータに依存して，消費電力波形が３０１や３０２のように異なる。このような差は，バス２０３を流れるデータや中央演算装置２０１で処理しているデータに依存して生じる。
【００１２】
コ・プロセッサ２０２は，ＣＰＵと並列に，例えば，５１２ビットの剰余演算を行うことができる。そのため，ＣＰＵの消費電力とは異なった消費電力波形の長時間の観測が可能である。その特徴的な波形を観測することにより，コ・プロセッサの動作回数を容易に測定することができる。コ・プロセッサの動作回数が暗号鍵と何らかの関係があるならば，コ・プロセッサの動作回数から暗号鍵を推定できる可能性がある。
【００１３】
また，コ・プロセッサでの演算内容に，暗号鍵に依存した偏りがあると，その偏りが消費電力から求められ，暗号鍵が推定される可能性がある。ＣＰＵでも同様の事情が存在する。
【００１４】
消費電力がデータに依存する典型的な例は、アドレスバスで消費される電力である。アドレスバスは、常に動作していなければならないので、その制御は、スタティック方式である。スタティック方式では、データを毎回クリアすることなく、直前の値と現在の値との変化分の電力が消費される。従って、例えば、アドレス（プログラムカウンタ）が、２ビット毎に、
８００Ｃ　→　８００Ｅ　→　８０１０　→　８０１２　→　８０１４　→　８０１６　→　８０１８
と変化したとすると、それぞれ
８００Ｃ　→　８００Ｅの変化ビット数＝１
８００Ｅ　→　８０１０の変化ビット数＝４
８０１０　→　８０１２の変化ビット数＝１
８０１２　→　８０１４の変化ビット数＝２
８０１４　→　８０１６の変化ビット数＝１
８０１６　→　８０１８の変化ビット数＝３
にほぼ比例した電力が消費される。ここで、アドレスの値は１６進数で表記した（以下、特に断らない限り、アドレスは１６進数で表記するものとする）。
【００１５】
この性質を利用すると、ＩＣチップを開封することなく、消費電力の変化を調べることによって、内部情報を不正に取り出すことができる。このような方法は、電力解析（Ｐｏｗｅｒ　Ａｎａｌｙｓｉｓ）と呼ばれている。
【００１６】
以下、典型的な例として、アドレスの変化を調べることによりＲＳＡ暗号の秘密指数（ｓｅｃｒｅｔ　ｅｘｐｏｎｅｎｔ）を取り出す方法を述べる。電力解析による内部秘密情報を取り出す方法は既に多くの文献に見られるが、ここでは、電力解析の有効性を最初に指摘した論文：
Ｐａｕｌ　Ｋｏｃｈｅｒ，　Ｊｏｓｈｕａ　Ｊａｆｆｅ，　ａｎｄ　Ｂｅｎｊａｍｉｎ　Ｊｕｎ，　Ｄｉｆｆｅｒｅｎｔｉａｌ　Ｐｏｗｅｒ　Ａｎａｌｙｓｉｓ：　Ｌｅａｋｉｎｇ　Ｓｅｃｒｅｔｓ．　Ａｄｖａｎｃｅｓ　ｉｎ　Ｃｒｙｐｔｏｌｏｇｙ　　Ｐｒｏｃｅｅｄｉｎｇｓ　ｏｆ　Ｃｒｙｐｔｏ’９９，　Ｓｐｒｉｎｇｅｒ−Ｖｅｒｌａｇ，　Ｌｅｃｔｕｒｅ　Ｎｏｔｅｓ　ｉｎ　Ｃｏｍｐｕｔｅｒ　Ｓｃｉｅｎｃｅ　１６６６，　ｐｐ．　３８８−３９７．（同様の内容を持つものがＵＲＬ：
ｈｔｔｐ：／／ｗｗｗ．ｃｒｙｐｔｏｇｒａｐｈｙ．ｃｏｍ／ｄｐａ／ｔｅｃｈｎｉｃａｌ／ｉｎｄｅｘ．ｈｔｍｌ
にある。）の内容の一部を敷延して説明する。上記の文献は、電流解析の原理を示したものであり、以下に示す解析手法を直接扱ってはいない。
【００１７】
まず、説明のために、簡単にＲＳＡ暗号、アディション・チェイン方式、マイクロコンピュータの動作とプログラムカウンタについて説明する。
（ＲＳＡ暗号）
ＲＳＡ暗号では、非常に大きな素数、例えば５１２ビットの２つの素数Ｐ，Ｑの積　Ｎ　＝　ＰＱ　と　Ｎと互いに素な数　Ｅをとり、このＮとＥをこれを公開鍵として公開鍵簿に登録する。このとき、この公開鍵の持ち主Ａに送信者Ｂは、１以上Ｎ−１以下の数で表現されたデータ（平文）　Ｒ　を、
Ｙ　＝　Ｒ＾Ｅ　ｍｏｄ　Ｎ
として暗号化して送信する。ここで、Ｙ＾ＥはＹのＥ乗を表す記号とする。この暗号文　Ｒ　を受け取ったＡは、ＸＥ　ｍｏｄ　（Ｐ−１）（Ｑ−１）　＝　１となる秘密鍵　Ｘ　を用いて
Ｙ＾Ｘ　ｍｏｄ　Ｎ
を計算する。ここで、（Ｐ−１）（Ｑ−１）は、Ｎのオイラー関数の値φ（Ｎ）である。これは、Ｎと互いに素な自然数の個数に等しい。オイラーの定理によれば、
Ｒ＾（（Ｐ−１）（Ｑ−１））　ｍｏｄ　Ｎ　＝　１
が成り立ち、一方で、ＸＥ　＝　１　＋　ｋ（Ｐ−１）（Ｑ−１）（ｋは、ある整数）が成り立つので、
Ｙ＾Ｘ　ｍｏｄ　Ｎ
＝　Ｒ＾（ＸＥ）　ｍｏｄ　Ｎ
＝　Ｒ＾（１＋ｋ（Ｐ−１）（Ｑ−１））　ｍｏｄ　Ｎ
＝　Ｒ＊Ｒ＾（ｋ（Ｐ−１）（Ｑ−１））　ｍｏｄ　Ｎ
＝　Ｒ
が成り立つ。従って、Ｒ＾Ｘ　ｍｏｄ　Ｎを計算することで、Ａは、送信者Ｂの平文　Ｒ　を復号することができる。この際、秘密鍵　Ｘ　を計算するのに、Ｎの素因数　Ｐ，Ｑが用いられており、現在のところ、素因数分解を介さないで、Ｘを計算する方法は知られておらず、大きな素数の積を因数分解することは、現実的でない時間が必要であるので、Ｎを公開しても、Ａの秘密鍵は安全である。
（アディション・チェイン方式（ａｄｄｉｔｉｏｎ　ｃｈａｉｎ　ｍｅｔｈｏｄ））
ＲＳＡ暗号の計算の本体は、べき乗剰余計算であるが、これは、一般に、剰余乗算の組み合せで実行される。今、Ａレジスタ，Ｂレジスタ，Ｎレジスタを持ち、これに対して、Ａ＾２　ｍｏｄ　Ｎ又はＡ＊Ｂ　ｍｏｄ　Ｎを計算して、再びＡレジスタに戻すコプロセッサを持つマイクロコンピュータを考える（これはＩＣカードでは標準的な仕様である）。このようなマイクロコンピュータにおいて、べき乗剰余計算を行う為に広く用いられているのが、以下の［アルゴリズム１］に示すアディション・チェイン方式（ａｄｄｉｔｉｏｎ　ｃｈａｉｎ　ｍｅｔｈｏｄ）である。
2004126841.tif 000003
このアルゴリズムにおいては、ｎは、Ｘのビット長に対応され、（Ｘ［ｎ−１］Ｘ［ｎ−２］．．．Ｘ［１］Ｘ［０］）は、Ｘの二進数表現である。本アルゴリズムは、概略的には、二乗の剰余乗算「Ａ＾２　ｍｏｄ　Ｎ」（ステップ４）及び、剰余乗算「Ａ　＝　Ａ＊Ｂ　ｍｏｄ　Ｎ」（ステップ５）を組み合せて実行され、Ｘ［ｎ−１］，　Ｘ［ｎ−２］，　．．．，　Ｘ［１］，　Ｘ［０］における１の個数をＨ（Ｘ）とすると、二乗の剰余乗算「Ａ＾２　ｍｏｄ　Ｎ」にｎ回、剰余乗算「Ａ　＝　Ａ＊Ｂ　ｍｏｄ　Ｎ」にＨ（Ｘ）回の演算が繰り返し行われることになる。
【００１８】
上記のアルゴリズム１で、正しい結果が得られることを数値例で確認しておく。
アルゴリズムの確認の意味では、指数Ｘを具体化すれば十分であるので、Ｙ及びＮは、記号のまま用いることにする。
Ｓ　＝　Ｙ＾４５　ｍｏｄ　Ｎ
をアルゴリズム１に従って計算する。ここで、指数４５は、二進数では、
４５　＝　１０１１０１（二進数）
と書くことができる。従って、アルゴリズム１の記号を用いて指数を表現すると、
Ｘ［５］　＝　１，　Ｘ［４］　＝　０，　Ｘ［３］　＝　１，　Ｘ［２］　＝　１，　Ｘ［１］　＝　０，　Ｘ［０］　＝　１
となる。ビット数ｎは６である。Ｓの初期値は１である。
（１）　ｊ＝５のとき
Ｓの初期値は１であるから、これを二乗しＮで割った剰余を取っても、１である（ステップ４）。
【００１９】
Ｘ［５］　＝　１であるから、ステップ５が実行され、
2004126841.tif 000004
が得られる。
（２）　ｊ＝４のとき
このときのＳの値は、最初Ｓ　＝　Ｙ　ｍｏｄ　Ｎであるから、これを二乗してＮで割った剰余を取ると、Ｓ　＝　Ｙ＾２　ｍｏｄ　Ｎとなる。
【００２０】
Ｘ［４］　＝　０であるから、ステップ５は実行されず、Ｓ　＝　Ｙ＾２　ｍｏｄ　Ｎのままである。
（３）　ｊ＝３のとき
このときのＳの値は、最初Ｓ　＝　Ｙ＾２　ｍｏｄ　Ｎであるから、これを二乗してＮで割った剰余を取ると、Ｓ　＝　Ｙ＾４　ｍｏｄ　Ｎとなる。
【００２１】
Ｘ［３］　＝　１であるから、ステップ５が実行され、
Ｓ　＝　Ｙ＾４＊Ｙ　ｍｏｄ　Ｎ　＝　Ｙ＾５　ｍｏｄ　Ｎ
となる。
（４）　ｊ＝２のとき
このときのＳの値は、最初Ｓ　＝　Ｙ＾５　ｍｏｄ　Ｎであるから、これを二乗してＮで割った剰余を取ると、Ｓ　＝　Ｙ＾１０　ｍｏｄ　Ｎとなる。
【００２２】
Ｘ［２］　＝　１であるから、ステップ５が実行され、
Ｓ　＝　Ｙ＾１０＊Ｙ　ｍｏｄ　Ｎ　＝　Ｙ＾１１　ｍｏｄ　Ｎ
となる。
（５）　ｊ＝１のとき
このときのＳの値は、最初Ｓ　＝　Ｙ＾１１　ｍｏｄ　Ｎであるから、これを二乗してＮで割った剰余を取ると、Ｓ　＝　Ｙ＾２２　ｍｏｄ　Ｎとなる。
【００２３】
Ｘ［１］　＝　０であるから、ステップ５は実行されず、Ｓ　＝　Ｙ＾２２　ｍｏｄ　Ｎのままである。
（６）　ｊ＝０のとき
このときのＳの値は、最初Ｓ＝Ｙ＾２２　ｍｏｄ　Ｎであるから、これを二乗してＮで割った剰余を取ると、Ｓ　＝　Ｙ＾４４　ｍｏｄ　Ｎとなる。
【００２４】
Ｘ［０］　＝　１であるから、ステップ５が実行され、
Ｓ　＝　Ｙ＾４４＊Ｙ　ｍｏｄ　Ｎ　＝　Ｙ＾４５　ｍｏｄ　Ｎ
となり、所望の結果が得られる。
【００２５】
アルゴリズム１は、指数１ビット毎に処理を実行しているが、複数のビットをまとめて処理することもできる。例えば、２ビットを処理単位とするアディション・チェイン方式によるべき乗剰余計算を行う場合、以下の手順［アルゴリズム２］に従って各処理を実行する。以下、Ｘのデータ長をｎビットとし、Ｘ［ｊ］（ｊ＝０，１，２，．．．，ｎ／２−１）は、その２ビットブロックであるものとする。
2004126841.tif 000005
上記［アルゴリズム２］で実際にべき乗剰余計算ができることは、［アルゴリズム１］の正当性と同様に確かめることができる。
（マイクロコンピュータの動作とプログラムカウンタ）
マイクロコンピュータには、プログラム又はデータを読む位置（アドレス）を指定する為のカウンタ（プログラムカウンタ）が内蔵されている。マイクロコンピュータは、プログラムカウンタの指定するアドレスに格納されているビット情報を読み出す。ビット情報は、オペコード（ｏｐｃｏｄｅ）と、オペランド（ｏｐｅｒａｎｄ）に分類することができる。オペコードは、マイクロコンピュータがどのようにデータを演算すればいいかを指定したものであり、オペランドは、演算対象のデータや、レジスタを指定したものである。ここで、レジスタとは、物理的にはＲＡＭと同じものであるが、ＣＰＵに含まれており、ＣＰＵ内の論理（又は算術）演算器とのデータのやりとりを行うものである。
【００２６】
今、上記の各種概念を説明するために、８ビットのマイクロコンピュータを想定し、簡単な命令列を考える。
［コード例１］
８０００　ＭＯＶ．Ｂ　Ｃ３，　Ｒ２Ｈ　　　　　ステップ１
８００２　ＭＯＶ．Ｂ　Ｆ２，　Ｒ４Ｈ　　　　　ステップ２
８００４　ＸＯＲ　Ｒ２Ｈ，　Ｒ４Ｈ　　　　　　ステップ３
上記の［コード例１］における８０００，　８００２，　８００４は、命令の位置を示すアドレスを１６進数で示したものである。コード例１を実行する際のマイクロコンピュータの動作を説明する。マイクロコンピュータは、まず、プログラムカウンタを８０００に設定し、オペコードであるＭＯＶ．Ｂ、オペランドであるデータＣ３と、レジスタＲ２Ｈを読み取り、データＣ３をレジスタＲ２Ｈに転送する（ステップ１）。次に、マイクロコンピュータは、プログラムカウンタを２だけ進め、８００２とし、ステップ２に進む。ステップ２では、データＦ２をレジスタＲ４Ｈに転送する。この処理が終わると、プログラムカウンタをさらに２進め、８００４とする。ステップ３では、レジスタＲ２Ｈに格納されているデータＣ３と、レジスタＲ４Ｈに格納されているデータＦ２の排他的論理和（ｅｘｃｌｕｓｉｖｅ　ＯＲ）　Ｃ３　ＥＸＯＲ　Ｆ２（＝１１００００１１　ＥＸＯＲ　１１１１００１０）を実行し、その結果００１１０００１をレジスタＲ４Ｈに格納する。
【００２７】
より複雑な、もう一つのコード例を挙げる。ここでの記号の意味は、「発明の詳細な説明」において詳細に説明する。ここでは、動作の意味のみ説明する。
［コード例２］
８１００　ＭＯＶ．Ｗ　＃Ｙｊ＿ＴＯＰ　，　Ｒ１　　　　ステップ１
８１０２　ＭＯＶ．Ｗ　＃Ｂ＿ＴＯＰ　，　Ｒ２　　　　　ステップ２
８１０４　ＭＯＶ．Ｂ　＃ＤＡＴＡ＿ＬＥＮＧＴＨ　，　Ｒ３Ｈ　　　　　　ステップ３
８１０６　ｌｏｏｐ：　ＭＯＶ．Ｗ　＠Ｒ１　，　Ｒ４　　ステップ４
８１０８　ＭＯＶ．Ｗ　Ｒ４　，　＠Ｒ２　　　　　　ステップ５
８１０Ａ　ＡＤＤＳ　＃２　，　Ｒ１　　　　　　　　　　ステップ６
８１０Ｃ　ＡＤＤＳ　＃２　，　Ｒ２　　　　　　　　　　ステップ７
８１１０　ＤＥＣ．Ｂ　Ｒ３Ｈ　　　　　　　　　　　　　ステップ８
８１１２　ＢＮＥ　　ｌｏｏｐ　　　　　　　　　　　　　ステップ９
コード例２は、ＤＡＴＡ＿ＬＥＮＧＴＨで指定された長さ（ワードサイズ）を持ったＹｊをコプロセッサのＢレジスタに転送するプログラムである。ここで、Ｙｊ＿ＴＯＰは、データＹｊの格納されているアドレスの先頭位置、Ｂ＿ＴＯＰは、Ｂレジスタのアドレスの先頭位置である。コード例２におけるＹｊはＲＡＭ上に配置されている。ステップ１によって、Ｙｊの先頭アドレスをレジスタＲ１に転送し、さらに、ステップ２の命令によって、Ｂレジスタの先頭アドレスをＲ２に転送する。ステップ３で、データのワードサイズＤＡＴＡ＿ＬＥＮＧＴＨをレジスタＲ３Ｈに転送する。ステップ４からステップ９までの命令は、ＤＡＴＡ＿ＬＥＮＧＴＨ回ループして繰り返し実行される。ステップ４で、レジスタＲ１が指し示すアドレスのデータをレジスタＲ４に転送し、ステップ５の命令で当該データをレジスタＲ２が指し示すアドレスに転送する。ステップ６，７では、Ｒ１，Ｒ２のそれぞれに２を加える。これは、それぞれのアドレスを２進めることを意味している。ステップ８は、カウンタＲ３Ｈをデクリメントするものである。ステップ９は、カウンタの値が０であるか否かに応じて条件分岐するものである。０でなければ、ラベルｌｏｏｐの指し示すアドレス８１０６（ステップ４）にプログラムカウンタを戻し、ループを継続する。このプログラムは、ＲＳＡ暗号の処理を［アルゴリズム１］に従って実行する際に必要となるものである。
【００２８】
このとき、Ｙｊは、Ｙ０，　Ｙ１，　Ｙ２，　Ｙ３の４種類である。Ｙ０，　Ｙ１，　Ｙ２，　Ｙ３は、それぞれＲＡＭ上の異なる位置に置かれている。今、最も極端な場合を考える。仮に、ＤＡＴＡ＿ＬＥＮＧＴＨが、６４（１２８バイト＝１０２４ビット）であるものとし、Ｙ０の先頭アドレスが、００００，　Ｙ１の先頭アドレスが、００８０，　Ｙ２の先頭アドレスが、０１００，　Ｙ３の先頭アドレスが、５１８０であるものとする（このアドレス設定は説明の為の便宜でこのように設定したもので、実際にデータを配置する場合は、連続したアドレスに配置することが多い）。
【００２９】
このとき、アドレス８００６の命令ＭＯＶ．Ｗ　＠Ｒ０　，　Ｒ４において、プログラムカウンタは、データが、Ｙ０，　Ｙ１，　Ｙ２，　Ｙ３のどれであるかに応じて以下のように変化する。
Ｙ０のとき　８１０６　から　００００（反転ビット数４）
Ｙ１のとき　８１０６　から　００８０（反転ビット数５）
Ｙ２のとき　８１０６　から　０１００（反転ビット数３）
Ｙ３のとき　８１０６　から　５１８０（反転ビット数６）
既に述べたように、反転ビット数（ハミングウエイト）に応じて電力が消費されるため、上記の転送時に、データが、Ｙ０，　Ｙ１，　Ｙ２，　Ｙ３の区別ができる。（さらに、ループが繰り返されると，その度に、８１０６からのハミング距離に比例した電力波形が観測される。例えば、Ｙ０の転送においては、Ｈａｍ（８１０６，　００００），　Ｈａｍ（８１０６，０００２），　Ｈａｍ（８１０６，　０００４），　．．．　，　Ｈａｍ（８１０６，　００７Ｅ）に比例した電力が観測される。）
すると、転送データに応じて、ＲＳＡ暗号処理における指数Ｘの各２ビットに対して４種類のラベルをつけていくことができる。これを簡単のためＤＡ、ＤＢ，ＤＣ，ＤＤと書くことにすると、例えば、実際の指数Ｘの列の一部が、１０　１１　０１　００　１１　０１　１０　１０という並びであった場合、消費電力の観測から、ＤＡ，　ＤＢ，　ＤＣ，　ＤＤ，　ＤＢ，　ＤＣ，　ＤＡ，　ＤＡというラベル列が得られる。それぞれは、００，　０１，　１０，　１１のいずれかに対応するので、この順列（ｐｅｒｍｕｔａｔｉｏｎ）の数は、４の階乗（ｆａｃｔｏｒｉａｌ）＝２４通りしかないため、容易に正しいビット列を見出すことができる。これは、任意の長さの指数Ｘに対して適用可能である。
この例は、意識的にハミングウエイトが異なるように配置したものであるので、実際の配置、例えば、Ｙ３の先頭アドレスを０１８０とした場合は、Ｙ０とＹ３の区別ができなくなる。しかし、場合の数を大幅に減少させることができるため、正しい指数Ｘを求める計算時間を大幅に減らすことができる。以上がアドレスの変化電流を利用して秘密指数を見出す典型的な方法の一つである。この原理が、ＲＳＡ暗号以外の暗号系、例えば、楕円曲線暗号のような公開鍵暗号に対しても有効であることは言うまでもない。ＤＥＳ（Ｄａｔａ　Ｅｎｃｒｙｐｔｉｏｎ　Ｓｔａｎｄａｒｄ）のような秘密鍵暗号におけるＳＢＯＸ処理のアドレス変化を調べるなどの方法で秘密鍵を取り出せる可能性もある。
【００３０】
【発明が解決しようとしている課題】
本発明の課題は，「従来の技術」において示したアドレスの変化に伴う消費電力の差を逓減することにより、ＩＣチップ内の秘密情報を守ることである。
【００３１】
【課題を解決するための手段】
既に述べたように、アドレスバスの制御によって生ずる電流は、プログラムカウンタの変化に伴うアドレスビットの反転数（ハミング距離）に比例し、これを観測することによって、ＩＣチップ内の秘密データを知ることができる場合がある。
【００３２】
逆に、データのハミング距離が同一であるように変化する場合は、たとえアドレス自体が異なっても、同じ電力が消費される。例えば、ｂ９０ｃから開始されるサブルーチンと、開始アドレスがｂａ０ｃであるが、他が同一のプログラムを考える。簡単のため、プログラムカウンタは２ずつインクリメントされるものとすると、両者のプログラムカウンタの変化は、
ｂ９０ｃ　→　ｂ９０ｅ　→　ｂ９１０　→　ｂ９１２　→　ｂ９１４　→　ｂ９１６
ｂａ０ｃ　→　ｂａ０ｅ　→　ｂａ１０　→　ｂａ１２　→　ｂａ１４　→　ｂａ１６
のようになる。この際消費される電力は、それぞれの変化におけるビット反転数に比例するので、共に全く同一のハミング距離：
１　　　４　　　１　　　２　　　１
に比例した電力波形が観測される。従って、アドレスという面からは、両者を消費電力から区別することはできない。
【００３３】
これを応用すれば、暗号等の秘密鍵と対応するアドレス変化に伴う消費電力が外部に漏洩するのを防ぐことができる。すなわち、本発明における問題解決の第一の方法は、プログラムカウンタの変化を均一化することである。
【００３４】
第二の方法は、同一のデータにアクセスする際のプログラムカウンタの変化を処理毎に変更することである。これは上記の「変化の均一化」とは反対の考え方に基づいている。
【００３５】
第一の方法及び第二の方法の実装方式は、プログラムの構造に依存するため、種々の構造に応じて変える必要がある。
【００３６】
第一の方法のうち典型的なものは、アドレスの値がＰＣＳである位置に配置された転送命令又は条件分岐又は無条件分岐命令が実行された直後にアクセスされるデータ又はサブルーチンを、Ｈａｍ（ＰＣＳ，　ＰＣＤ［１］）＝　Ｈａｍ（ＰＣＳ，　ＰＣＤ［２］）＝．．．＝　Ｈａｍ（ＰＣＳ，　ＰＣＤ［ｍ］）となるようなアドレスＰＣＤ［１］，　ＰＣＤ［２］，　．．．，　ＰＣＤ［ｍ］で開始される位置に配置することである。このようにデータ及びプログラムを配置することによって、アドレスのハミング距離の違いによって生ずる電力消費の違いが逓減される。実際にこのような配置が可能であること、及び、プログラムの詳細については、次節の「発明の実施形態」において詳しく説明する。
【００３７】
第二の方法のうち典型的なものは、アドレスの値がＰＣＳである位置に配置された転送命令又は条件分岐又は無条件分岐命令が実行された直後にアクセスされるデータ又はサブルーチンを、Ｈａｍ（ＰＣＳ［１］，　ＰＣＤ）＝　Ｈａｍ（ＰＣＳ［２］，　ＰＣＤ）＝．．．＝　Ｈａｍ（ＰＣＳ［ｍ］，　ＰＣＤ）となるようなアドレスＰＣＳ［１］，　ＰＣＳ［２］，　．．．，　ＰＣＳ［ｍ］で開始される位置に配置し、さらに、各ＰＣＳ［ｊ］（ｊ＝１，２，３，．．．，ｍ）に配置されたｍ個の命令の実行順序を予測できない（ｕｎｐｒｅｄｉｃｔａｂｌｅ）情報源によってプログラムの実行毎に毎回変化させることである。実際にこのような配置が可能であること、及び、プログラムの詳細については、次節の「発明の実施形態」において詳しく説明する。ここで、予測できない情報源とは、具体的には、種々の乱数発生装置や、非公開情報を数学的演算によって加工することによって生成される疑似乱数（ｐｓｅｕｄｏ　ｒａｎｄｏｍｎｕｍｂｅｒ）等を想定している。
【００３８】
乱数発生装置のうち典型的なものは、抵抗等の熱雑音をアンプ（ａｍｐｌｉｆｉｅｒ）で増幅し、これを適当な閾値電圧（ｔｈｒｅｓｈｏｌｄ　ｖｏｌｔａｇｅ）で０／１信号に変換することによって、自然界の予測不能なゆらぎ（ｆｌｕｃｔｕａｔｉｏｎ）を０／１ビット列に変換するものである。現在、熱雑音による抵抗値の変化を正しく予測する方法は知られていないため、発生する０／１ビット列もまた、予測できない。
【００３９】
疑似乱数の作り方には種々のものがあるが、例えば、ＩＣチップ内にｎビットの長さを持つ二つの秘密の数をそれぞれ，　ａ，Ｘ［０］とし、この値から，関係式：
Ｘ［ｊ］　＝　ａ＊Ｘ［ｊ−１］　ｍｏｄ　２＾ｎ　（式１）
を用いて帰納的（ｉｎｄｕｃｔｉｖｅ）に，　Ｘ［０］，　Ｘ［１］，　Ｘ［２］，　．．．を定義する方法が知られている。例えば、ａ　＝　２１００００５３４１，　ｎ　＝　３２とし、Ｘ［０］を０でない数に選べば、統計的性質のよい疑似乱数が生成できることが知られている（このような方法に関する詳細については、例えば、伏見正則「乱数」東京大学出版会，　１９８９年に記載されている）。
【００４０】
また、両者を組み合せて用いることもできる。例えば、上述の例で、初期値Ｘ［０］のみ抵抗の熱雑音を利用した乱数生成装置によって生成し、以後は、（式１）を利用してビット列を作ってもよい。
【００４１】
多くのＩＣカード用ＩＣチップは、何らかの乱数生成装置を内蔵しており、これを利用することができる。
【００４２】
【発明の実施の形態】
以下、簡単のため、日立製作所製ＡＥマイコン（旧Ｈ８マイコン）のアセンブラ言語の形式に従った。（日立製作所製Ｈ８マイコンに関する一般的解説は、例えば、藤沢幸穂著「Ｈ８マイコン完全マニュアル」（オーム社）等にある。）これは便宜的なものであり、発明の本質とは無関係であることはいうまでもない。又、アドレス空間は、１６進数表示で００００から８０００までがＲＯＭ（ＥＥＰＲＯＭやＦＲＡＭでもよい）で、８０００からＦＦＦＦまでがＲＡＭであるものとする。又、ＣＰＵは８ビット単位で処理を行うもので、そのレジスタは、Ｒ０Ｈ，　Ｒ０Ｌ（それぞれＲ０レジスタの上位８ビットと下位８ビットで、１６ビット全体をまとめてＲ０とする）から、Ｒ７Ｈ，　Ｒ７Ｌまでであるものとする。
【００４３】
以下、Ｈ８マイコンの簡単な命令語について説明を行う。
【００４４】
アセンブラ言語において中核をなす命令は転送命令である。転送命令は、１バイト（８ビット）データの転送を行うＭＯＶ．Ｂと２バイトデータの転送を行うＭＯＶ．Ｗとに分けることができる。例えば、以下のような転送命令が重要である。
（Ａ）　ＭＯＶ．Ｂ（Ｗ）　＃（８ビット又は１６ビットの値），　レジスタ名
これはイミディエート転送と呼ばれる転送命令で、括弧内の８ビット（又は１６ビット）の値をレジスタ名で指定されたレジスタに転送する。例えば、
ＭＯＶ．Ｂ　＃Ｆ９，　Ｒ２Ｈ
は、データＦ９をレジスタＲ２Ｈに転送するものである。
（Ｂ）　ＭＯＶ．Ｂ（Ｗ）　＠（レジスタ名１），レジスタ名２
これは、レジスタ名１で示されるレジスタに格納されているアドレスが指定する位置のデータをレジスタ名２で示されるレジスタに転送するものである。
例えば、
ＭＯＶ．Ｂ（Ｗ）　＠Ｒ２　，　Ｒ４
は、レジスタＲ２が指し示したアドレスに格納されているデータ（２バイト）をレジスタＲ４に転送するものである。
（Ｃ）　ＭＯＶ．Ｂ（Ｗ）　レジスタ名１　，　＠（レジスタ名２）
これは、レジスタ名１で指定されたレジスタ内のデータをレジスタ名２に格納されているアドレス位置に転送するものである。
例えば、
ＭＯＶ．Ｂ（Ｗ）　Ｒ４　，　＠Ｒ１
は、レジスタＲ４に格納されているデータを、レジスタＲ１が示しているアドレスに転送するものである。
（Ｄ）　ＭＯＶ．Ｂ（Ｗ）　＠（ラベル名（アドレス），レジスタ名１），　レジスタ名２
これは、ラベル名で示されたアドレスにレジスタ名１で指定されるレジスタに格納されている値を加えたアドレス位置に含まれるデータを、レジスタ名２で指定されたレジスタに転送するものである。レジスタ名１で指定されるレジスタに格納されている値は、変位（ｄｉｓｐｌａｃｅｍｅｎｔ）と呼ばれることがある。
【００４５】
Ｈ８マイコンには、上記（Ａ），（Ｂ），（Ｃ），（Ｄ）の他にも種々のアドレス指定方法（アドレッシングモード）があるが、ここでは、説明に必要ないので省略する。
【００４６】
転送命令の他、レジスタ間で種々の論理演算を行うことができる。例えば、
ＡＤＤ．Ｂ　Ｒ２Ｈ，　Ｒ４Ｈ
は、レジスタＲ２Ｈに格納されている値とレジスタＲ４Ｈに格納されている値を加えて、結果をＲ４Ｈに書き込むものである。この他にＳＵＢ（減算），ＸＯＲ（排他的論理和），ＡＮＤ（論理積）等の演算命令がある。
【００４７】
又、１だけ減算するための命令ＢＮＥや、アドレスのインクリメント／デクリメント用の命令ＡＤＤＳ，　ＳＵＢＳも頻繁に利用される。
【００４８】
この他、条件分岐命令が重要である。条件分岐命令は、直前に実行したオペレーションの結果を示す各種のフラグの値に応じてプログラムカウンタを変化させる命令である。マイコンにはコンディションコードレジスタ（ＣＣＲ）と呼ばれる各種フラグを格納するレジスタがある。ＣＣＲのフラグには種々のものがあるが、ここでは簡単のため、Ｚ（ゼロフラグ）及びＣ（キャリーフラグ）についてのみ説明する。ゼロフラグは、直前のオペレーションの結果が０であった場合は１、０でなかった場合は０となるものである。Ｚの変化に対応する条件分岐命令として、ＢＥＱとＢＮＥがある。ＢＥＱは、Ｚが０のときに指定されたアドレスにジャンプする命令であり、ＢＮＥは、Ｚが０でないときにジャンプする命令である。例えば、
ＸＯＲ　Ｒ２Ｈ，　Ｒ２Ｌ
ＢＥＱ　１ｓｔ　ａｄｄｒｅｓｓ
ＢＮＥ　２ｎｄ　ａｄｄｒｅｓｓ
というプログラムは、レジスタＲ２ＨとＲ２Ｌに含まれる値が一致したときには、第一のアドレスにプログラムカウンタの値を変更し、一致しなかった場合は、第二のアドレスにプログラムカウンタの値を変更する。
【００４９】
キャリーフラグＣは、直前のオペレーションの結果、桁上がりが生じた場合は１、０でなかった場合は０となるものである。Ｃの変化に対応する条件分岐命令として、ＢＣＳとＢＣＣがある。ＢＣＳはＣ＝１の時に該当アドレスにジャンプし、ＢＣＣはＣ＝０のときに指定されたアドレスにジャンプする命令である。
【００５０】
プログラムカウンタを変更する命令には、変更をＣＣＲの値によらず、無条件に行うものもある。
【００５１】
例えば、ジャンプ命令：
ＪＭＰ　＠Ｒ１
は、プログラムカウンタをレジスタＲ１が指定する値に変更する。
【００５２】
同じく、サブルーチンへのジャンプを行う命令：
ＪＳＲ　ｓｕｂｒｏｕｔｉｎｅ
は、プログラムカウンタをｓｕｂｒｏｕｔｉｎｅで指定されたアドレスに強制的に変更する。但し、ＪＳＲはＪＭＰとは異なり、ジャンプ先のサブルーチン
2004126841.tif 000006
において、命令１−命令Ｘまでを実行し、最後にＲＴＳ（Ｒｅｔｕｒｎ　ｆｒｏｍ　Ｓｕｂｒｏｕｔｉｎｅ）命令によって、ＪＳＲ命令の直後のアドレス位置へプログラムカウンタを変更する。
【００５３】
上記の他、カウンタのデクリメントに用いるＤＥＣ命令や、アドレス変更のために用いられるＡＤＤＳ命令などがある。例えば、
ＤＥＣ　Ｒ３Ｈ
は、レジスタＲ３Ｈの値を１だけ減らす命令であり、
ＡＤＤＳ　＃２，　Ｒ２
は、Ｒ２に２を加える命令である。
【００５４】
以上で、Ｈ８／３００アセンブラ言語の説明を終わる。
【００５５】
以下で本発明の実施例を詳細に説明する。記述はこれまでに倣い、日立製作所製Ｈ８マイコンのＨ８／３００アセンブラを用いて行う。
【００５６】
今、２ビットのデータｄが、’００’，’０１’，　’１０’，　’１１’である場合に、それぞれ、データＹ０，　Ｙ１，　Ｙ２，　Ｙ３をあるコプロセッサのデータレジスタＣＤＢに転送するプログラムを考える。Ｙ０，　Ｙ１，　Ｙ２，　Ｙ３は、同一の長さＤＡＴＡ＿ＬＥＮＧＴＨを持つデータであり、あらかじめＲＡＭの所定の位置に格納されているものとする。各データの先頭アドレスは、それぞれ、Ｙ０＿ＴＯＰ，　Ｙ１＿　ＴＯＰ，　Ｙ２＿　ＴＯＰ，　Ｙ３＿　ＴＯＰであるものとする。又、ＣＤＢの先頭アドレスをＣＤＢ＿ＴＯＰとする。
【００５７】
さらに、
Ｈａｍ（Ｃｏｐｙ，Ｙ０＿ＴＯＰ）
＝Ｈａｍ（Ｃｏｐｙ，Ｙ１＿ＴＯＰ）
＝Ｈａｍ（Ｃｏｐｙ，Ｙ２＿ＴＯＰ）
＝Ｈａｍ（Ｃｏｐｙ，Ｙ３＿ＴＯＰ）
（条件１）
を満たすように定める。例えば、ＤＡＴＡ＿ＬＥＮＧＴＨ＝１０２４／１６＝６４，　Ｃｏｐｙ＝０１００，Ｙ０＿ＴＯＰ＝Ｃ２００，　Ｙ１＿ＴＯＰ＝Ｃ４００，　Ｙ０＿ＴＯＰ＝Ｃ７００，　Ｙ０＿ＴＯＰ＝Ｃ８００と定めれば、
Ｈａｍ（Ｃｏｐｙ，Ｙ０＿ＴＯＰ）＝Ｈａｍ（０１００，Ｃ２００）＝４
Ｈａｍ（Ｃｏｐｙ，Ｙ１＿ＴＯＰ）＝Ｈａｍ（０１００，Ｃ４００）＝４
Ｈａｍ（Ｃｏｐｙ，Ｙ２＿ＴＯＰ）＝Ｈａｍ（０１００，Ｃ７００）＝４
Ｈａｍ（Ｃｏｐｙ，Ｙ３＿ＴＯＰ）＝Ｈａｍ（０１００，Ｃ８００）＝４
となり、かつ各データは重複なくＲＡＭ上に配置され、ワード転送の各段階で（条件１）が満足される。
【００５８】
以下に示すプログラムは、３つの部分から構成されている。第一はＭＡＩＮを先頭アドレス（ラベル）とする主要部、第二は、Ｃｏｐｙを先頭アドレスとする転送サブルーチン、第三が、ｔａｂｌｅを先頭アドレスとするデータ部である。プログラム実行においては、最初に、プログラムカウンタの値をＭＡＩＮとしておく。
2004126841.tif 000007
このプログラムの動作を、上記［実施例１］及び図６に基づいて説明する。
【００５９】
プログラム及びデータの位置付けは、図６に示されている。ＣＤＢはＲＡＭの一部として機能するものとする。
【００６０】
最初、プログラムカウンタはＭＡＩＮ＝００００を指しているので、マイクロコンピュータは、ＭＯＶ．Ｗ　＠ｄ，　Ｒ２から順に命令を実行する。
【００６１】
００００では、２ビットのｄを該当アドレスから読み出し、これをレジスタＲ２に格納する。０００２では、レジスタＲ２の値を１ビット左にシフトする。これは、Ｒ２の値を２倍することに等しい。０００４でｔａｂｌｅ＝０２００にＲ２の値を加えたアドレスに格納されているデータをレジスタＲ０に転送する。例えば、ｄの値が３であれば、０２００＋２＊３＝０２０６のアドレスに格納されているデータＹ３＿ＴＯＰが指し示すアドレスＣ８００がＲ０に格納される。
【００６２】
０００６では、ＣＤＢの先頭アドレスＣＤＢ＿ＴＯＰがレジスタＲ１に格納される。０００８では、データのワード長ＤＡＴＡ＿ＬＥＮＧＴＨ＝６４がレジスタＲ３Ｈに格納される。０００ＡではＪＳＲ　Ｃｏｐｙという命令によって、プログラムカウンタの値を０１００（ラベル名”Ｃｏｐｙ”）に変更する。０１００では、Ｒ０に格納されているアドレスのデータをレジスタＲ４に転送し、０１０２では、Ｒ４の値をＲ１に格納されているアドレス位置に転送する。０１０４，０１０６で、アドレスを２だけインクリメントし、０１０８では、レジスタＲ３Ｈに格納されているカウンタの値を１だけデクリメントする。０１０Ａでは、カウンタの値が０でなければ再びコピールーチンの先頭にプログラムカウンタを変更し、レジスタＲ３Ｈの値が０になるまで上述の操作を繰り返す。Ｒ３Ｈの値が０になると、プログラムカウンタは、０１０Ｃとなり、サブルーチンから抜けて、０００Ａの次のアドレス、すなわち、０００Ｃに変更し、処理を終える。
【００６３】
アドレス０１００の転送命令にて、データＹ０，　Ｙ１，　Ｙ２，　Ｙ３を読む際のプログラムカウンタは、０１００からＲ０に変化する。この際、Ｒ０に含まれている値と０１００とのハミング距離は、常に同じである。ずなわち、
ｄ＝０の場合、
０１００　→　Ｃ２００（ハミング距離４）
０１００　→　Ｃ２０２（ハミング距離５）
０１００　→　Ｃ２０４（ハミング距離５）
…
０１００　→　Ｃ０８０（ハミング距離４）
のように変化する。
ｄ＝１の場合、
０１００　→　Ｃ４００（ハミング距離４）
０１００　→　Ｃ４０２（ハミング距離５）
０１００　→　Ｃ４０４（ハミング距離５）
…
０１００　→　Ｃ４８０（ハミング距離４）
であり、ハミング距離の変化の仕方は、ｄ＝０の場合と全く同一である。ｄ＝２，３の場合も同様に変化することは明らかであろう。したがって、アドレスの変化に応じて発生する電力を観測してｄの値を知ることは極めて困難となる。これは、本発明請求項５の実施例の一つである。
ここでは、転送するデータを４つとしたが、これは説明の便宜の為であり、データ数を一般の数とすることによって、本発明の思想が損なわれることはない。又、ここで示したデータ配置は一つの例にすぎず、他のマイクロコンピュータに実装する際には、個々のマイクロコンピュータのアドレス空間に応じて、複数のデータを同じハミング距離となる位置に配置する必要があることはいうまでもない。又、ここでは、複数のデータを読むプログラムを示したが、転送の方向を逆にすることによって、書き込みの場合にも、本発明請求項１の思想を適用することができる。
【００６４】
上記の実施例は、複数のデータに対応するプログラム側の転送命令が１つしかない場合であるが、これが複数ある場合もある。請求項２は、このような場合に対応するものである。
【００６５】
以下に示す本発明請求項６の実施例は、説明の便宜のために簡略化されており、実際に本発明を適用する場合とは異なるものであることに注意しておく。
【００６６】
本実施例は、１ビットのデータｄが、’０’，　’１’　である場合に、それぞれ、データＹ０，　Ｙ１をあるコプロセッサのデータレジスタＣＤＢ（ＣＤＢの先頭アドレスをＣＤＢ＿ＴＯＰとする）に転送するものである。
【００６７】
図７は、本実施例の基本構造を模式的に示したものである。ＲＯＭ又はＥＥＰＲＯＭ（７０１）には、メインルーチン（７０２）及び、二つのコピールーチン７０３，７０４が配置されており、各ルーチンのＭＯＶ．Ｗ　＠Ｒ０，　Ｒ４命令のアドレスは、Ｙ０＿ｐｏｉｎｔｅｒ，　Ｙ１＿ｐｏｉｎｔｅｒであるものとし、さらに、ＭＯＶ．Ｗ　＠Ｒ０，　Ｒ４の直後の命令ＭＯＶ．Ｗ　Ｒ４，　＠Ｒ１のアドレスは、それぞれ、Ｙ０＿ｐｏｉｎｔｅｒ＋２，　Ｙ１＿ｐｏｉｎｔｅｒ＋２であるものとする。さらに、ＲＡＭ（７０５）には、３つのデータ領域Ｙ０（７０６），　Ｙ１（７０７），　ＣＤＢ（７０８）があり、それぞれの先頭アドレスは、Ｙ０＿ＴＯＰ，　Ｙ１＿ＴＯＰ，　ＣＤＢ＿ＴＯＰとする。又、ＭＡＩＮ関数のＪＳＲ　＠Ｒ０命令のアドレスは、ＪＳＲ＿ＴＯＰであるものとする。このとき、関係式：
Ｈａｍ（ＪＳＲ＿ＴＯＰ，Ｙ０＿ｐｏｉｎｔｅｒ）　＝　Ｈａｍ（ＪＳＲ＿ＴＯＰ，　Ｙ１＿ｐｏｉｎｔｅｒ）（条件３），
Ｈａｍ（Ｙ０＿ｐｏｉｎｔｅｒ，　Ｙ０＿ＴＯＰ）　＝　Ｈａｍ（Ｙ１＿ｐｏｉｎｔｅｒ）（条件４），
Ｈａｍ（Ｙ０＿ｐｏｉｎｔｅｒ＋２，ＣＤＢ＿ＴＯＰ）　＝　Ｈａｍ（Ｙ１＿ｐｏｉｎｔｅｒ＋２，ＣＤＢ＿ＴＯＰ）（条件５）
を満たすように各アドレスを選ぶ。このような配置は、例えば、ＤＡＴＡ＿ＬＥＮＧＴＨ＝１０２４／１６＝６４，
ＪＳＲ＿ＴＯＰ　＝　８０００，
Ｙ０＿ｐｏｉｎｔｅｒ　＝　８１００，
Ｙ１＿ｐｏｉｎｔｅｒ　＝　８２００，
Ｙ０＿ＴＯＰ　＝　Ｃ１００，
Ｙ１＿ＴＯＰ　＝　Ｃ８００，
ＣＤＢ＿ＴＯＰ　＝　Ｄ０００
とすることによって実現できる。これが、（条件３）、（条件４）、（条件５）を満たすことは明らかであろう。
【００６８】
以下に実施例のプログラムコードを示す。動作は、［実施例１］から容易に類推できるものであるので、説明は省略する。
2004126841.tif 000008
2004126841.tif 000009
ここまでに述べた実施例１，２は、いずれも、プログラムカウンタの変化が全て等しいような例である。しかし、一般には、完全にハミング距離が揃うように配置することが難しい場合がある。このような場合には、プログラムカウンタの変化に伴う消費電力が、測定に伴うノイズと比較して小さい程度にすることにより、ほぼ同様の効果を見込むことができる。申請者は、この点を確認する実験を行い、多くの測定環境において、４ビット程度の違いを区別することには、大きな困難を伴うことを見出した。さらに、５ビット以上の差がある場合は、ノイズを考慮しても、アドレス位置が明確に区別できることを確認した。そこで、この実験結果、すなわち４ビットの差以下にハミング距離を揃えることを本発明の基本的思想とし、請求項１，２に反映させた。
【００６９】
次に図８を用いて本発明請求項３、４の実施例を説明する。
【００７０】
この実施例では、日立製作所製ＡＥ４５Ｃマイコンの命令を用いる。ＡＥ４５Ｃ上のプログラムは、先に説明したＨ８／３００アセンブラとは若干異なるＨ８／３００Ｈアセンブラによって記述される。Ｈ８／３００Ｈでは、Ｈ８／３００の命令が拡張されているので、以下、適宜説明を加える。Ｈ８／３００Ｈにおいては、レジスタが３２ビットまで拡張されており、下記のプログラムにおいて、これをＥＲの後に番号を付けて表示していること、及び、Ｅの後に番号ｊを付けた場合、ＥＲｊの上位半分のビットを指していることに注意されたい。
【００７１】
本実施例においては、ＲＡＭ（８０４）は、ＦＦ００００からＦＦＦＦＦＦまでのアドレスに割り当てられているものとする。ＲＡＭ上には、５１２ビットの長さを持つデータ領域Ａ（８０５）と、同じく５１２ビットの長さを持つデータ領域Ｂ（８０６）、及び、同じ長さを持つデータ領域Ｚ（８０７）があるものとする。本実施例は、データ領域ＡかＢのデータをデータ領域Ｚに転送するものである。この際、どちらのデータを転送しているかが、プログラムカウンタの変化に伴う消費電力を観測することによってわからないように転送することを考える。この際、乱数を必要とするが、この実施例においては、簡単の為、「予測不能な情報源」（Ｓｏｕｒｃｅ　ｏｆ　Ｕｎｐｒｅｄｉｃｔａｂｌｅ　Ｉｎｆｏｒｍａｔｉｏｎ）として、乱数発生装置（Ｒａｎｄｏｍ　Ｎｕｍｂｅｒ　Ｇｅｎｅｒａｔｏｒ）を持つＩＣチップを仮定する。既に述べたように、ＩＣカードマイコンの多くは、乱数発生装置を内蔵しており、この仮定は自然なものである。
【００７２】
［実施例３］のプログラムは、ＲＯＭ（又はＥＥＰＲＯＭ）（８０１）上のＭＡＩＮ（８０２）部分と、コピールーチン（８０３）及び、Ｅ１＿ｍｏｄ＿Ｅ４ルーチンから構成されている。ここで、Ｅ１＿ｍｏｄ＿Ｅ４ルーチンは、Ｅ１のデータをＥ４で割った余りをＥ１に格納するものとする。このサブルーチンのプログラムは、本実施例の説明には必要ないので省略する。
【００７３】
ＭＡＩＮは、データのセットを行う部分である。コピールーチンは、実施例１、２とは異なり、８ビットぼブロックデータをランダムな順序で転送する。このコピールーチンは、乱数Ｒ１と転送元のアドレスＲ５を基点として、公式：
Ｅ１　＝　Ｒ１＊（カウンタ値）　ｍｏｄ　Ｅ４
によってオフセットを作り、Ｒ５＋Ｅ１の位置のデータを読み、これをＺに書き込む。上記の公式において、Ｅ４はビット数で、Ｒ１は乱数である。Ｒ１は奇数である必要がある（ここでは、レジスタとその中に格納されている値を同じ記号を用いて表現している）。Ｒ１は実行のたびに異なるので、ブロック毎の転送の順序は毎回異なる。
【００７４】
このとき、データの読み込みにおいては、ブロック毎に、転送命令：
ＭＯＶ．Ｂ　　　　　＠ＥＲ５，　Ｒ０Ｌが配置されているアドレス（８０００）と各データとのハミング距離に比例した消費電力が生ずる。今、転送の順序はランダムであるので、転送毎のハミング距離全体の集合が一致すれば、Ａを転送しているのか、Ｂを転送しているのかを区別することはできない。例えば、ＳＲＣ＿ＡＤＤＲＥＳＳとして、ＦＦＣ１００，　ＦＦＣ２１０を選べば、この条件が満たされる。これらのアドレスの値は、アドレスの小さい方から大きい方へ読んだ場合に発生する消費電力のパターンは異なるが、これは、順序を無視すれば同じパターンであり、ランダムに転送した場合は、区別することができない例になっている。
2004126841.tif 000010
【００７５】
【発明の効果】
本発明によれば、暗号等の秘密情報を処理するプログラムにおいて、秘密情報と関係するデータを命令の配置されているアドレスから同一のハミング距離に配置に配置することにより、アドレスの違いから生ずる消費電力の差が大きく逓減し、消費電力の違いを観測することによって内部情報を知ることが困難になる。
【図面の簡単な説明】
【図１】ＩＣカードの概観。
【図２】マイクロコンピュータの構成。
【図３】消費電流波形。
【図４】ＣＭＯＳインバータの構造。
【図５】ＣＭＯＳインバータの消費電力波形。
【図６】本発明請求項１の実施例の基本構造。
【図７】本発明請求項２の実施例の基本構造。
【図８】本発明請求項３，４の実施例の基本構造。
【図１】
2004126841.tif 000011
【図２】
2004126841.tif 000012
【図３】
2004126841.tif 000013
【図４】
2004126841.tif 000014
【図５】
2004126841.tif 000015
【図６】
2004126841.tif 000016
【図７】
2004126841.tif 000017
【図８】
2004126841.tif 000018