(57)【要約】  プログラム解析の困難性をさらに強化する難読化装置を提供する。難読化装置は、乗算及び２乗算の処理に対して、同じ個数の引数を入力とするテーブルを生成し、さらに、それらの引数に出力が依存するようにテーブルの出力値を設定する。より具体的には、２乗算の処理に対して、乗算でのみ必要な引数を使った追加処理を付け加えた上でテーブル化することにより、引数の数を乗算と揃える。さらに、この場合、出力が全ての引数に依存するため、実際には処理されないダミーの引数を追加する場合と異なり、追加した引数があるか否かが分からないようになる。
2007126049.tif 000002
【特許請求の範囲】
【請求項１】
鍵情報を用いて対象情報を安全又は確実に扱うセキュリティ演算を含む情報セキュリティプログラムを難読化するプログラム難読化装置であって、
前記セキュリティ演算と等価となるように、複数入力が必要な第１基本演算と、前記複数入力の一部のみ必要とする第２基本演算とを含む複数の基本演算が鍵情報により定まる順序で配置されている前記情報セキュリティプログラムを取得する取得手段と、
前記情報セキュリティプログラムに含まれる各第２基本演算について、当該第２基本演算の前後に、当該第２基本演算において必要とされない入力に依存する入力依存変換とその逆変換である入力依存逆変換を配置する変換手段と、
各第２基本演算について、直前に配置された前記入力依存変換、当該第２基本演算及び直後に配置された前記入力依存逆変換からなる一組の演算と等価の演算結果を得るテーブルを生成し、当該テーブルを参照する参照命令を生成するテーブル生成手段と、
生成された前記テーブル及び前記参照命令を含む難読化プログラムを出力する出力手段と
を備えることを特徴とするプログラム難読化装置。
【請求項２】
前記変換手段は、さらに、前記情報セキュリティプログラムに含まれる各第１基本演算について、当該第１基本演算の前後のいずれか、又は両方に、当該第１基本演算において必要な入力に依存する入力依存変換とその逆変換である入力依存逆変換を配置する
ことを特徴とする請求項１に記載のプログラム難読化装置。
【請求項３】
前記変換手段において、前記入力依存変換は減算であり、前記入力依存逆変換は加算である
ことを特徴とする請求項２に記載のプログラム難読化装置。
【請求項４】
前記変換手段は、さらに、前記情報セキュリティプログラムの先頭に配置された基本演算を除くその他の基本演算のそれぞれについて、当該基本演算の直前に、当該基本演算の直前の基本演算の演算結果に第１の変換を施す第１変換演算と、前記第１変換演算の演算結果に、第１の変換の逆変換である第２の変換を施す第２変換演算とを配置し、
前記テーブル生成手段は、
さらに、前記情報セキュリティプログラムの先頭に配置された基本演算とその直後に配置された第１変換演算とからなる一組の演算と等価の演算結果を得るテーブルを生成し、当該テーブルを参照する参照命令を生成し、
中間に配置された各基本演算について、直前に配置された前記減算、当該基本演算及び直後に配置された前記加算に加えて、第２変換演算及び第１変換演算からなる一組の演算と等価の演算結果を得る前記テーブルを生成し、当該テーブルを参照する前記参照命令を生成し、
さらに、前記情報セキュリティプログラムの末尾に配置された基本演算とその直前に配置された第２変換演算とからなる一組の演算と等価の演算結果を得るテーブルを生成し、当該テーブルを参照する参照命令を生成し、
前記出力手段は、生成された前記テーブル及び前記参照命令を含む前記難読化プログラムを出力する
ことを特徴とする請求項３に記載のプログラム難読化装置。
【請求項５】
前記変換手段は、前記基本演算、前記減算、前記加算、前記第１変換演算及び前記第２変換演算を、桁毎に分解して、複数の桁演算を生成し、生成した前記桁演算を配置し、
前記テーブル生成手段は、
前記情報セキュリティプログラムの先頭に配置された基本演算とその直後に配置された第１変換演算とからなる一組の演算と等価の演算結果が得られるように、生成した前記桁演算と等価の演算結果が得られる桁演算テーブルを生成し、当該桁演算テーブルを参照する桁演算参照命令を生成し、
中間に配置された各基本演算について、直前に配置された前記減算、当該基本演算及び直後に配置された前記加算、第２変換演算及び第１変換演算からなる一組の演算と等価の演算結果が得られるように、生成した前記桁演算と等価の演算結果が得られる桁演算テーブルを生成し、当該桁演算テーブルを参照する桁演算参照命令を生成し、
前記情報セキュリティプログラムの末尾に配置された基本演算とその直前に配置された第２変換演算とからなる一組の演算と等価の演算結果が得られるように、生成した前記桁演算と等価の演算結果が得られる桁演算テーブルを生成し、当該桁演算テーブルを参照する桁演算参照命令を生成し、
前記出力手段は、生成された前記桁演算テーブル及び前記桁演算参照命令を含む前記難読化プログラムを出力する
ことを特徴とする請求項４に記載のプログラム難読化装置。
【請求項６】
前記テーブル生成手段は、桁演算テーブルの生成に際して、所定数個の共通化されたテーブルから、１個のテーブルを選択する
ことを特徴とする請求項５に記載のプログラム難読化装置。
【請求項７】
前記セキュリティ演算は、法ｎの元で、鍵情報である秘密鍵ｄを用いる対象情報Ｃに対するべき乗剰余演算Ｃn ｍｏｄ  ｎであり、
鍵情報により定まる順序で配置された入力数の異なる前記複数の基本演算は、べき乗剰余演算Ｃn ｍｏｄ  ｎと等価になるように、バイナリ法により、前記基本演算として、乗算剰余演算と２乗剰余演算とが、秘密鍵ｄの各ビット値に基づいて、配置されたものであり、
前記変換手段は、中間に配置された乗算剰余演算又は２乗剰余演算の直前及び直後に、当該乗算剰余演算又は２乗剰余演算への１個の入力値に依存する減算及び加算を配置し、
前記テーブル生成手段は、中間に配置された各乗算剰余演算又は２乗剰余演算について、直前に配置された前記減算、当該乗算剰余演算又は２乗剰余演算及び直後に配置された前記加算からなる一組の演算と等価の演算結果を得るテーブルを生成する
ことを特徴とする請求項３に記載のプログラム難読化装置。
【請求項８】
前記情報セキュリティプログラムは、べき乗剰余演算Ｃn ｍｏｄ  ｎを用いて、前記対象情報に、秘密通信、デジタル署名又は署名検証を施すためのコンピュータプログラムである
ことを特徴とする請求項７に記載のプログラム難読化装置。
【請求項９】
前記セキュリティ演算は、法ｎの元で、鍵情報である秘密鍵ｄを用いる対象情報Ｃに対するべき乗剰余演算Ｃn ｍｏｄ  ｎであり、
鍵情報により定まる順序で配置された入力数の異なる前記複数の基本演算は、べき乗剰余演算Ｃn ｍｏｄ  ｎと等価になるように、バイナリ法により、前記基本演算として、乗算剰余演算と２乗剰余演算とが、秘密鍵ｄの各ビット値に基づいて、配置されたものであり、
前記変換手段は、中間に配置された各乗算剰余演算を分解して、乗算演算及び剰余演算を配置し、配置された乗算演算の直前及び直後に、当該乗算演算への１個の入力値に依存する減算及び加算を配置し、中間に配置された各２乗算剰余演算を分解して、２乗算演算及び剰余演算を配置し、配置された２乗算演算の直前及び直後に、当該２乗算演算への１個の入力値に依存する減算及び加算を配置し、
前記テーブル生成手段は、中間に配置された各乗算演算又は各２乗演算について、直前に配置された前記減算、当該乗算演算又は２乗演算及び直後に配置された前記加算からなる一組の演算と等価の演算結果を得るテーブルを生成する
ことを特徴とする請求項３に記載のプログラム難読化装置。
【請求項１０】
前記取得手段、前記変換手段、前記テーブル生成手段及び前記出力手段は、集積回路を構成する
ことを特徴とする請求項１に記載のプログラム難読化装置。
【請求項１１】
プログラム難読化装置及びプログラム実行装置から構成される難読化システムであって、
鍵情報を用いて対象情報を安全又は確実に扱うセキュリティ演算を含む情報セキュリティプログラムを難読化する前記プログラム難読化装置は、
前記セキュリティ演算と等価となるように、複数入力が必要な第１基本演算と、前記複数入力の一部のみ必要とする第２基本演算とを含む複数の基本演算が鍵情報により定まる順序で配置されている前記情報セキュリティプログラムを取得する取得手段と、
前記情報セキュリティプログラムに含まれる各第２基本演算について、当該第２基本演算の前後に、当該第２基本演算において必要とされない入力に依存する入力依存変換とその逆変換である入力依存逆変換を配置する変換手段と、
各第２基本演算について、直前に配置された前記入力依存変換、当該第２基本演算及び直後に配置された前記入力依存逆変換からなる一組の演算と等価の演算結果を得るテーブルを生成し、当該テーブルを参照する参照命令を生成するテーブル生成手段と、
生成された前記テーブル及び前記参照命令を含む難読化プログラムを出力する出力手段と
を備え、
前記プログラム実行装置は、
前記難読化プログラムを取得する手段と、
取得した前記難読化プログラムに含まれている参照命令に従って、当該難読化プログラムに含まれているテーブルを参照することにより、鍵情報を用いて対象情報を安全又は確実に扱う
ことを特徴とするプログラム難読化システム。
【請求項１２】
鍵情報を用いて対象情報を安全又は確実に扱うセキュリティ演算を含む情報セキュリティプログラムを難読化するプログラム難読化装置において用いられるプログラム難読化方法であって、
前記セキュリティ演算と等価となるように、複数入力が必要な第１基本演算と、前記複数入力の一部のみ必要とする第２基本演算とを含む複数の基本演算が鍵情報により定まる順序で配置されている前記情報セキュリティプログラムを取得する取得ステップと、
前記情報セキュリティプログラムに含まれる各第２基本演算について、当該第２基本演算の前後に、当該第２基本演算において必要とされない入力に依存する入力依存変換とその逆変換である入力依存逆変換を配置する変換ステップと、
各第２基本演算について、直前に配置された前記入力依存変換、当該第２基本演算及び直後に配置された前記入力依存逆変換からなる一組の演算と等価の演算結果を得るテーブルを生成し、当該テーブルを参照する参照命令を生成するテーブル生成ステップと、
生成された前記テーブル及び前記参照命令を含む難読化プログラムを出力する出力ステップと
を含むことを特徴とするプログラム難読化方法。
【請求項１３】
鍵情報を用いて対象情報を安全又は確実に扱うセキュリティ演算を含む情報セキュリティプログラムを難読化するプログラム難読化装置において用いられるプログラム難読化のためのコンピュータプログラムを記録しているコンピュータ読み取り可能な記録媒体であって、
前記コンピュータプログラムは、コンピュータに、
前記セキュリティ演算と等価となるように、複数入力が必要な第１基本演算と、前記複数入力の一部のみ必要とする第２基本演算とを含む複数の基本演算が鍵情報により定まる順序で配置されている前記情報セキュリティプログラムを取得する取得ステップと、
前記情報セキュリティプログラムに含まれる各第２基本演算について、当該第２基本演算の前後に、当該第２基本演算において必要とされない入力に依存する入力依存変換とその逆変換である入力依存逆変換を配置する変換ステップと、
各第２基本演算について、直前に配置された前記入力依存変換、当該第２基本演算及び直後に配置された前記入力依存逆変換からなる一組の演算と等価の演算結果を得るテーブルを生成し、当該テーブルを参照する参照命令を生成するテーブル生成ステップと、
生成された前記テーブル及び前記参照命令を含む難読化プログラムを出力する出力ステップとを実行させる
ことを特徴とする記録媒体。
【請求項１４】
鍵情報を用いて対象情報を安全又は確実に扱うセキュリティ演算を含む情報セキュリティプログラムを難読化するプログラム難読化装置において用いられるプログラム難読化のためのコンピュータプログラムであって、
前記コンピュータプログラムは、コンピュータに、
前記セキュリティ演算と等価となるように、複数入力が必要な第１基本演算と、前記複数入力の一部のみ必要とする第２基本演算とを含む複数の基本演算が鍵情報により定まる順序で配置されている前記情報セキュリティプログラムを取得する取得ステップと、
前記情報セキュリティプログラムに含まれる各第２基本演算について、当該第２基本演算の前後に、当該第２基本演算において必要とされない入力に依存する入力依存変換とその逆変換である入力依存逆変換を配置する変換ステップと、
各第２基本演算について、直前に配置された前記入力依存変換、当該第２基本演算及び直後に配置された前記入力依存逆変換からなる一組の演算と等価の演算結果を得るテーブルを生成し、当該テーブルを参照する参照命令を生成するテーブル生成ステップと、
生成された前記テーブル及び前記参照命令を含む難読化プログラムを出力する出力ステップとを実行させる
ことを特徴とするコンピュータプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報セキュリティ技術としてのコンピュータプログラムの難読化技術に関する。
【背景技術】
【０００２】
近年、情報通信技術の普及に伴い、情報セキュリティ技術の重要性が一段と増してきている。このような情報セキュリティ技術の一つとして、暗号技術が、コンピュータプログラムである暗号用ソフトウェアとして具現化され、秘密の通信、プライバシーの保護、通信相手の確認等のために用いられる。
情報処理装置や通信装置などのコンピュータシステムに暗号用ソフトウェアを実装する場合、秘密鍵や暗号アルゴリズムに何らの加工を施すことなくこれらをそのまま実装するなら、不正な利用者によりプログラム実行時にこれらを解析（プログラム解析と呼ぶ）されたとき、簡単に秘密鍵が漏洩してしまう。そのため、プログラム解析を困難にする耐タンパーソフト技術が要望されている。耐タンパーソフト技術の一例として、特許文献１において、暗号化などの処理をランダム変換を含めてテーブル化することで、プログラムを難読化する方法が記載されている。【０００３】
特許文献１に記載されている従来の難読化方法の処理を図３９に示す。
従来のこの難読化方法では、共通鍵暗号の暗号用プログラムや復号用プログラムなどの難読化前の通常プログラム９０００に対して、難読化の処理（ステップＳ９００１〜Ｓ９００２）を施して、難読化プログラム９００２を生成し、出力する。この難読化方法の詳細について、以下に説明する。【０００４】
従来の難読化方法では、最初に、通常プログラム９０００を構成する複数のプログラム命令を、共通鍵暗号における鍵ｋｅｙ1 〜ｋｅｙn を用いる処理１〜ｎ（ｎは自然数）に分けて、処理１〜ｎを含む処理分割プログラム９００１を生成する（ステップＳ９００１）。
次に、処理１の直後に、出力値変換π1 と出力値逆変換π1-1 とを挿入し、処理２の直後に、出力値変換π2 と出力値逆変換π2-1 とを挿入し、処理３の直後に、出力値変換π3 と出力値逆変換π2-1 とを挿入し、・・・、処理ｉの直後に、出力値変換πi と出力値逆変換πi-1 とを挿入し、・・・、処理ｎ−１の直後に、出力値変換πn-1 と出力値逆変換πn-1-1 とを挿入する。ここで、πi-1 は、変換πi の逆変換を示す。（ｉ＝１、２、３、・・・、ｎ−１）
次に、処理１及び出力値変換π1 をテーブル化してテーブルＲＴ1 を生成し、出力値逆変換π1-1 、処理２及び出力値変換π2 をテーブル化してテーブルＲＴ2 を生成し、出力値逆変換π2-1 、処理３及び出力値変換π3 をテーブル化してテーブルＲＴ3 を生成し、・・・、 出力値逆変換πi-1 、処理ｉ＋１及び出力値変換πi+1 をテーブル化してテーブルＲＴi+1 を生成し、・・・、最後に、出力値逆変換πn-1-1 及び処理ｎをテーブル化してテーブルＲＴn  を生成する。こうして、テーブルＲＴ1 、ＲＴ2 、・・・、ＲＴn を含む難読化プログラム９００２が生成される（ステップＳ９００２）。【０００５】
このとき、鍵ｋｅｙ1 〜ｋｅｙn がそれぞれ予め与えられた定数であれば、それをも含めてテーブル化可能である。
特許文献１に記載の技術では、各テーブルＲＴ1 、・・・、ＲＴn-1 は、各処理１、・・・、ｎの出力値を出力値変換π1 、・・・、πn-1 により変換する。このように各テーブルへの入力値や各テーブルからの出力値は変換された値となっているため、各テーブルの入力値及び出力値を用いても、各テーブル中で行われている演算を解析しにくくなり、プログラム解析は困難となる。また、テーブルＲＴi において施される出力値変換πi は、テーブルＲＴi に続くテーブルＲＴi+1 において施される出力値変換πi-1 により逆変換されるのでプログラムの実行結果は難読化前の通常プログラムと同じものとなる。【０００６】
図４０は、従来の難読化方法で生成されるテーブルの一例を示している。この図に示すように、集合９０１１に含まれる各入力値ｉｎについて、処理１により、中間値ａ1 を計算し（ステップＳ９００３）、それぞれの中間値ａ1 に対し、ランダムな全単射変換である出力値変換π1 を設定し、出力値変換π1 による変換後の値π1 （ａ1 ）を計算し（ステップＳ９００４）、入力値ｉｎと変換後の値π1 （ａ1 ）を対応づけるテーブルＲＴ1 ９０１４を作成する（ステップＳ９００５）。【０００７】
このように、特許文献１に記載されている従来の難読化方法は、プログラムを難読化するという一定の目的を達成しているが、さらに、プログラム解析の困難性を強化する難読化技術が要望されている。
【特許文献１】国際公開第ＷＯ０２／４６８９０号パンフレット
【非特許文献１】岡本龍明、山本博資、「現代暗号」、産業図書（１９９７年）
【非特許文献２】H.Cohen,"A Course in Computational Algebraic Number Theory",GTM 138,Springer-Verlag,1996,p9
【発明の開示】
【発明が解決しようとする課題】
【０００８】
本発明は、上記要望に対応するため、プログラム解析の困難性がさらに強化されたプログラム難読システム、プログラム難読化装置、プログラム難読化方法、プログラム難読化プログラム、プログラム難読化プログラムを記憶している記録媒体を提供することを目的とする。
【課題を解決するための手段】
【０００９】
上記目的を達成するために、本発明は、鍵情報を用いて対象情報を安全又は確実に扱うセキュリティ演算を含む情報セキュリティプログラムを難読化するプログラム難読化装置であって、前記セキュリティ演算と等価となるように、複数入力が必要な第１基本演算と、前記複数入力の一部のみ必要とする第２基本演算とを含む複数の基本演算が鍵情報により定まる順序で配置されている前記情報セキュリティプログラムを取得する取得手段と、前記情報セキュリティプログラムに含まれる各第２基本演算について、当該第２基本演算の前後に、当該第２基本演算において必要とされない入力に依存する入力依存変換とその逆変換である入力依存逆変換を配置する変換手段と、各第２基本演算について、直前に配置された前記入力依存変換、当該第２基本演算及び直後に配置された前記入力依存逆変換からなる一組の演算と等価の演算結果を得るテーブルを生成し、当該テーブルを参照する参照命令を生成するテーブル生成手段と、生成された前記テーブル及び前記参照命令を含む難読化プログラムを出力する出力手段とを備えることを特徴とする。
【発明の効果】
【００１０】
この構成によると、複数入力が必要な第１基本演算及び前記複数入力の一部のみ必要とする第２基本演算のうち、第２基本演算について、当該第２基本演算の前後に、当該第２基本演算において必要とされない入力に依存する入力依存変換とその逆変換である入力依存逆変換を配置して、第１基本演算及び第２基本演算の入力の数の差を少なくし、入力数の違いによる攻撃に対抗して、プログラム解析の困難性をより高めることができる。【００１１】
ここで、前記変換手段は、さらに、前記情報セキュリティプログラムに含まれる各第１基本演算について、当該第１基本演算の前後のいずれか、又は両方に、当該第１基本演算において必要な入力に依存する入力依存変換とその逆変換である入力依存逆変換を配置するとしてもよい。
この構成によると、第１基本演算についても、当該第１基本演算の前後のいずれか、又は両方に、当該第２基本演算において必要とされない入力に依存する入力依存変換とその逆変換である入力依存逆変換を配置するので、プログラム解析の困難性をより高めることができる。【００１２】
ここで、前記変換手段において、前記入力依存変換は減算であり、前記入力依存逆変換は加算であるとしてもよい。
この構成によると、入力値に依存する減算と加算とを配置するので、演算結果は、配置しない場合と等価となる。
ここで、前記変換手段は、さらに、前記情報セキュリティプログラムの先頭に配置された基本演算を除くその他の基本演算のそれぞれについて、当該基本演算の直前に、当該基本演算の直前の基本演算の演算結果に第１の変換を施す第１変換演算と、前記第１変換演算の演算結果に、第１の変換の逆変換である第２の変換を施す第２変換演算とを配置し、前記テーブル生成手段は、さらに、前記情報セキュリティプログラムの先頭に配置された基本演算とその直後に配置された第１変換演算とからなる一組の演算と等価の演算結果を得るテーブルを生成し、当該テーブルを参照する参照命令を生成し、中間に配置された各基本演算について、直前に配置された前記減算、当該基本演算及び直後に配置された前記加算に加えて、第２変換演算及び第１変換演算からなる一組の演算と等価の演算結果を得る前記テーブルを生成し、当該テーブルを参照する前記参照命令を生成し、さらに、前記情報セキュリティプログラムの末尾に配置された基本演算とその直前に配置された第２変換演算とからなる一組の演算と等価の演算結果を得るテーブルを生成し、当該テーブルを参照する参照命令を生成し、前記出力手段は、生成された前記テーブル及び前記参照命令を含む前記難読化プログラムを出力するとしてもよい。【００１３】
この構成によると、基本演算の前後に第１変換演算と、その逆変換である第２変換演算が配置されるので、プログラム解析の困難性をより高めることができる。なお、第１変換演算と、その逆変換である第２変換演算が配置されるので、演算結果は、配置しない場合と等価である。
ここで、前記変換手段は、前記基本演算、前記減算、前記加算、前記第１変換演算及び前記第２変換演算を、桁毎に分解して、複数の桁演算を生成し、生成した前記桁演算を配置し、前記テーブル生成手段は、前記情報セキュリティプログラムの先頭に配置された基本演算とその直後に配置された第１変換演算とからなる一組の演算と等価の演算結果が得られるように、生成した前記桁演算と等価の演算結果が得られる桁演算テーブルを生成し、当該桁演算テーブルを参照する桁演算参照命令を生成し、中間に配置された各基本演算について、直前に配置された前記減算、当該基本演算及び直後に配置された前記加算、第２変換演算及び第１変換演算からなる一組の演算と等価の演算結果が得られるように、生成した前記桁演算と等価の演算結果が得られる桁演算テーブルを生成し、当該桁演算テーブルを参照する桁演算参照命令を生成し、前記情報セキュリティプログラムの末尾に配置された基本演算とその直前に配置された第２変換演算とからなる一組の演算と等価の演算結果が得られるように、生成した前記桁演算と等価の演算結果が得られる桁演算テーブルを生成し、当該桁演算テーブルを参照する桁演算参照命令を生成し、前記出力手段は、生成された前記桁演算テーブル及び前記桁演算参照命令を含む前記難読化プログラムを出力するとしてもよい。【００１４】
この構成によると、各演算を桁毎に分解するので、生成されるテーブルの総量をより少なくすることができる。
ここで、前記テーブル生成手段は、桁演算テーブルの生成に際して、所定数個の共通化されたテーブルから、１個のテーブルを選択するとしてもよい。
この構成によると、前記テーブル生成手段は、所定数個の共通化されたテーブルから選択するので、保持するテーブルの総量をより少なくすることができる。【００１５】
ここで、前記セキュリティ演算は、法ｎの元で、鍵情報である秘密鍵ｄを用いる対象情報Ｃに対するべき乗剰余演算Ｃn ｍｏｄ  ｎであり、鍵情報により定まる順序で配置された入力数の異なる前記複数の基本演算は、べき乗剰余演算    Ｃn ｍｏｄ  ｎと等価になるように、バイナリ法により、前記基本演算として、乗算剰余演算と２乗剰余演算とが、秘密鍵ｄの各ビット値に基づいて、配置されたものであり、前記変換手段は、中間に配置された乗算剰余演算又は２乗剰余演算の直前及び直後に、当該乗算剰余演算又は２乗剰余演算への１個の入力値に依存する減算及び加算を配置し、前記テーブル生成手段は、中間に配置された各乗算剰余演算又は２乗剰余演算について、直前に配置された前記減算、当該乗算剰余演算又は２乗剰余演算及び直後に配置された前記加算からなる一組の演算と等価の演算結果を得るテーブルを生成するとしてもよい。【００１６】
この構成によると、前記セキュリティ演算は、法ｎの元で、鍵情報である秘密鍵ｄを用いる対象情報Ｃに対するべき乗剰余演算Ｃn ｍｏｄ  ｎであるので、安全性がある程度確立されたＲＳＡ暗号技術を用いることができる。
ここで、前記セキュリティ演算は、法ｎの元で、鍵情報である秘密鍵ｄを用いる対象情報Ｃに対するべき乗剰余演算Ｃn ｍｏｄ  ｎであり、鍵情報により定まる順序で配置された入力数の異なる前記複数の基本演算は、べき乗剰余演算    Ｃn ｍｏｄ  ｎと等価になるように、バイナリ法により、前記基本演算として、乗算剰余演算と２乗剰余演算とが、秘密鍵ｄの各ビット値に基づいて、配置されたものであり、前記変換手段は、中間に配置された各乗算剰余演算を分解して、乗算演算及び剰余演算を配置し、配置された乗算演算の直前及び直後に、当該乗算演算への１個の入力値に依存する減算及び加算を配置し、中間に配置された各２乗算剰余演算を分解して、２乗算演算及び剰余演算を配置し、配置された２乗算演算の直前及び直後に、当該２乗算演算への１個の入力値に依存する減算及び加算を配置し、前記テーブル生成手段は、中間に配置された各乗算演算又は各２乗演算について、直前に配置された前記減算、当該乗算演算又は２乗演算及び直後に配置された前記加算からなる一組の演算と等価の演算結果を得るテーブルを生成するとしてもよい。【００１７】
この構成によると、べき乗剰余演算Ｃn ｍｏｄ  ｎにおける乗算剰余演算及び２乗算剰余演算がそれぞれ分解されて、乗算演算及び剰余演算、並びに２乗算演算及び剰余演算が配置され、乗算演算の直前及び直後に、前記減算及び加算が配置され、２乗算演算の直前及び直後に、前記減算及び加算が配置されるので、プログラム解析の困難性をより高めることができる。なお、入力値に依存する減算と加算とを配置するので、演算結果は、配置しない場合と等価である。
【図面の簡単な説明】
【００１８】
【図１】実施の形態１における通常プログラム５００１から難読化プログラム５００２への変換を示す図である。
【図２】実施の形態１における乗算の難読化及び２乗算の難読化を示す図である。
【図３】実施の形態２における難読化システム１の構成を示すブロック図である。
【図４】難読化システム１による第１の難読化の方法の考え方を示す図である。
【図５】変換乗算剰余処理の構成を示す図である。図５（ａ）は、ｉ＝１の場合を示し、図５（ｂ）は、２≦ｉ≦ｋ−１の場合を示し、図５（ｃ）は、ｉ＝ｋの場合を示している。
【図６】図６（ａ）は、２≦ｉ≦ｋ−１の場合の入力値変換及び出力値変換が挿入された変換乗算剰余処理の構成を示し、図６（ｂ）は、２≦ｉ≦ｋ−１の場合の分割後の乗算剰余処理の構成を示す。
【図７】図７（ａ）は、ｉ＝ｋの場合の入力値変換が挿入された変換乗算剰余処理の構成を示し、図７（ｂ）は、ｉ＝ｋの場合の分割後の乗算剰余処理の構成を示す。
【図８】２≦ｉ≦ｋ−１の場合の桁毎に分割された変換乗算処理の構成を示す。図８（ａ）は、分割前の変換乗算処理を示し、図８（ｂ）は、分割後の変換乗算処理を示す。
【図９】ｉ＝ｋの場合の桁毎に分割された変換乗算処理の構成を示す。
【図１０】桁毎に分割される場合における各加算処理の構成を示す。
【図１１】分割された変換剰余処理の構成を示す。
【図１２】各桁に対してさらに分割された場合の乗算処理の構成を示す。
【図１３】共通化されるテーブルのパターンを示す。
【図１４】ＲＴ1 について分割された乗算処理１００２の構成を示す図である。
【図１５】ＲＴ1 について分割された乗算処理１００２の構成を示す図である。図面上において、入力値変換及び出力値変換を明らかにしている。
【図１６】ＲＴi （２≦ｉ≦ｋ−１）について分割された乗算処理１００４の構成を示す図である。
【図１７】ＲＴi （２≦ｉ≦ｋ−１）について分割された乗算処理１００４の構成を示す図である。図面上において、入力値変換及び出力値変換を明らかにしている。
【図１８】ＲＴk について分割された乗算処理１００９の構成を示す図である。
【図１９】ＲＴk について分割された乗算処理１００９の構成を示す図である。図面上において、入力値変換及び出力値変換を明らかにしている。
【図２０】分割された剰余処理１００５の構成を示す。図２１へ続く。
【図２１】分割された剰余処理１００５の構成を示す。図２２へ続く。
【図２２】分割された剰余処理１００５の構成を示す。図２３へ続く。
【図２３】分割された剰余処理１００５の構成を示す。図２２から続く。
【図２４】ＲＴi （２≦ｉ≦ｋ−１）について図１７に示すＲＭ1 の詳細を示す。
【図２５】ＲＴi （２≦ｉ≦ｋ−１）について図１７に示すＲＭ1 のテーブルの具体例を示す。
【図２６】図２６（ａ）、図２６（ｂ）、図２６（ｃ）及び図２６（ｄ）は、それぞれ、ＲＴi （２≦ｉ≦ｋ−１） について図１７に示すＲＭ1 における変換β、変換φ-1、変換ｇ及び変換γ3 の具体例としてのテーブルを示す。
【図２７】ＲＴk について図１９に示すＲＭ1 の詳細を示す。
【図２８】ＲＴk について図１９に示すＲＭ1 のテーブルの具体例を示す。
【図２９】図２９（ａ）、図２９（ｂ）、図２９（ｃ）及び図２９（ｄ）は、それぞれ、ＲＴk について図１９に示すＲＭ1 における変換β、変換φ-1、変換ｇ及び変換γ3 の具体例としてのテーブルを示す。
【図３０】ＲＴ1 について図１５に示すＲＡ1 の詳細を示す。
【図３１】ＲＴ1 について図１５に示すＲＡ1 のテーブルの具体例を示す。
【図３２】図３２（ａ）、図３２（ｂ）及び図３２（ｃ）は、それぞれ、ＲＴ1 について図１５に示すＲＡ1 における変換β、変換γ1 及び変換β-1の具体例としてのテーブルを示す。
【図３３】難読化装置１００の構成を示す図である。
【図３４】暗号処理装置３００の構成を示す図である。
【図３５】難読化装置１００による難読化処理時の動作を示すフローチャートである。
【図３６】暗号処理装置３００による復号化処理の動作を示すフローチャートである。
【図３７】暗号処理装置３００による署名生成処理の動作を示すフローチャートである。
【図３８】難読化装置１００によるテーブル化の動作を示すフローチャートである。
【図３９】従来の難読化方法の処理の手順を示す図である。
【図４０】従来の難読化方法のテーブル化の一例を示す図である。
【図４１】ＲＴ1 について図１５に示すＲＭ1 の詳細を示す。
【図４２】図４２（ａ）、図４２（ｂ）及び図４２（ｃ）は、それぞれ、ＲＴ1 について図１５に示すＲＭ1 における変換β、変換ｇ及び変換γ3 の具体例としてのテーブルを示す。
【図４３】ＲＴ1 について図１５に示すＲＭ1 のテーブルの具体例を示す。
【符号の説明】
【００１９】
１  難読化システム
１００  難読化装置
１０１  入力部
１０２  乗算配置情報生成部
１０３  分割処理配置情報生成部
１０４  変換生成部
１０５  テーブル生成部
１０６  読出情報配置部
１０７  プログラム生成部
１０８  媒体記録部
２００  媒体
３００  暗号処理装置
３０１  入力部
３０２  出力部
３０３  データメモリ
３０４  プログラムメモリ
３０５  ＣＰＵ
３０６  媒体読込部
【発明を実施するための最良の形態】
【００２０】
１．実施の形態１
本発明に係る１の実施の形態としての難読化方法について説明する。
ここでは、難読化の対象となるプログラムとして、共通鍵暗号ではなく、公開鍵暗号の復号化プログラムを使う場合について説明し、具体的には、公開鍵暗号の例としてＲＳＡ暗号の復号化プログラムを難読化する難読化方法について、説明する。なお、ＲＳＡ暗号については、非特許文献１の１１０〜１１３ページに記載されているので、詳細の説明を省略する。【００２１】
ＲＳＡ暗号の復号化では、正整数である秘密鍵ｄを用いて、暗号文Ｃの復号文であるＭを計算する。
Ｍ＝Ｃ＾ｄ  ｍｏｄ  ｎ
このような演算をセキュリティ演算と呼ぶこともある。
ここで、ｎは、素数ｐと素数ｑの積であり、本明細書において、「Ｘ＾Ｙ」は、ＸのＹ乗を示し、「Ｘ  ｍｏｄ  Ｙ」は、ＸをＹで割ったときの余りを示している。【００２２】
Ｃ＾ｄ  ｍｏｄ  ｎの計算は乗算と２乗算の繰返しによって実現でき、ＲＳＡ暗号をコンピュータシステムなどに実装する場合に、この性質を利用することが多い。このとき、乗算と２乗算が適用される順番は、秘密鍵の値に依存するので、これを解析することで、攻撃者が秘密鍵を知ることができる。
ＲＳＡ暗号の復号化プログラムである難読化前の通常プログラム５００１は、図１に示すように、２乗算Ｓ５０１１、乗算Ｓ５０１２、・・・、乗算Ｓ５０１３を含んでいる。このとき、乗算と２乗算が適用される順番は、秘密鍵ｄの値に依存する。ここで、秘密鍵ｄは、ｎビット長であり、一例として、秘密鍵ｄは、「０１・・・１」である。【００２３】
Ｘ1 ＝Ｃ×Ｃ  ｍｏｄ  ｎ  
Ｘ2 ＝Ｘ1 ×Ｃ  ｍｏｄ  ｎ  
・・・
Ｘn ＝Ｘn-1 ×Ｃ  ｍｏｄ  ｎ  
こうして、復号文Ｍ＝Ｘn （＝Ｃ＾ｄ  ｍｏｄ  ｎ）が得られる。【００２４】
ここで、説明の便宜のために、
Ｘ1 ＝Ｃ×Ｃ  ｍｏｄ  ｎ  
Ｘ2 ＝Ｘ1 ×Ｃ  ｍｏｄ  ｎ  
・・・
Ｘn ＝Ｘn-1 ×Ｃ  ｍｏｄ  ｎ  
をそれぞれ、演算１（Ｓ５０１１）、演算２（Ｓ５０１２）、・・・、演算ｎ（Ｓ５０１３）と呼ぶこととする。【００２５】
この難読化方法は、演算１（Ｓ５０１１）の直後に、出力値変換π1 Ｓ５０３１と出力値逆変換π1-1 Ｓ５０３２とを挿入し、演算２（Ｓ５０１２）の直後に、出力値変換π2 Ｓ５０３３と出力値逆変換π2-1 とを挿入し、演算３の直後に、出力値変換π3 と出力値逆変換π3-1 とを挿入し、・・・、演算ｉの直後に、出力値変換πi と出力値逆変換πi-1 とを挿入し、・・・、演算（ｎ−１）の直後に、出力値変換πn-1 と出力値逆変換πn-1-1 Ｓ５０３４とを挿入する。ここで、πi-1 は、変換πi の逆変換を示す。（ｉ＝１、２、３、・・・、ｎ−１）
次に、この難読化方法は、演算Ｘ１（Ｓ５０１１）及び出力値変換π1 Ｓ５０３１をテーブル化してテーブルＲＴ1 ５０２１を生成し、出力値逆変換π1-1 Ｓ５０３２、演算Ｘ２（Ｓ５０１２）及び出力値変換π2 Ｓ５０３３をテーブル化してテーブルＲＴ2 ５０２２を生成し、出力値逆変換π2-1 、演算Ｘ３及び出力値変換π3 をテーブル化してテーブルＲＴ3 を生成し、・・・、 出力値逆変換πi-1 、演算Ｘｉ＋１及び出力値変換πi+1 をテーブル化してテーブル        ＲＴi+1 を生成し、・・・、最後に、出力値逆変換πn-1-1 Ｓ５０３４及び演算Ｘｎ（Ｓ５０１３）をテーブル化してテーブルＲＴn  ５０２３を生成する。こうして、テーブルＲＴ1 ５０２１、ＲＴ2 ５０２２、・・・、ＲＴn ５０２３を含む難読化プログラム５００２が生成される（ステップＳ５００１）。【００２６】
このように、この難読化方法では、最初と最後の演算を除く途中の演算の前後に、出力値変換及び出力値逆変換をセットで挿入する。次に、最初の演算と出力値変換をテーブル化する。次に、途中の各演算について、出力値逆変換と当該演算と出力値逆変換をテーブル化する。さらに、最後の演算について、出力値逆変換と当該演算とをテーブル化する。これにより、演算途中の中間値が変換されるので、演算内容を隠すことができる。【００２７】
しかしながら、乗算と２乗算との繰り返しによってべき乗演算をしてＲＳＡ暗号を実現する場合、乗算と２乗算とでは、使用される入力値が異なる。すなわち、図２（ａ）に示すように、乗算では、第１の入力値ｉｎ１に第２の入力値ｉｎ２をかける演算を行うのに対し、図２（ｂ）に示すように、２乗算では、第１の入力値ｉｎ１のみを用いて、第１の入力値ｉｎ１の２乗算を行う。【００２８】
このため、乗算のテーブルの出力はｉｎ１およびｉｎ２の両方に依存し、２乗算のテーブルの出力はｉｎ１のみに依存している。
この性質を利用すると、攻撃者は、テーブルの入出力に着目することで、各テーブルで乗算と２乗算のどちらが行われているのかを区別することができる。すなわち、２乗算のテーブルには入力値ｉｎ２が不要であるので、入力値ｉｎ２が入力されていないテーブルは２乗算のテーブルであり、入力値ｉｎ２が入力されているテーブルが乗算のテーブルであると推測することができる。また、仮に、２乗算のテーブルを（実際の処理に使用しないが）入力値ｉｎ２を入力するように構成したとしても、２乗算のテーブルの出力値は入力値ｉｎ２に依存しないので、この性質からテーブルが２乗算を行っているのか乗算を行っているのかを推測される可能性がある。【００２９】
このため、乗算と２乗算の順序を推測される可能性があり、その結果、秘密鍵の値が知られてしまう可能性がある。
２．実施の形態２
次に示す実施の形態２は、実施の形態１による問題点を解決し、乗算と２乗算の入力数が異なることによる攻撃を防ぐことを目的とする。【００３０】
本発明にかかる実施の形態２としての難読化システム１について説明する。
２．１  難読化システム１の概要
実施の形態２における難読化システム１の構成を図３に示す。難読化システム１は、秘密鍵ｄを入力値として受け付け難読化プログラムを生成し、生成した難読化プログラムを出力する難読化装置１００と、出力された難読化プログラムを記録する媒体２００と、媒体２００から難読化プログラムを読み出し、読み出した難読化プログラムを実行し、暗号文から復号文を生成し、又はメッセージから署名データを生成する暗号処理装置３００とから構成される。【００３１】
難読化システム１において、難読化装置１００は、秘密鍵ｄと、ＲＳＡ暗号の復号化や署名生成で使用する対象データＸとに対し、Ｘ＾ｄ  ｍｏｄ  ｎを計算する難読化プログラムを生成し、生成した難読化プログラムを媒体２００に記録する。暗号処理装置３００は、媒体２００に記録された難読化プログラムを読み出し、暗号処理装置３００が備えるＣＰＵが読み出した難読化プログラムに従って動作することにより、暗号文から復号文を生成し、又はメッセージから署名データを生成する。【００３２】
２．２  ＲＳＡ暗号方法及びＲＳＡ署名方法
ここでは、ＲＳＡ暗号方法及びＲＳＡ署名方法について説明する。ＲＳＡ暗号方法やＲＳＡ署名方法を用いることにより、情報を安全又は確実に扱うことができる。
（１）ＲＳＡ暗号方法
（ａ）鍵の生成
ＲＳＡ暗号方法では、次に示すようにして、公開鍵及び秘密鍵を計算する。【００３３】
（ｉ）ランダムに大きい素数ｐ，ｑを選択し、その積ｎ＝ｐ×ｑを計算する。ｐ，ｑの大きさは、例えば、５１２ビットであり、ｎの大きさは、例えば、１０２４ビットである。
（ii）（ｐ−１）及び（ｑ−１）の最小公倍数Ｌ＝ＬＣＭ（ｐ−１，ｑ−１）を計算する。【００３４】
（iii）Ｌと互いに素（Ｌとの最大公約数が１）でＬより小さい自然数ｅをランダムに選ぶ。
１≦ｅ≦Ｌ−１、ＧＣＤ（ｅ，Ｌ）＝１
ここで、ＧＣＤ（ｅ，Ｌ）は、ｅとＬの最大公約数を示している。
（iv）ｅ×ｄ＝１  ｍｏｄ  Ｌを満たすｄを計算する。ＧＣＤ（ｅ，Ｌ）＝１の場合、このようなｄは必ず存在することが数学的に知られている。このようにして、得られた整数ｅ及び整数ｎが公開鍵である。また、整数ｄが秘密鍵である。【００３５】
（ｂ）暗号文の生成
公開鍵である整数ｅ及び整数ｎを用いて、平文ｍに以下の暗号演算を施して暗号文ｃを計算する。ただし、平文ｍは整数ｎよりも小さいものとする。
ｃ＝ｍ＾ｅ  ｍｏｄ  ｎ
（ｃ）復号文の生成
秘密鍵である整数ｄを用いて、暗号文ｃに復号演算を施して復号文ｍ’を計算する。【００３６】
ｍ’＝ｃ＾ｄ  ｍｏｄ  ｎ
なお、
ｍ’＝ｃ＾ｄ  ｍｏｄ  ｎ
＝（ｍ＾ｅ  ）＾ｄ  ｍｏｄ  ｎ
＝ｍ＾（ｅ×ｄ  ｍｏｄ  Ｌ）  ｍｏｄ  ｎ
＝ｍ＾１  ｍｏｄ  ｎ
＝ｍ  ｍｏｄ  ｎ
であり、ｍ＜ｎであるので、ｍ  ｍｏｄ  ｎ＝ｍであることから、復号文ｍ’は、平文ｍと一致する。【００３７】
なお、ＲＳＡ暗号方法については、非特許文献１の１１０〜１１３ページに詳しく説明されている。
（２）ＲＳＡ署名方法
（ａ）鍵の生成
鍵の生成方法については、ＲＳＡ暗号方法と同様である。【００３８】
（ｂ）署名生成
メッセージデータＤに対して、以下のように署名データＳを計算する。
最初に、ハッシュ関数Ｈａｓｈを用いて、メッセージデータＤのハッシュ値ｈ＝Ｈａｓｈ（Ｄ）を計算する。
次に、秘密鍵である整数ｄを用いて、ハッシュ値ｈをｄ乗して、署名データＳを計算する。【００３９】
Ｓ＝ｈ＾ｄ  ｍｏｄ  ｎ
すなわち、ハッシュ値ｈを平文として、ＲＳＡ暗号によって暗号化した値が署名データＳである。
（ｃ）署名検証
署名データＳがメッセージデータＤの正しい署名であるかは、以下のように検証される。【００４０】
メッセージデータＤと署名データＳとを受信し、Ｈａｓｈ（Ｄ）を計算し、Ｓ＾ｅ  ｍｏｄ  ｎ（署名データＳをＲＳＡ暗号によって復号した値に相当する）を計算する。
次に、Ｈａｓｈ（Ｄ）とＳ＾ｅ  ｍｏｄ  ｎとが等しいか否かを確認する。等しい場合は、署名データＳが正しい署名であるとして、受理する。等しくない場合は、署名データＳが正しくない署名であるとして、拒否する。【００４１】
なお、ＲＳＡ署名については、非特許文献１の１７５〜１７６ページに詳しく説明されている。
２．３  難読化装置１００で実行する難読化について
（１）バイナリ法によるべき乗演算
難読化装置１００による難読化の対象となる難読化前の通常プログラムは、対象データＸに対し、べき乗値Ｘ＾ｄ  ｍｏｄ  ｎを計算する命令を含む。このようなべき乗剰余算を、セキュリティ演算と呼ぶこともある。【００４２】
この通常プログラムは、このべき乗演算として、バイナリ法によるべき乗演算を用いる。ここで、バイナリ法によるべき乗演算とは、Ｘ＾ｄ  ｍｏｄ  ｎのような式（一般にべき剰余と言われる）の値を、乗算と２乗算の繰り返しにより計算する方法である。バイナリ法の詳細については、非特許文献２に記載されている。
（２）難読化装置１００による難読化処理の方法（第１の難読化の方法）
難読化装置１００による難読化処理の方法（第１の難読化の方法）について、図４を用いて、説明する。図４には、難読化処理の考え方を記している。【００４３】
この難読化処理の方法（第１の難読化の方法）では、図４に示すように、難読化前の通常プログラム４００を、中間プログラム４２０に変換し（ステップＳ４０１）、さらに、難読化プログラム４４０に変換する（ステップＳ４０２）。
ここで、通常プログラム４００、中間プログラム４２０及び難読化プログラム４４０の演算結果は、それぞれ同じである。このような性質を等価と呼ぶこともある。【００４４】
（通常プログラム４００の内容）
図４に示す難読化前の通常プログラム４００は、バイナリ法によるべき乗剰余演算を行う命令ブロック４０１を含み、命令ブロック４０１は、命令４１１、４１２及び４１３を含む。このような通常プログラム４００を情報セキュリティプログラムと呼ぶこともある。【００４５】
通常プログラム４００において、変数Ｘには、べき乗剰余演算の対象データである値が格納され、変数ｌｅｎには、秘密鍵ｄの総ビット長が格納され、変数Ｙには、演算途中の結果値が格納される。また、変数ｉは、秘密鍵ｄのうち、着目しているビット位置を示している。ここで、秘密鍵ｄのビットは最下位ビットを０ビット目とし、下位から順に数えるものとする。【００４６】
命令４１１では、変数Ｘの値が変数Ｙに代入される。
命令４１２では、変数ｌｅｎに、秘密鍵ｄの総ビット長が格納される。
命令４１３では、変数ｉに、最初に（ｌｅｎ−１）の値を格納し、変数ｉから「１」ずつ減らしながら、変数ｉ≧０を満たす間、次に示す命令４１４及び命令４１５を繰り返す。【００４７】
命令４１４では、法ｎにおいて変数Ｙの２乗算を行いその結果を変数Ｙに格納する。
命令４１５では、秘密鍵ｄにおいて変数ｉの値が示すビットを見て、そのビットの値が「１」の場合には、さらに、法ｎにおいて変数Ｙと変数Ｘの乗算を行いその結果を変数Ｙに格納する。
こうして、命令ブロック４０１による演算が完了すると、変数Ｙには、法ｎにおいて変数Ｘをｄ乗して得られる値が格納される。【００４８】
Ｙ＝Ｘ＾ｄ  ｍｏｄ  ｎ
このように、バイナリ法によるべき乗においては、秘密鍵ｄの各ビットを見て、当該ビットの値が「０」の場合には２乗算のみを行い、「１」の場合には２乗算及び乗算を行う。そのため、もしも、２乗算のみが行われているか、又は２乗算及び乗算が行われているかが分かるなら、秘密鍵ｄを復元することができる。従って、難読化処理では、秘密鍵ｄの各ビットに対応する処理において、２乗算及び乗算のどちらが行われているのか区別が付かないようにする必要がある。【００４９】
（通常プログラム４００から中間プログラム４２０への変換）
図４に示すステップＳ４０１における通常プログラム４００から中間プログラム４２０への変換について説明する。
難読化装置１００による難読化処理の方法では、中間プログラム４２０内において、最初に、変数Ｘの値を変数Ｙに代入する初期化命令４２２「Ｙ＝Ｘ；」を生成する。【００５０】
次に、通常プログラム４００内の命令ブロック４０１から、秘密鍵ｄの値による分岐命令であるｉｆ文及びループ命令であるｆｏｒ文を取り除き、中間プログラム４２０内において、秘密鍵ｄの最下位ビットから最上位ビットに向けて、ビット毎に、当該ビットの値が「０」であるなら、２乗算剰余命令「Ｙ＝Ｙ×Ｙ  ｍｏｄ  ｎ；」を生成する。当該ビットの値が「１」であるなら、２乗算剰余命令「Ｙ＝Ｙ×Ｙ  ｍｏｄ  ｎ；」及び乗算剰余命令「Ｙ＝Ｙ×Ｘ  ｍｏｄ  ｎ；」を生成する。【００５１】
こうして、初期化命令４２２と、１個以上の２乗算剰余命令と、１個以上の２乗算剰余命令及び乗算剰余命令からなる組命令とから構成される乗算配置情報４２１が生成される。ここで、２乗算剰余命令及び乗算剰余命令を基本剰余演算又は単に基本演算と呼ぶこともある。また、２乗算剰余命令及び乗算剰余命令をそれぞれ、第２基本演算及び第１基本演算と呼ぶこともある。ここで、第１基本演算である乗算剰余命令は、複数入力を必要とし、第２基本演算である２乗算剰余命令は、前記複数入力の一部のみを必要とする。【００５２】
乗算配置情報４２１内において、初期化命令４２２は、先頭に配置され、続いて、１個以上の２乗算剰余命令と、１個以上の２乗算剰余命令及び乗算剰余命令の組命令とが、秘密鍵ｄの値に応じて配置される。  乗算配置情報４２１内におけるこれら命令の配置の順序は、初期化命令４２２、２乗算剰余命令及び乗算剰余命令の実行順序を規定している。
一例として、図４の中間プログラム４２０は、秘密鍵ｄが「１０１・・・０１」である場合の様子を示す。乗算配置情報４２１は、初期化命令４２２、組命令４２３、２乗算剰余命令４２４、組命令４２５、・・・、２乗算剰余命令４２６及び組命令４２７から構成され、この順序で配置されている。【００５３】
ここで、乗算剰余は乗算をした後、剰余（ｍｏｄ）演算を行う演算、２乗算剰余は２乗算をした後、剰余演算を行う演算を示す。
（中間プログラム４２０から難読化プログラム４４０への変換）
図４に示すステップＳ４０２における中間プログラム４２０から難読化プログラム４４０への変換について説明する。【００５４】
難読化装置１００による難読化処理の方法では、中間プログラム４２０内の乗算配置情報４２１に含まれる全ての２乗算剰余命令及び全ての乗算剰余命令を、中間値Ｙを変換した変数Ｚ及び対象データＸを入力とし、変数Ｚを出力とする２入力１出力の処理テーブル（ＲＴ1 、・・・、ＲＴk ）を参照する命令に変換する。ここで、ＲＴi は、ｉ番目の２乗算剰余命令又は乗算剰余命令をテーブル化したものである。【００５５】
なお、初期化命令４２２は、変数Ｘの値を変数Ｚに代入する初期化命令４４２に変換される。
こうして、一例として図４に示すように、初期化命令４４２、テーブル参照命令４４３、４４４、４４５、４４６、４４７、・・・、４４８及び４４９を含む命令ブロック４４１が生成される。命令ブロック４４１には、前記命令がこの順序で配置される。【００５６】
これらの命令をこの順序に従って実行することにより、べき乗剰余演算が行われてべき乗値が算出される。
（３）難読化装置１００による難読化処理の方法（第２の難読化の方法）
難読化装置１００による難読化処理の方法（第２の難読化の方法）について説明する。
（ｉ）演算命令の展開
この難読化処理の方法（第２の難読化の方法）では、図４に示すように、難読化前の通常プログラム４００を、中間プログラム４２０に変換する（ステップＳ４０１）。ここまでは、第１の難読化の方法と同一である。【００５７】
ここで、中間プログラム４２０の乗算配置情報４２１内の２乗算剰余命令及び乗算剰余命令を演算命令と呼び、乗算配置情報４２１内には、ｋ個の演算命令が配置されているものとする。つまり、乗算配置情報４２１内の２乗算剰余命令の数と、乗算配置情報４２１内の乗算剰余命令の数の合計は、ｋ個である。
（ii）出力値変換及び入力値変換の挿入
次に、この難読化処理の方法（第２の難読化の方法）では、中間プログラム４２０の乗算配置情報４２１内の全ての演算命令のうち、最後に配置された演算命令を除いて、最初と途中に配置されたｉ番目の演算命令（ｉ＝１、２、３、・・・、ｋ−１）について、当該演算命令の直後に、出力値変換Πi 及び入力値変換Πi-1 を、この順序で挿入する。【００５８】
ここで、出力値変換Πi は、前段の演算命令の出力である中間値Ｚと対象データＸとを用いる変換である。また、入力値変換Πi-1 は、対応する出力値変換Πi の出力である中間値Ｚと対象データＸとを用いる変換である。さらに、入力値変換Πi-1 は、出力値変換Πi の逆変換と同じ変換である。
このように、演算命令の後に、変換とその逆変換を挿入することにより、変換の影響を相殺することができ、これらの変換及び逆変換を挿入しない場合と同一の演算結果が得られる。【００５９】
ｉ＝１の場合、２≦ｉ≦ｋ−１の場合、及びｉ＝ｋの場合のそれぞれについて、出力値変換Πi 及び入力値変換Πi-1 の挿入の一例を、図５（ａ）、（ｂ）及び（ｃ）に示す。
図５（ａ）に示すように、ｉ＝１の場合、１番目の演算命令４６１の直後に出力値変換Π1 ４６２が挿入されている。
また、図５（ｂ）に示すように、２≦ｉ≦ｋ−１の場合、ｉ番目の演算命令４７２の直後に出力値変換Πi ４７３が挿入されている。また、ｉ番目の演算命令４７２の直前に入力値変換Πi-1-1 ４７１が挿入されている。【００６０】
さらに、図５（ｃ）に示すように、ｉ＝ｋの場合、ｋ番目の演算命令４８２の直前に入力値変換Πk-1-1 ４８１が挿入されている。
（iii） テーブル化
さらに、この難読化処理の方法（第２の難読化の方法）では、図５（ａ）に示すように、ｉ＝１の場合、１番目の演算命令４６１及び出力値変換Π1 ４６２をまとめて、１個のテーブルＲＴ1 ４６０とし、テーブルＲＴ1 ４６０を参照する命令を生成する。【００６１】
また、図５（ｂ）に示すように、２≦ｉ≦ｋ−１の場合、                  入力値変換Πi-1-1 ４７１、演算命令４７２及び出力値変換Πi ４７３をまとめて、１個のテーブルＲＴi ４７０とし、テーブルＲＴi ４７０を参照する命令を生成する。
さらに、図５（ｃ）に示すように、ｉ＝ｋの場合、入力値変換Πk-1-1 ４８１及び演算命令４８２をまとめて、１個のテーブルＲＴk ４８０とし、ＲＴk ４８０を参照する命令を生成する。【００６２】
（４）難読化装置１００による難読化処理の方法（第３の難読化の方法）
難読化装置１００による難読化処理の方法（第３の難読化の方法）について説明する。
（ｉ）演算命令の展開
この難読化処理の方法（第３の難読化の方法）では、第１の難読化の方法及び第２の難読化の方法と同様に、図４のステップＳ４０１に示すように、難読化前の通常プログラム４００を、中間プログラム４２０に変換する。【００６３】
（ii）出力値変換及び入力値変換の挿入
次に、この難読化処理の方法（第３の難読化の方法）では、第２の難読化の方法と同様にして、中間プログラム４２０の乗算配置情報４２１内に出力値変換及び入力値変換の挿入を行う。ここまでは、第２方法と同じである。
第３の難読化の方法では、さらに、次のようにする。【００６４】
ｉ＝１の場合、出力値変換Π1 を変換π1 とし、出力値変換Π1 として      変換π1 を挿入する。
また、ｉ＝ｋの場合、入力値変換Πk-1-1 を変換πk-1-1 と、入力値変換    Πk-1-1 として変換πk-1-1 を挿入する。
さらに、２≦ｉ≦ｋ−１の場合、図６（ａ）に示すように、入力値変換      Πi-1-1 ４７１を、変換πi-1-1 ４７１ａ及び入力依存値減算４７１ｂとし、入力値変換Πi-1-1 ４７１として、変換πi-1-1 ４７１ａ及び入力依存値減算４７１ｂを挿入する。また、出力値変換Πi ４７３を、入力依存値加算４７３ａ及び変換πi ４７３ｂとし、出力値変換Πi ４７３として、入力依存値加算４７３ａ及び変換πi ４７３ｂを挿入する。【００６５】
ここで、変換πi-1 は、変換πi の逆変換であり、変換πi-1 及び変換πi は、それぞれ、Ｚと同じビットサイズをもつ数から同じビットサイズの数への全単射変換である。
また、入力依存値減算は、対象データＸに変換ｆを施したｆ（Ｘ）を減算する演算であり、入力依存値加算は、対象データＸに変換ｆを施したｆ（Ｘ）を加算する演算である。ここで、入力依存値加算は、入力依存値減算の逆変換である。【００６６】
なお、図６（ａ）では、乗算について示しているが、２乗算においても同様に入力値変換及び出力値変換を配置する。
（iii） テーブル化
さらに、この難読化処理の方法（第３の難読化の方法）では、第２の難読化の方法と同様に、上記のように変換を配置した後に、ＲＴi をテーブル化し、各テーブルを参照する命令を配置する。  【００６７】
テーブル化することにより、一連の計算過程を、テーブルから値を引く処理に変換できるので、外部からは何らかのテーブルを用いていることしか分からないようにすることができる。これにより、計算過程を追っていくことによる不正解析を防止することができる。
（第３の難読化の方法のまとめ）
以上説明したように、第３方法では、乗算剰余処理及び２乗算剰余処理を、入力依存加算や入力依存減算を含む入力値変換及び出力値変換を配置した変換後乗算剰余処理及び変換後２乗算剰余処理に変換してテーブル化することにより、乗算と２乗算に対応するテーブルの入力が両方とも、中間値Ｚと対象データＸを用いることとなる。この結果、各テーブルの出力は、中間値Ｚと対象データＸとに依存して変化することとなる。【００６８】
これにより、テーブルの入力を監視したとしても、それぞれのテーブルで乗算と２乗算のいずれの処理が行われているのかを追跡することが困難になる。また、上記の変換で得られるテーブルＲＴi では、どちらのテーブルの出力も中間値Ｚと対象データＸとの両方に依存するようになる。これにより、テーブルの出力を監視したとしても、それぞれのテーブルで乗算と２乗算のいずれの処理が行われているのかを解析することを困難にすることができる。【００６９】
（５）難読化装置１００による難読化処理の方法（第４の難読化の方法−処理の分割（その１））
上記において、変換後乗算剰余処理及び変換後２乗算剰余処理をテーブル化するとしたが、中間値Ｚ及び対象データＸを、例えば、１０２４ビットの整数とすると、一つのテーブルサイズが２2048×（テーブルの出力バイトサイズ）バイトとなり、非常に大きく実装が困難になる。【００７０】
そこで、本実施の形態の第４の難読化の方法では、変換後乗算剰余処理及び変換後２乗算剰余処理を小さな値（例えば、４ビットや８ビットの整数）を入力とする処理（分割処理と呼ぶ）に分割した上でテーブル化する。
難読化装置１００による難読化処理の方法（第４の難読化の方法）について説明する。
難読化処理の方法（第４の難読化の方法）では、第３の難読化の方法と同様に、演算命令の展開を行う。ここまでは、第３の難読化の方法と同じである。【００７１】
第４の難読化の方法では、さらに、次のようにする。
各演算命令を分割する。つまり、乗算剰余演算を、乗算及び剰余演算に分割し、２乗算剰余演算を、２乗算及び剰余演算に分割する。
ｉ＝１の場合、最初の乗算又は２乗算の直後に変換π1 を挿入する。
また、２≦ｉ≦ｋ−１の場合、乗算剰余演算を分割する場合を例として説明する。図６（ｂ）に示すように、乗算剰余演算を分割して、乗算５１２と剰余演算５１５とが得られているものとする。次に、乗算５１２の直前に、入力値変換  Πi-1-1 ５１１を挿入する。ここで、入力値変換Πi-1-1 ５１１は、          変換πi-1-1 ５１１ａ及び入力依存値減算５１１ｂから構成されている。また、乗算５１２の直後に、出力値変換Ａ５１３を挿入する。ここで、出力値変換Ａ５１３は、入力依存値加算５１３ａ及び変換α５１３ｂから構成されている。また、剰余演算５１５の直前に、変換α-1 ５１４を挿入し、剰余演算５１５の直後に、変換πi ５１６を挿入する。ここで、変換α-1 は、変換αの逆変換である。【００７２】
さらに、ｉ＝ｋの場合、最後の乗算又は２乗算の直前に入力値変換Πk-1 -1を挿入する。乗算剰余演算を分割する場合を例として説明すると、図７（ｂ）に示すように、最後の乗算８１３の直前に、入力値変換Πk-1 -1８１２を挿入する。ここで、入力値変換Πk-1 -1８１２は、変換πk-1 -1８１２ａ及び入力依存値減算８１２ｂから構成される。最後の剰余演算８２１は、単独で、つまり、変換などが挿入されることなく、存在する。【００７３】
なお、２乗算剰余演算を分割する場合も同様である。
以上説明したように、第４の難読化の方法によると、乗算処理側の変換α５１３ｂが剰余演算処理側の変換α-1５１４により相殺されるので、分割処理全体でみると変換前と同じ処理が行われることが分かる。
以下、入力値変換Πi-1-1 ５１１、乗算５１２及び出力値変換Ａ５１３を含めた処理を変換乗算処理と呼び、変換α-1５１４、剰余演算５１５及び変換πi ５１６を含めた処理を変換剰余処理と呼ぶ。【００７４】
第４の難読化の方法では、さらに、変換乗算処理及び変換剰余処理をそれぞれ、中間値Ｚと対象データＸの桁ごとの処理に分割する。
例えば、Ｚ及びＸを４ビットごとの桁に分割する。
ここで、Ｚ＝Ｚ0 ＋Ｚ1 ×２4 ＋Ｚ2 ×２8 ＋・・・とし、
Ｘ＝Ｘ0 ＋Ｘ1 ×２4 ＋Ｘ2 ×２8 ＋・・・とすると、
Ｚは、最下位桁から、それぞれ４ビット毎のＺ0 、Ｚ1 、Ｚ2 、・・・に分割され、Ｘは、最下位桁から、それぞれ４ビット毎のＸ0 、Ｘ1 、Ｘ2 ・・・に分割される。【００７５】
また、ここで、変換πi 、変換α及び変換ｆは、それぞれ、桁ごとの変換を合わせると分割前の変換に戻せるような変換であるとする。
すなわち、変換πi は、４ビットの数から４ビットの数へ変換する全単射変換φi を用いて、
πi （Ｘ）＝φi （Ｘ0 ）＋φi （Ｘ1 ）×２4 ＋φi （Ｘ2 ）×２8 ＋・・・と表せるような変換とする。【００７６】
同様に、変換ｆ（Ｘ）＝ｇ（Ｘ0 ）＋ｇ（Ｘ1 ）×２4 ＋ｇ（Ｘ2 ）×２8 ＋・・・と表せ、
α（Ｘ）＝β（Ｘ0 ）＋β（Ｘ1 ）×２4 ＋β（Ｘ2 ）×２8 ＋・・・と表せるものとする。また、それぞれの逆変換についても同様に表せるものとする。
これらの変換の具体例としては、所定の値とのビット毎の論理積や論理和、排他的論理和などの論理演算による変換等が挙げられる。ただし、安全性を高めるためには、これらの変換は、論理積や論理和、排他的論理和などの論理演算などとするよりも、ランダムな置換である方が望ましい。【００７７】
続いて、分割処理の例を、図８を用いて説明する。図８は、２≦ｉ≦ｋ−１の場合における変換乗算処理の分割の様子を示したものであり、図８（ａ）は、分割前の変換乗算処理を示し、図８（ｂ）は、分割後の変換乗算処理を示している。
図８（ａ）に示す変換乗算処理５０１を分割すると、図８（ｂ）に示す変換乗算処理５２０が得られる。図８では、各桁の処理を分割し、それぞれの加算処理後の値を出力とするよう変換している。これは、大きな数の乗算が、小さな数の乗算結果の和であることを利用している。【００７８】
ここで、各桁の変換テーブルＲＭ0 、・・・、ＲＭk は以下のようにして求められる。
まず、分割前の変換乗算処理の全体を式で表すと、図６（ｂ）に示すように、
α（（（πi-1 -1（Ｚ）−ｆ（Ｘ））×Ｘ）＋ｆ（Ｘ））となる。
ここで、Ｘ、Ｚ、さらに各変換について、上述した分割後の式を代入して展開し、２4 、２8 ・・・がかけられている値や式ごとにまとめる。【００７９】
これにより、０桁目の変換に相当する式は、式５３１になり、２4 でまとめられる式が１桁目の変換に相当する式５３２になり、２8 でまとめられる式が２桁目の変換に相当する式５３３になる。こうして、４ビット毎にまとめ、４ビットを１桁としている。以下、同様にして最上位桁までの各桁の変換に相当する式が求められる。これらの式では、簡略のためにインデックスｉを省略している。【００８０】
それぞれの桁の式を元に、その式中で用いられる中間値Ｚ及び対象データＸをそれぞれ分割したＺ0 、Ｚ1 、Ｚ2 ・・・、Ｘ0 、Ｘ1 、Ｘ2 ・・・等を入力とし、それぞれの桁の式に相当する変換を行うテーブルがＲＭ0 ５２１、ＲＭ1 ５２２、ＲＭ2 ５２３、・・・となる。
ここで、それぞれの桁については、下位桁からの桁上がりを反映する必要があるので、１桁目以上の桁の値を算出するには、各変換テーブルＲＭi による演算に加え、図１０に示す加算処理１（５５１）を行う必要がある。さらに、加算処理１（５５１）を行った結果、更なる桁上がりが発生する可能性があるので、２桁目以降の値を算出するためには図１０に示す加算処理２（５５２）を行う必要がある。なお、加算処理１（５５１）及び加算処理２（５５１）では、図１０のように入力依存値減算や入力依存値加算を含め、入力に施されている変換を取り除く逆変換を入力値変換として追加し、さらに、出力値変換にも次の段のＲＴ（厳密には、ＲＴを変換して得られるＲＭ）において相殺されるような出力値変換を追加する必要がある。なお、本実施の形態では、加算処理も同様にテーブル化することにより、加算処理に対する解析も困難にしている。【００８１】
以上のことをまとめたのが図８である。ここで、それぞれの桁のＲＭ0 ５２１、ＲＭ1 ５２２及びＲＭ2 ５２３に相当する式５３１、５３２及び５３３を示している。
ＲＭ0 ５２１の出力の下位４ビットは、当該変換乗算処理５２０の０桁めの出力値となり、ＲＭ0 ５２１の上位４ビットは、加算処理１（５４１）へ出力される。ＲＭ1 ５２２の出力の下位４ビットは、加算処理１（５４１）へ出力され、ＲＭ1 ５２２の出力の上位４ビットは、加算処理１（５４２）へ出力される。ＲＭ2 ５２３の出力の下位４ビットは、加算処理１（５４２）へ出力され、      ＲＭ2 ５２３の出力の上位４ビットは、図示していない加算処理１へ出力される。【００８２】
加算処理１（５４１）の出力の下位４ビットは、当該変換乗算処理５２０の１桁めの出力値となり、加算処理１（５４１）の出力の上位４ビットは、加算処理２（５４３）へ出力される。加算処理１（５４２）の出力の下位４ビットは、加算処理２（５４３）へ出力され、加算処理１（５４２）の出力の上位４ビットは、図示していない加算処理２へ出力される。【００８３】
さらに、分割処理の例を、図９を用いて説明する。図９は、ｉ＝ｋの場合における変換乗算処理の分割の様子を示したものであり、変換乗算処理８４１を分割すると、変換乗算処理８５１が得られる。図８と同様に、図９では、各桁の処理を分割し、それぞれの加算処理後の値を出力とするよう変換している。これは、大きな数の乗算が、小さな数の乗算結果の和であることを利用している。【００８４】
ＲＭ0 ８６１の出力の下位４ビットは、当該変換乗算処理８５１の０桁めの出力値となり、ＲＭ0 ８６１の上位４ビットは、加算処理１（８７１）へ出力される。ＲＭ1 ８６２の出力の下位４ビットは、加算処理１（８７１）へ出力され、ＲＭ1 ８６２の出力の上位４ビットは、加算処理１（８７２）へ出力される。ＲＭ2 ８６３の出力の下位４ビットは、加算処理１（８７２）へ出力され、      ＲＭ2 ８６３の出力の上位４ビットは、図示していない加算処理１へ出力される。【００８５】
加算処理１（８７１）の出力の下位４ビットは、当該変換乗算処理８５１の１桁めの出力値となり、加算処理１（８７１）の出力の上位４ビットは、加算処理２（８７３）へ出力される。加算処理１（８７２）の出力の下位４ビットは、加算処理２（８７３）へ出力され、加算処理１（８７２）の出力の上位４ビットは、図示していない加算処理２へ出力される。【００８６】
以上説明したように、処理を各桁に分割することで、入力のビットサイズの和（上記例では、１０２４＋１０２４＝２０４８ビット）が小さくなるため、テーブル化したときのテーブルサイズを削減できる。
例えば、１００桁目、すなわち、ＲＭ100 では、入力が４ビットの整数２０２個分であり、入力のビットサイズの和が２０２×４＝８０８ビットとなる。そのため、１００桁目のテーブルサイズは、２808 ×（テーブルの出力バイトサイズ）バイトとなる。分割前では一つのテーブルサイズが２2048×（テーブルの出力バイトサイズ）バイトであるため、テーブルサイズが削減できている。【００８７】
上記では、変換乗算処理について示したが、変換剰余処理についても、同様の代入及び展開の処理により、図１１のように分割することができる。なお、図１１の中のπは、変換乗算剰余処理ＲＴi 内のπi を示しているが、簡単のため、インデックスｉを省略している。
以下、図１１を用いて分割処理について、説明する。【００８８】
変換剰余処理を示す式における入力Ｚに、
Ｚ0 ＋Ｚ1 ×２4 ＋Ｚ2 ×２8 ＋・・・＋Ｚb-1 ×２4(b-1)＋Ｚb ×２4b＋・・・＋Ｚ2b-1×２4(2b-1)を代入する。ここで、ｂは整数ｎのビットサイズを４で割ったものであり、本実施の形態における整数ｎの桁数を表す。ｎのビットサイズを１０２４としたときは、ｂ＝２５６となる。【００８９】
なお、上記の式では、変換剰余処理の入力Ｚの桁数を２×ｂ−１桁としているが、これは以下の理由による。変換剰余処理の入力Ｚは、変換乗算処理の結果である。この変換乗算処理では、前段のテーブルの出力結果と対象データＸとの演算が行われる。ここで、前段のテーブルの出力結果は前段のテーブルにおいてｍｏｄ  ｎがかけられているためにｂ−１桁以下の桁数を持ち、また、対象データＸはＲＳＡ暗号ではｎ以下の値である必要があるので、こちらもｂ−１桁以下の桁数を持つ。ｂ−１桁同士の乗算は、２×ｂ−２桁の演算結果を取り、さらに１桁の桁上がりが発生することがあるので、それも加えて変換後剰余処理の入力は最大２×ｂ−１桁となる。【００９０】
ここで、
Ｚ  ｍｏｄ  ｎ
＝（（Ｚ0 ＋Ｚ1 ×２4 ＋．．．＋Ｚb-1 ×２4(b-1)）
＋（Ｚb ×２4b  ｍｏｄ  ｎ）
＋（Ｚb+1 ×２4(b+1)）  ｍｏｄ  ｎ）
＋・・・
＋（Ｚ2b-1×２4(2b-1)  ｍｏｄ  ｎ））  ｍｏｄ  ｎ
となることを利用して、
Ｚb ×２4b  ｍｏｄ  ｎの演算を示す処理、
Ｚb+1 ×２4(b+1)  ｍｏｄ  ｎの演算を示す処理、
・・・、Ｚ2b+1×２4(2b-1)  ｍｏｄ  ｎを示す処理に分割し、それぞれをテーブル化して、これらのテーブルの出力を、加算テーブルを用いて、加算することで、剰余演算を行う。【００９１】
図１１では、ｉ≧ｂに対するＺi ×２4i  ｍｏｄ  ｎを示す処理をＲＤi と表現している。なお、図１１において、分割された各処理ＲＤi の間に加算“＋”を入れているが、この加算は、変換後乗算処理の分割の際に使用した加算と同じように、それぞれの桁に分割し、分割した後の加算処理には、それぞれ入力値変換及び出力値変換を追加するような処理を示す。【００９２】
（６）難読化装置１００による難読化処理の方法（第５の難読化の方法−処理の分割（その２））
第４の難読化の方法で説明したように、処理を分割した場合、０桁目（最下位の桁）や１桁目であれば、入力（４ビットの整数の個数）が少ないため、テーブルサイズはあまり大きくない。しかし、桁が増えるほど、テーブルサイズが大きくなってしまう。【００９３】
例えば、１００桁目では、入力が４ビットの整数２０２個分であり、入力のビットサイズの和が２０２×４＝８０８ビットとなる。そのため、１００桁目のテーブルサイズは、２808 ×（テーブルの出力バイトサイズ）バイトとなり、非常に大きい。
そこで、第５の難読化の方法では、各桁に対しても、処理をさらに分割する。図１２には、２桁目の処理のさらなる分割を示している。２桁目の分割前の処理６０１では、ＲＭ2 ６０２の入力をＺ0 、Ｚ1 、Ｚ2 、Ｘ0 、Ｘ1 及びＸ2 としているが、さらなる分割後の処理６１１では、処理６０１をＺ0 、Ｚ2、 Ｘ0 及びＸ2 の４入力とする処理６２１と、Ｚ1 及びＸ1 の２入力とする処理６２２とに分割する。【００９４】
他の桁の処理に対しても、同様に４入力のテーブルと２入力のテーブルに分割する。
ここで、処理６２１は、インデックスの値の加算結果が桁数と同じものになるパターンであるＺの各桁（例えば、２桁目を分割する場合、０＋２＝２であるので、Ｚ0 ，Ｚ2 となる）と、これと同じインデックスを持つＸの各桁（Ｘ0 ，Ｘ2 ）とを４個の入力とするテーブルである。【００９５】
さらに、桁数が偶数である場合には、処理６２２は、桁数の半分のインデックスを持つＺの桁（桁数が２であるとき、Ｚ1 。１＋１＝２であるから。）と、これと同じインデックスを持つＸの桁（Ｘ1 ）とを２個の入力とするテーブルである。このような桁は、変換の内容自体は４入力の場合と同様になるのであるが、４入力中の入力値に互いに同一になる入力値が含まれるため、２入力にまとめることができる。【００９６】
他の桁に対しても、これと同様の方法でテーブル分割する。例えば、５桁目のテーブルは、以下の入力を持つテーブルに分割する。
ＲＭ＿（５，０）：Ｚ0 ，Ｚ5 ，Ｘ0 ，Ｘ5 
ＲＭ＿（５，１）：Ｚ1 ，Ｚ4 ，Ｘ1 ，Ｘ4 
ＲＭ＿（５，２）：Ｚ2 ，Ｚ3 ，Ｘ2 ，Ｘ3 
また、８桁目のテーブルは、以下の入力を持つテーブルに分割する。【００９７】
ＲＭ＿（８，０）：Ｚ0 ，Ｚ8 ，Ｘ0 ，Ｘ8 
ＲＭ＿（８，１）：Ｚ1 ，Ｚ7 ，Ｘ1 ，Ｘ7 
ＲＭ＿（８，２）：Ｚ2 ，Ｚ6 ，Ｘ2 ，Ｘ6 
ＲＭ＿（８，３）：Ｚ3 ，Ｚ5 ，Ｘ3 ，Ｘ5 
ＲＭ＿（８，４）：Ｚ4 ，Ｘ4 
なお、ＲＭに付されたインデックス（Ｘ、Ｙ）は、はじめのものＸが何桁目であるかを示し、二つ目のものＹが入力のインデックスの最小値を示している。【００９８】
上記のように、処理を分割し、分割した処理をテーブル化することで、一つのテーブルサイズが、２16×（テーブルの出力バイトサイズ）バイトとなり、テーブル削減できる。
なお、２乗算においても同様の分割が可能である。分割の仕方は乗算とほぼ同様なので省略する。
（７）分割したテーブルの共通化
上記のようにテーブルを分割すると、図１３に示すように、テーブルの処理に共通点があり、この共通点を用いて、複数のテーブルの共通化ができる。図１３においては、ＲＭの分割テーブルの共通化６５７とＲＳの分割テーブルの共通化６５８について示している。ここで、ＲＳは、２乗算を示す処理である。【００９９】
図１３に示すＲＭの分割テーブルの共通化６５７において、枠で囲んだ二つのテーブル、例えば、テーブル６６１及びテーブル６６２は、それぞれ、入力に対し、同じ処理をしている。テーブル６６１及びテーブル６６２は、インデックスが、２×ｉ，ｉ（ｉ≠０）のテーブルである。インデックスが、２×ｉ，ｉ（ｉ≠０）のテーブルは、共通化することができ、複数のテーブルに代えて、同一の１個のテーブルを使用することが可能となる。【０１００】
また、テーブル６６３及びテーブル６６４は、それぞれ、入力に対し、同じ処理をしている。テーブル６６３及びテーブル６６４は、インデックスが、ｉ，０（ｉ≠０）のテーブルである。これらのテーブルについても共通化が可能である。
さらに、テーブル６６５及びテーブル６５６は、それぞれ、入力に対し、同じ処理をしている。これらのテーブルについても共通化が可能である。【０１０１】
このように、各テーブルは、インデックスの組合せに依存して、次の４個のケースに分類できる。
（ケースａ）インデックスが０，０のテーブル
（ケースｂ）インデックスが、２×ｉ，ｉ（ｉ≠０）のテーブル
（ケースｃ）インデックスが、ｉ，０（ｉ≠０）
（ケースｄ）その他のインデックスを持つテーブル
ここで、インデックスが、ｉ，０（ｉ≠０）のテーブルと、その他のインデックスを持つテーブルとは、出力にｇ（Ｘi ）が加算されるか否かのみが異なる。また、インデックスが０，０のテーブルと、インデックスが２×ｉ，ｉ（ｉ≠０）のテーブルとは、これと同様にｇ（Ｘi ）（インデックスが０，０の場合はｇ（Ｘ0 ））が加算されるか否かのみが異なる。すなわち、インデックスの二つ目が０のテーブルは、他のものと異なり、ｇ（Ｘi ）もしくはｇ（Ｘ0 ）が出力に加算されている。【０１０２】
このように、ケースａ、ケースｂ、ケースｃ及びケースｄのそれぞれに属する複数のテーブルについては、テーブルの入力値が異なるだけで、入力値と出力値との対応関係は、同じである。従って、各ケースに属する複数のテーブルをそれぞれ用いることなく、ケース毎にテーブルを共通化し、１個の共通化したテーブルを用いるようにすることができる。【０１０３】
こうして、分割された乗算処理において、多数のテーブルを用いることに代えて、４個のテーブルのみを使用することが可能となる。入力されるＸ及びＺのイッデックスに応じて、４個のテーブルから適切なテーブルを１個選択すればよい。
また、図１３に示すＲＳの分割テーブルの共通化６５８においても、上記と同様に、枠で囲んだ二つのテーブル、例えば、テーブル６８１及びテーブル６８２は、それぞれ、入力に対し、同じ処理をしている。テーブル６８１及びテーブル６８２は、インデックスが、２×ｉ，ｉ（ｉ≠０）のテーブルである。インデックスが、２×ｉ，ｉ（ｉ≠０）のテーブルは、共通化することができ、複数のテーブルに代えて、同一の１個のテーブルを使用することが可能となる。【０１０４】
また、テーブル６８３及びテーブル６８４は、それぞれ、入力に対し、同じ処理をしている。テーブル６８３及びテーブル６８４は、インデックスが、ｉ，０（ｉ≠０）のテーブルである。これらのテーブルについても共通化が可能である。
さらに、テーブル６８５及びテーブル６８６は、それぞれ、入力に対し、同じ処理をしている。【０１０５】
図１３に示すＲＳの分割テーブルの共通化６５８においても、上記と同様に、各テーブルは、インデックスの組合せに依存して、上記の４個のケースに分類できる。
こうして、分割された２乗算処理においても、多数のテーブルを用いることに代えて、４個のテーブルのみを使用することが可能となる。
（８）難読化装置１００による難読化の実行
以上で示したように、入力値変換や出力値変換、処理の分割、分割した処理をテーブル化したときの共通化を施すことにより、難読化装置１００は、難読化を実行する。【０１０６】
以下では、図４の乗算剰余と２乗算剰余の配置情報を乗算配置情報と呼ぶ。また、図５〜１３において説明した入力値変換や出力値変換、処理の分割の結果、得られる処理やテーブルの配置が定まる。この処理やテーブルの配置を示す情報を、以下では、分割処理配置情報と呼ぶ。
難読化装置１００は、まず、乗算配置情報を生成し、次に分割処理配置情報を生成する。その後、分割処理配置情報で使用する入力値変換や出力値変換を決定し、それに基づいてテーブルを生成する。【０１０７】
テーブルは、例えば、入力値に、その入力値が入力された場合に変換後の処理で算出される値をそれぞれ計算し、対応付けることにより生成される。具体的な実現方法としては多次元の配列などが考えられる。さらに、分割処理配置情報に基づいて、テーブルの読出命令の順序を示す読出命令順序情報を生成する。その後、生成した読出命令順序情報と生成したテーブルとを合わせることで、難読化プログラムが完成する。【０１０８】
なお、難読化装置１００により生成される難読化プログラムは、上記読出命令順序情報とテーブル以外の命令やデータを含んでもよい。また、予め、分割処理配置情報は難読化装置１００に予め与えられるとしてもよい。
（９）乗算処理の分割の具体例
乗算処理の分割の具体例について図１４〜図１９を用いて説明する。【０１０９】
（ａ）ＲＴ1 の分割
秘密鍵ｄの１桁目にあたる変換であるＲＴ1 の分割について、ＲＴ1 が乗算処理である場合を例に説明する。図１４は、ＲＴ1 について分割された乗算処理１００２の構成を示す図である。
このＲＴ1 は、秘密鍵ｄの１桁目にあたる変換であるので、入力値依存減算や変換π-1は含まれない。この例では、ｎのビットサイズを６ビットとし、この６ビットのデータを２桁に分割している。ここで、各桁は、３ビットからなる。また、中間値Ｚ，Ｘはそれぞれ、
Ｚ＝Ｚ0 ＋Ｚ1 ×２3 ，
Ｘ＝Ｘ0 ＋Ｘ1 ×２3 となる。【０１１０】
すなわち、Ｚ0 、Ｚ1 、Ｘ0 、Ｘ1 はそれぞれ、Ｚ，Ｘを３ビットずつに分割した値である。このとき、乗算処理が上述の方法に基づいて、各桁に分割され、乗算処理１００２は、図１４に示すように、ＲＭ0 １１２１、ＲＭ1 １１２２、ＲＭ2 １１２３、加算処理ＲＡ1 １１２４、ＲＡ2 １１２５、ＲＡ3 １１２６、ＲＡ1 １１２７、ＲＡ2 １１２８、ＲＡ2 １１２９、ＲＡ4 １１３０及び      ＲＡ5 １１３１を含む。【０１１１】
ここで、ＲＭ0 １１２１は、ＲＴ1 の０桁目の計算であり、Ｚ0 ，Ｘ0 を入力とする分割後の乗算処理であり、ＲＭ1 １１２２は、ＲＴ1 の１桁目の計算であり、Ｚ0 ，Ｚ1 ，Ｘ0 ，Ｘ1 を入力とする分割後の乗算処理であり、ＲＭ2 １１２３は、ＲＴ2 の２桁目計算であり、Ｚ1 ，Ｘ1 を入力とする分割後の乗算処理である。
ＲＭ0 ，ＲＭ1 ，ＲＭ2 のそれぞれ出力を加算処理ＲＡ1 ，ＲＡ2 ，．．．，ＲＡ5 によって加算して得られる結果が、ＺとＸの乗算結果の変換後の値である。【０１１２】
本実施の形態では、上述したようにＲＭ0 ，ＲＭ1 ，ＲＭ2 ，ＲＡ1 ，      ＲＡ2 ，．．．，ＲＡ5 もそれぞれテーブル化することで解析が困難になるようにする。なお、ＲＡ1 ，ＲＡ2 ，．．．，ＲＡ5 は、図１０に示す加算処理１や加算処理２と同様、それぞれに入力値変換及び出力値変換が含まれている。
ここで、ＲＭ0 １１２１，ＲＭ1 １１２２及びＲＭ2 １１２３を示すボックス内部に“［０，５６］”、“［０，１０５］”及び“［０，１０５］”の記述があるが、これらは、これらの処理における出力値の、これらの処理内の出力値変換前の値が、それぞれ、「０」から「５６」の範囲、「０」から「１０５」の範囲及び「０」から「４９」の範囲の値であることを示す。【０１１３】
また、ＲＭ0 １１２１，ＲＭ1 １１２２，ＲＭ2 １１２３，ＲＡ1 １１２４，ＲＡ2 １１２５，ＲＡ3 １１２６は、複数個の出力（ＲＭ1 については、３桁の出力であるため、中位部分も存在し、３個の出力を有し、その他については、２個の出力を有する）を有する。ここで、ＲＭ1 １１２２以外については、図面に向かって左側の出力が出力値変換前の出力の上位部分を示し、右側の出力が出力値変換前の出力の下位部分を示す。ＲＭ1 １１２２については、３桁の出力であるため、中位部分も存在する。【０１１４】
例えば、ＲＭ0 １１２１については、出力値が「０」から「５６」の範囲であり、その出力値の上位３ビットは、ＲＡ1 １１２４に入力され、下位３ビットは乗算処理１００２の出力とされている。ＲＭ0 １１２１の上位部分及び下位部分の“［０，７］”についても、それぞれの出力値変換前の値が０から７の範囲の値であることを示す。また、乗算処理１００２は、最終出力値として、図１４の最下部に記載されている各３ビットの出力値１１４２ａ、１１４２ｂ、１１４２ｃ、１１４２ｄ及び１１４２ｅを出力する。この例では、乗算処理１００２は、６ビットのＺ及びＸを入力し、１５ビットの値を出力している。【０１１５】
図１５では、図１４の乗算処理１００２を構成するＲＭ0 １１２１，ＲＭ1 １１２２，ＲＭ2 １１２３，ＲＡ1 １１２４，ＲＡ2 １１２５，・・・，ＲＡ5 １１３１のそれぞれについて、図面上において、入力値変換及び出力値変換を明らかにしている。
例えば、ＲＡ1 １１２４は、上位側の入力値の直後に入力値変換β-1１１２４ｂを含み、下位側の入力値の直後に入力値変換β-1１１２４ａを含み、入力値変換β-1１１２４ｂの出力値と入力値変換β-1１１２４ａの出力値とを加算する加算１１２４ｃを含み、加算１１２４ｃの上位側の出力値の直後に              出力値変換γ1 １１２４ｅを含み、加算１１２４ｃの下位側の出力値の直後に出力値変換β１１２４ｄを含む。【０１１６】
また、ＲＭ0 １１２１は、上位側の入力値及び下位側の入力値に対する乗算１１２１ａを含み、乗算１１２１ａの上位側の出力値の直後に、出力値変換β１１２１ｃを含み、乗算１１２１ａの下位側の出力値の直後に、出力値変換β１１２１ｂを含む。
（ｂ）ＲＴi （２≦ｉ≦ｋ−１）の分割
続いて、ＲＴi （２≦ｉ≦ｋ−１）について分割された乗算処理の構成について説明する。これらの変換には、前段の出力値変換等の逆変換が含まれているので、ＲＴ1 とは内容が多少異なっている。図１６は、ＲＴi （２≦ｉ≦ｋ−１）について分割された乗算処理１００４の構成を示す図である。この例においても、ｎのビットサイズを６ビットとし、６ビットのデータを２桁に分割している。各桁は、３ビットからなる。【０１１７】
このとき、乗算処理が各桁において分割され、ＲＴ1 に対する乗算処理のときと同様に、乗算処理１００４は、図１６に示すように、ＲＭ0 １１８１、      ＲＭ1 １１８２、ＲＭ2 １１８３、加算処理ＲＡ6 １１８４、ＲＡ7 １１８５、ＲＡ8 １１８６、ＲＡ1 １１８７、ＲＡ7 １１８８、ＲＡ2 １１８９、ＲＡ9 １１９０及びＲＡ10１１９１を含む。
ここで、ＲＭ0 １１８１は、Ｚ0 ，Ｘ0 を入力とする分割後の乗算処理であり、ＲＭ1 １１８２は、Ｚ0 ，Ｚ1 ，Ｘ0 ，Ｘ1 を入力とする分割後の乗算処理であり、ＲＭ2 １１８３は、Ｚ1 ，Ｘ1 を入力とする分割後の乗算処理である。【０１１８】
さらに、ＲＭ0 ，ＲＭ1 ，ＲＭ2 の出力を加算処理ＲＡ1 ，ＲＡ2 ，．．．，ＲＡ10によって加算した結果がＺとＸの乗算結果の変換後の値である。ここで、ＲＭ0 ，ＲＭ1 ，ＲＭ2 ，ＲＡ1 ，ＲＡ2 ，・・・，ＲＡ10をテーブル化する。
ここで、ＲＭ0 ，ＲＭ1 ，ＲＭ2 に“［−７，５６］”などの記述があるが、これはこの処理の出力が−７から５６の範囲の値であることを示す。ここで、ＲＴ1 に対する乗算処理と異なり、負の値が範囲に含まれることに注意する。負の出力は、前段の入力値依存加算を相殺するための、入力依存値減算が行われるために発生する。ここで、ＲＭ0 ，ＲＭ1 ，ＲＭ2 ，ＲＡ1 ，ＲＡ2 ，・・・，ＲＡ10は、負の値の範囲として含む上位部分と、正の値を範囲とする下位部分の２個の出力を有する。図面に向かって左側の出力が出力値変換前の出力の上位部分を示し、右側の出力が出力値変換前の出力の下位部分となる（ＲＭ1 は、０〜１０５までの１０６種類の値を取り、２進数標記では７ビット必要となるため、１桁を３ビットとした場合には３桁となり、正の値を範囲とする中位部分も存在する）。【０１１９】
例えば、ＲＭ0 については、出力ｏｕｔに対し、
下位部分＝ｏｕｔ  ｍｏｄ  ８，
上位部分＝（ｏｕｔ−（下位部分））／８である。
また、ＲＭ＿１については、出力ｏｕｔに対し、
下位部分＝ｏｕｔ  ｍｏｄ  ８，
中位部分＝（ｏｕｔ−（下位部分））／８  ｍｏｄ  ８，
上位部分＝（ｏｕｔ−下位部分−中位部分×８）／６４である。【０１２０】
なお、出力の上位部分や下位部分などに対する値の範囲は、出力値変換前の値であり、出力値変換後はこの範囲の値となるとは限らない。例えば、ＲＭ0 の出力の上位部分は、出力値変換前は［−１，７］であるが、出力値変換後は、扱いやすいように［０，８］などとする。この例では、乗算処理において、６ビットのＺ及びＸを入力し、１６ビットの値（最上位桁は符号の情報を含む）を出力している。【０１２１】
図１７では、図１６に示すＲＭ0 １１８１，ＲＭ1 １１８２，ＲＭ2 １１８３、・・・、ＲＡ1 １１８７，ＲＡ2 １１８９，・・・，ＲＡ10１１９１について、それぞれに含まれる入力値変換及び出力値変換を明らかにしている。例えば、ＲＡ6 １１８４は、上位側の入力値の直後に入力値変換β-1１１８４ｂを、上位側の入力値の直後にγ5 -1１１８４ａを、出力値の上位部分の直前に            出力値変換γ7 １１８４ｄを、出力値の下位部分の直後に出力値変換β１１８４ｃを含むことを示している。【０１２２】
なお、各入力値変換と出力値変換は、図中で直接繋がっている箇所同士で打ち消しあう変換であれば、どのような変換でも構わない。
（ｃ）ＲＴk の分割
次に、ＲＴk について分割された乗算処理の構成について説明する。
図１８は、ＲＴk について分割された乗算処理１００９の構成を示す図である。【０１２３】
乗算処理１００９は、図１８に示すように、ＲＭ0 １３３１、ＲＭ1 １３３２、ＲＭ2 １３３３、加算処理ＲＡ17１３３４、ＲＡ7 １３３５、ＲＡ8 １３３６、ＲＡ14１３３７、ＲＡ7 １３３８、ＲＡ15１３３９、ＲＡ9 １３４０及び      ＲＡ18１３４１を含む。
ここで、ＲＭ0 １３３１は、Ｚ0 ，Ｘ0 を入力とする分割後の乗算処理であり、ＲＭ1 １３３２は、Ｚ0 ，Ｚ1 ，Ｘ0 ，Ｘ1 を入力とする分割後の乗算処理であり、ＲＭ2 １３３３は、Ｚ1 ，Ｘ1 を入力とする分割後の乗算処理である。【０１２４】
さらに、ＲＭ0 ，ＲＭ1 ，ＲＭ2 の出力を加算処理ＲＡ17，ＲＡ7 ，．．．，によって加算した結果がＺとＸの乗算結果の変換後の値である。
図１９では、図１８の乗算処理１００９を構成するＲＭ0 １３３１、ＲＭ1 １３３２、ＲＭ2 １３３３、ＲＡ17１３３４、ＲＡ7 １３３５、ＲＡ8 １３３６、ＲＡ14１３３７、ＲＡ7 １３３８、ＲＡ15１３３９、ＲＡ9 １３４０及び      ＲＡ18１３４１のそれぞれについて、図面上において、入力値変換及び出力値変換を明らかにしている。【０１２５】
なお、図１９に示すＲＭ0 １３３１、ＲＡ17１３３４、ＲＡ14１３３７、ＲＡ15１３３９及びＲＡ18１３４１には、それぞれ、変換Ｅが含まれている。ここで、変換Ｅは、何もしないことを示す。
（ｄ）ＲＴ1 についてのＲＭ1 に対応するテーブルの具体例
ＲＴ1 についての図１５に示すＲＭ1 １１２２に対応するテーブルの具体例を図４１〜図４３に示している。【０１２６】
図４１は、ＲＴ1 について図１５に示すＲＭ1 １１２２の詳細を示す。      ＲＭ1 は、４個の入力値ｉｎ１、ｉｎ２、ｉｎ３及びｉｎ４から構成される入力値群（ｉｎ１、ｉｎ２、ｉｎ３、ｉｎ４）に対して、図４３に示すテーブル１４２１を用いた変換を施して、３個の出力値ｏｕｔ１、ｏｕｔ２及びｏｕｔ３から構成される出力値群（ｏｕｔ１、ｏｕｔ２、ｏｕｔ３）を出力する。【０１２７】
ここで、ｉｎ１＝Ｚ0 、ｉｎ２＝Ｚ1 、ｉｎ３＝Ｘ0 及びｉｎ４＝Ｘ1 とすると、ＲＴ1 は、
ｖａｌ＝Ｚ0 ×Ｘ1 ＋Ｚ1 ×Ｘ0
−ｇ（Ｘ0 ）×Ｘ1 −  ｇ（Ｘ1 ）×Ｘ0 ＋ｇ（Ｘ1 ）を算出し、
ｏｕｔ１＝γ3 [val - (val mod 8) -(((val-(val mod 8)))mod8)×8))/64]、
ｏｕｔ２＝β[((val - (val mod 8))8)mod8]、
ｏｕｔ３＝β[val mod 8]  を算出する。【０１２８】
テーブル１４２１は、図４３に示すように、複数の入力値群（ｉｎ１、ｉｎ２、ｉｎ３、ｉｎ４）と、前記複数の入力値群にそれぞれ対応する複数の出力値群（ｏｕｔ１、ｏｕｔ２、ｏｕｔ３）とから構成されている。
なお、図４３では、演算過程の理解を容易にするために、複数の入力値群（ｉｎ１、ｉｎ２、ｉｎ３、ｉｎ４）及び複数の出力値群（ｏｕｔ１、ｏｕｔ２、ｏｕｔ３）以外に、演算途中の中間値についても、記載しているが、上述した通り、テーブル１４２１は、複数の入力値群（ｉｎ１、ｉｎ２、ｉｎ３、ｉｎ４）及び複数の出力値群（ｏｕｔ１、ｏｕｔ２、ｏｕｔ３）のみから構成されているので、注意を要する。【０１２９】
図４２（ａ）、図４２（ｂ）及び図４２（ｃ）は、それぞれ、ＲＴ1 について図１５に示すＲＭ1 における変換β、変換ｇ及び変換γ3 の具体例としてのテーブル１４２２、１４２３、１４２４を示す。
（ｅ）ＲＴi （２≦ｉ≦ｋ−１）についてのＲＭ1 に対応するテーブルの具体例
ＲＴi （２≦ｉ≦ｋ−１）についての図１７に示すＲＭ1 １１８２に対応するテーブルの具体例を図２４〜図２６に示している。【０１３０】
図２４は、ＲＴi （２≦ｉ≦ｋ−１）について図１７に示すＲＭ1 １１８２の詳細を示す。ＲＭ1 は、４個の入力値ｉｎ１、ｉｎ２、ｉｎ３及びｉｎ４から構成される入力値群（ｉｎ１、ｉｎ２、ｉｎ３、ｉｎ４）に対して、図２５に示すテーブル１３６０を用いた変換を施して、３個の出力値ｏｕｔ１、ｏｕｔ２及びｏｕｔ３から構成される出力値群（ｏｕｔ１、ｏｕｔ２、ｏｕｔ３）を出力する。【０１３１】
ここで、ｉｎ１＝Ｚ0 、ｉｎ２＝Ｚ1 、ｉｎ３＝Ｘ0 及びｉｎ４＝Ｘ1 とすると、ＲＴi （２≦ｉ≦ｋ−１）は、
ｖａｌ＝φ-1（Ｚ0 ）×（Ｘ1 ）＋φ-1（Ｚ1 ）×（Ｘ0 ）
−ｇ（Ｘ0 ）×Ｘ1 −  ｇ（Ｘ1 ）×Ｘ0 ＋ｇ（Ｘ1 ）を算出し、
ｏｕｔ１＝γ3 [val - (val mod 8) -(((val-(val mod 8))/8)mod8)×8))/64]、
ｏｕｔ２＝β[((val - (val mod 8)) /8)mod8]、
ｏｕｔ３＝β[val mod 8]  を算出する。【０１３２】
テーブル１３６０は、図２５に示すように、複数の入力値群（ｉｎ１、ｉｎ２、ｉｎ３、ｉｎ４）と、前記複数の入力値群にそれぞれ対応する複数の出力値群（ｏｕｔ１、ｏｕｔ２、ｏｕｔ３）とから構成されている。
なお、図２５では、演算過程の理解を容易にするために、複数の入力値群（ｉｎ１、ｉｎ２、ｉｎ３、ｉｎ４）及び複数の出力値群（ｏｕｔ１、ｏｕｔ２、ｏｕｔ３）以外に、演算途中の中間値についても、記載しているが、上述した通り、テーブル１３６０は、複数の入力値群（ｉｎ１、ｉｎ２、ｉｎ３、ｉｎ４）及び複数の出力値群（ｏｕｔ１、ｏｕｔ２、ｏｕｔ３）のみから構成されているので、注意を要する。【０１３３】
図２６（ａ）、図２６（ｂ）、図２６（ｃ）及び図２６（ｄ）は、それぞれ、ＲＴ1 について図１７に示すＲＭ1 における変換β、変換φ-1、変換ｇ及び変換γ3 の具体例としてのテーブルを示す。
なお、図２５において、ｏｕｔ１の出力値変換前の値は、−２から２の範囲の５種類であるが、γ3 を施すことにより、０から７の範囲の値（８種類）に変換している。こうすることで、攻撃者が変換後の値それぞれの発生確率を調べて、変換前の値を推測することを困難にしている。例えば、最も発生確率が高い値が、変換前の０であると推測することでテーブルの処理の内容を解析する攻撃を防ぐ。なお、このとき、−１に対応するγ3 （−１）が０と１の２値となっているが、全体のＲＭ1 のテーブルの出力ｏｕｔ１の値が可能な限り一様となるように、  γ3 を設定する。すなわち、出力ｏｕｔ１の値は０から７で分布するが、このそれぞれの値が同じ発生確率となるようにγ3 を設定する。図２６では、γ3 への入力として−１，０，１の発生確率が高いため、これをそれぞれ２値へ変換している。また、後述する図３１のｏｕｔ１におけるγ1 も同様に多値へ変換するようにしている。【０１３４】
（ｆ）ＲＴk についてのＲＭ1 に対応するテーブルの具体例
ＲＴk についての図１９に示すＲＭ1 １３３２に対応するテーブルの具体例を図２７〜図２９に示している。
図２７は、ＲＴk について図１９に示すＲＭ1 １３３２の詳細を示す。      ＲＭ1 は、４個の入力値ｉｎ１、ｉｎ２、ｉｎ３及びｉｎ４から構成される入力値群（ｉｎ１、ｉｎ２、ｉｎ３、ｉｎ４）に対して、図２８に示すテーブル１３９０を用いた変換を施して、３個の出力値ｏｕｔ１、ｏｕｔ２及びｏｕｔ３から構成される出力値群（ｏｕｔ１、ｏｕｔ２、ｏｕｔ３）を出力する。【０１３５】
ここで、ｉｎ１＝Ｚ0 、ｉｎ２＝Ｚ1 、ｉｎ３＝Ｘ0 及びｉｎ４＝Ｘ1 とすると、ＲＴk は、
ｖａｌ＝φ-1（Ｚ0 ）×（Ｘ1 ）＋φ-1（Ｚ1 ）×（Ｘ0 ）
−ｇ（Ｘ0 ）×Ｘ1 −  ｇ（Ｘ1 ）×Ｘ0 を算出し、
ｏｕｔ１＝γ3 [val - (val mod 8) -(((val-(val mod 8)))mod8)×8))/64]、
ｏｕｔ２＝β[((val - (val mod 8)))mod8]、
ｏｕｔ３＝β[val mod 8]  を算出する。【０１３６】
テーブル１３９０は、図２８に示すように、複数の入力値群（ｉｎ１、ｉｎ２、ｉｎ３、ｉｎ４）と、前記複数の入力値群にそれぞれ対応する複数の出力値群（ｏｕｔ１、ｏｕｔ２、ｏｕｔ３）とから構成されている。
なお、図２８では、演算過程の理解を容易にするために、複数の入力値群（ｉｎ１、ｉｎ２、ｉｎ３、ｉｎ４）及び複数の出力値群（ｏｕｔ１、ｏｕｔ２、ｏｕｔ３）以外に、演算途中の中間値についても、記載しているが、上述した通り、テーブル１３９０は、複数の入力値群（ｉｎ１、ｉｎ２、ｉｎ３、ｉｎ４）及び複数の出力値群（ｏｕｔ１、ｏｕｔ２、ｏｕｔ３）のみから構成されているので、注意を要する。【０１３７】
図２９（ａ）、図２９（ｂ）、図２９（ｃ）及び図２９（ｄ）は、それぞれ、ＲＴk について図１９に示すＲＭ1 における変換β、変換φ-1、変換ｇ及び変換γ3 の具体例としてのテーブル１３９１、１３９２、１３９３、１３９４を示す。
（ｇ）ＲＴ1 についてのＲＡ1 に対応するテーブルの具体例
ＲＴ1 についての図１５に示すＲＡ1 １１２４に対応するテーブルの具体例を図３０〜図３２に示している。【０１３８】
図３０は、ＲＴ1 について図１５に示すＲＡ1 １１２４の詳細を示す。      ＲＡ1 は、２個の入力値ｉｎ１及びｉｎ２から構成される入力値群（ｉｎ１、ｉｎ２）に対して、図３１に示すテーブル１４１０を用いた変換を施して、２個の出力値ｏｕｔ１及びｏｕｔ２から構成される出力値群（ｏｕｔ１、ｏｕｔ２）を出力する。
ＲＴ1 は、
ｏｕｔ１＝γ1 [(β-1(in1)+β-1(in2)-out2)/8]、
ｏｕｔ２＝β[β-1(in1)+β-1(in2) mod8]を算出する。【０１３９】
テーブル１４１０は、図３１に示すように、複数の入力値群（ｉｎ１、ｉｎ２）と、前記複数の入力値群にそれぞれ対応する複数の出力値群（ｏｕｔ１、ｏｕｔ２）とから構成されている。
なお、図３１では、演算過程の理解を容易にするために、複数の入力値群（ｉｎ１、ｉｎ２）及び複数の出力値群（ｏｕｔ１、ｏｕｔ２）以外に、演算途中の中間値についても、記載しているが、上述した通り、テーブル１４１０は、複数の入力値群（ｉｎ１、ｉｎ２）及び複数の出力値群（ｏｕｔ１、ｏｕｔ２）のみ構成されているので、注意を要する。【０１４０】
図３２（ａ）、図３２（ｂ）及び図２９（ｃ）は、それぞれ、ＲＴ1 について図１５に示すＲＡ1 における変換β、変換γ1 及び変換β-1の具体例としてのテーブル１４１１、１４１２、１４１３を示す。
（１０）剰余処理の分割の具体例
剰余処理の分割の具体例について図２０〜２３を用いて説明する。【０１４１】
分割された剰余処理１００５は、図２０〜２３に示すように、剰余算ＲＤ0 １２０１、ＲＤ1 １２０６、ＲＤ2 １２１２、ＲＤ3 １２１８、加算ＲＡ1 １２０２、ＲＡ1 １２０３、ＲＡ2 １２０４、ＲＡ12１２０５、ＲＡ1 １２０７、ＲＡ1 １２０８、ＲＡ2 １２０９、ＲＡ12１２１０、ＲＡ4 １２１１、ＲＡ1 １２１３、ＲＡ1 １２１４、ＲＡ2 １２１５、ＲＡ13１２１６、ＲＡ4 １２１７、ＲＡ1 １２１９、ＲＡ1 １２２０、ＲＡ2 １２２１及びＲＡ4 １２２２から構成されている。【０１４２】
ここで、剰余算ＲＤ0 １２０１、ＲＤ1 １２０６、ＲＤ2 １２１２、ＲＤ3 １２１８は、剰余算を行うためのテーブルである。これらのテーブルは、演算対象である対象値と、対象値に対する剰余値とを対応付けて構成する組を複数個記憶しており、ある対象値が入力として指定されると、その対象値に対応する剰余値が当該テーブルから引かれて出力される。なお、剰余算ＲＤ0 １２０１、      ＲＤ1 １２０６、ＲＤ2 １２１２、ＲＤ3 １２１８は、上記の剰余算の前後において、変換を施す。【０１４３】
また、ＲＡ1 、ＲＡ2 、ＲＡ12、・・・は、桁ごとの加算や桁上がりを反映するための加算を行う加算処理のテーブルである。これらのテーブルも、演算対象である２個の対象値と、前記２個の対象値の加算値とを対応付けて構成する組を複数個記憶しており、ある２個の対象値が入力として指定されると、その対象値に対応する加算値が当該テーブルから引かれて出力される。なお、ＲＡ1 、ＲＡ2 、ＲＡ12、・・・は、上記の加算の前後において、変換を施す。【０１４４】
この例では、剰余処理１００５は、整数ｎを法としたときの、
Ｚ＝Ｚ0 ＋Ｚ1 ×２3 ＋Ｚ2 ×２6 ＋Ｚ3 ×２9 ＋Ｚ4 ×２12の剰余を計算している。
（ａ）剰余処理１００５のうち、図２０に示す演算では、
（Ｚ0 ＋Ｚ1 ×２3 ）＋（Ｚ2 ×２6   ｍｏｄ  ｎ）を計算している。
すなわち、図２０に示す演算では、剰余処理１００５の剰余算ＲＤ0 １２０１、加算ＲＡ1 １２０３、ＲＡ1 １２０２、は、それぞれ、３個の３ビットの入力値Ｚ2 、Ｚ1 、Ｚ0 の入力を受け付ける。【０１４５】
剰余算ＲＤ0 １２０１は、その演算結果の上位３ビット及び下位３ビットをそれぞれ、加算ＲＡ1 １２０３、ＲＡ1 １２０２へ出力する。加算ＲＡ1 １２０３は、その演算結果の上位１ビット及び下位３ビットをそれぞれ、加算ＲＡ12１２０５及びＲＡ2 １２０４へ出力する。加算ＲＡ1 １２０２は、その演算結果の上位１ビット及び下位３ビットをそれぞれ、加算ＲＡ2 １２０４及びＲＡ1 １２０７へ出力する。加算ＲＡ2 １２０４は、その演算結果の上位１ビット及び下位３ビットをそれぞれ、加算ＲＡ12１２０５及びＲＡ1 １２０８へ出力する。加算ＲＡ12１２０５は、その演算結果の１ビットを、加算ＲＡ4 １２１１へ出力する。【０１４６】
（ｂ）剰余処理１００５のうち、図２１に示す演算では、１個の入力値Ｚ3 が入力され、入力値Ｚ3 及び図２０における３個の最終の演算結果を用いて、（Ｚ3 ×２9   ｍｏｄ  ｎ）を加算している。
剰余算ＲＤ1 １２０６は、１個の３ビットの入力値Ｚ3 の入力を受け付け、その演算結果の上位３ビット及び下位３ビットをそれぞれ、加算ＲＡ1 １２０８、ＲＡ1 １２０７へ出力する。【０１４７】
加算ＲＡ1 １２０８は、その演算結果の上位１ビット及び下位３ビットをそれぞれ、加算ＲＡ12１２１０及びＲＡ2 １２０９へ出力する。加算ＲＡ1 １２０７は、その演算結果の上位１ビット及び下位３ビットをそれぞれ、加算ＲＡ2 １２０９及びＲＡ1 １２１３へ出力する。加算ＲＡ2 １２０９は、その演算結果の上位１ビット及び下位３ビットをそれぞれ、加算ＲＡ12１２１０及びＲＡ1 １２１４へ出力する。加算ＲＡ12１２１０は、その演算結果の１ビットを、          加算ＲＡ4 １２１１へ出力する。加算ＲＡ4 １２１１は、その演算結果の１ビットを、加算ＲＡ13１２１６へ出力する。【０１４８】
（ｃ）さらに、剰余処理１００５のうち、図２２に示す演算では、１個の入力値Ｚ4 が入力され、入力値Ｚ4 及び図２１における３個の最終の演算結果を用いて、（Ｚ4 ×２12  ｍｏｄ  ｎ）を加算している。
剰余算ＲＤ2 １２１２は、１個の４ビットの入力値Ｚ4 の入力を受け付け、その演算結果の上位３ビット及び下位３ビットをそれぞれ、加算ＲＡ1 １２１４、ＲＡ1 １２１３へ出力する。【０１４９】
加算ＲＡ1 １２１４は、その演算結果の上位１ビット及び下位３ビットをそれぞれ、加算ＲＡ4 １２１７及びＲＡ2 １２１５へ出力する。加算ＲＡ1 １２１３は、その演算結果の上位１ビット及び下位３ビットをそれぞれ、加算ＲＡ2 １２１５及びＲＡ1 １２１９へ出力する。加算ＲＡ2 １２１５は、その演算結果の上位１ビット及び下位３ビットをそれぞれ、加算ＲＡ4 １２１７及びＲＡ1 １２２０へ出力する。加算ＲＡ4 １２１７は、その演算結果の１ビットを、          加算ＲＡ13１２１６へ出力する。加算ＲＡ13１２１６は、その演算結果の２ビットを、剰余算ＲＤ3 １２１８へ出力する。【０１５０】
（ｄ）剰余処理１００５のうち、図２２における最終の計算結果は、３桁となるため、次に、さらなる剰余処理が必要になる。
剰余処理１００５のうち、図２３に示す演算は、その剰余処理を行う。図２３に示す演算の計算結果も３桁となる場合があり、その場合には、さらなる剰余処理が必要となり、図２３と同様の処理を繰り返す。その結果、２桁の値となれば、剰余演算結果（の出力値変換後）の値とする。【０１５１】
剰余処理１００５のうち、図２３に示す演算では、剰余算ＲＤ3 １２１８は、その演算結果の上位３ビット及び下位３ビットをそれぞれ、加算ＲＡ1 １２２０、ＲＡ1 １２１９へ出力する。加算ＲＡ1 １２２０は、その演算結果の上位１ビット及び下位３ビットをそれぞれ、加算ＲＡ4 １２２２及びＲＡ2 １２２１へ出力する。加算ＲＡ1 １２１９は、その演算結果の上位１ビットを加算ＲＡ2 １２２１へ出力し、その演算結果の下位３ビットを最終出力とする。加算ＲＡ2 １２２１は、その演算結果の上位１ビットを加算ＲＡ4 １２２２へ出力し、その演算結果の下位３ビットを最終出力とする。加算ＲＡ4 １２２２は、その演算結果の１ビットを最終出力とする。【０１５２】
（ｅ）なお、上記数値例では、ｎが６ビットの値であり、小さいため、乗算処理を各桁までの分割としているが、ビットサイズが大きくなった場合は、各桁の処理を「処理の分割（その２）」のようにさらに分割してもよい。
２．４  難読化システム１の構成及び動作
ここでは、難読化システム１を構成する難読化装置１００及び暗号処理装置３００の構成及び動作について説明する。【０１５３】
（１）難読化装置１００の構成
図３３は、難読化装置１００の構成を示す図である。
難読化装置１００は、図３３に示すように、秘密鍵ｄの入力を受け付ける入力部１０１と、秘密鍵ｄから乗算処理及び２乗算処理の処理の順番を示す乗算配置情報を生成する乗算配置情報生成部１０２と、乗算処理及び２乗算処理を分割した処理と、それに対して追加する１つ以上の入力値変換と１つ以上の出力値変換の配置情報である分割処理配置情報を生成する分割処理配置情報生成部１０３と、入力値変換及び出力値変換を示す関数を生成する変換生成部１０４と、分割処理配置情報、入力値変換及び出力値変換を用いて、テーブルを生成するテーブル生成部１０５と、乗算配置情報と分割処理配置情報を用いて、テーブルを読み出す命令の配置を示す読出命令順序情報を生成する読出情報配置部１０６と、テーブルと読出命令順序情報を用いて、難読化プログラムを生成するプログラム生成部１０７と、難読化プログラムを媒体に記録する媒体記録部１０８とを備える。【０１５４】
入力部１０１は、秘密鍵ｄを入力として受け付ける。
乗算配置情報生成部１０２は、秘密鍵ｄから乗算剰余処理及び２乗算剰余処理の処理の順番を示す乗算配置情報を生成する。これは、図４のステップＳ４０１に示す処理に対応する。図４の場合、乗算配置情報４２１は、｛２乗算剰余、乗算剰余、２乗算剰余、２乗算剰余、乗算剰余、．．．｝のような順番を示す情報となる。【０１５５】
分割処理配置情報生成部１０３は、予め与えられた配置方法に従い、乗算剰余処理と２乗算剰余処理を分割した処理とそれに対して追加する１つ以上の入力値変換と１つ以上の出力値変換の配置情報である、分割処理配置情報を生成する。なお、ここで生成する情報は、各処理や変換の配置情報のみであり、処理や変換に対応する関数は生成しない。
変換生成部１０４は、分割処理配置情報を参照して、配置した入力値変換と出力値変換に対する関数を生成する。入力値変換及び出力値変換に対する関数の生成方法については、先の「２．３  難読化装置１００で実行する難読化について」で述べたとおりである。【０１５６】
テーブル生成部１０５は、分割処理配置情報、入力値変換及び出力値変換を用いて、テーブルを生成する。テーブルの生成方法については、先の「２．３  難読化装置１００で実行する難読化について」で述べたとおりである。
読出情報配置部１０６は、乗算配置情報と分割処理配置情報を用いて、テーブルを読み出す命令を順番に配置した読出命令順序情報を生成する。具体的には、分割処理配置情報を用いて、変換後乗算剰余処理内及び変換後２乗算剰余処理内の各処理に対応するテーブル読出命令を順番に配置することでテーブル読出命令群を生成し、それらの変換後乗算剰余処理内及び変換後２乗算剰余処理内に対応するテーブル読出命令群を、乗算配置情報を用いて配置することで、テーブル読出命令を配置する。【０１５７】
プログラム生成部１０７は、上記読出命令順序情報とテーブルを合わせた難読化プログラムを生成する。
媒体記録部１０８は、難読化プログラムを媒体２００に記録する。
（２）暗号処理装置３００の構成
図３４は暗号処理装置３００の構成を示す図である。【０１５８】
暗号処理装置３００は、図３４に示すように、暗号化データまたはメッセージデータを入力する入力部３０１と、復号化データまたは署名データを出力する出力部３０２と、データメモリ３０３と、プログラムメモリ３０４と、ＣＰＵ３０５と、媒体２００から難読化プログラムを読込む媒体読込部３０６とを備える。
入力部３０１は、後述する復号化処理時に暗号化データ、署名生成処理時にメッセージデータを入力として受け付ける。【０１５９】
出力部３０２は、後述する復号化処理時に復号化データ、署名生成処理時に署名データを出力する。
データメモリ３０３は、入力である復号化データやメッセージデータ、難読化プログラムを実行する際の中間値データを記憶する。
プログラムメモリ３０４は、難読化プログラムを記憶する。【０１６０】
ＣＰＵ３０５は、難読化プログラムに記述されている命令を実行する。
媒体読込部３０６は、媒体２００から難読化プログラムを読込み、プログラムメモリ３０４に格納する。
（３）  難読化システム１の動作
難読化システム１の動作は、難読化装置１００において難読化プログラムを生成し、媒体２００に記録する「難読化処理時」の動作と、暗号処理装置３００において媒体２００に記録されている難読化プログラムを実行して復号化処理を行う「復号化処理時」と署名生成処理を行う「署名生成処理時」の動作からなる。【０１６１】
以下において、それぞれの動作について説明する。
（ａ）難読化装置１００による難読化処理時の動作
難読化装置１００による難読化処理時の動作について、図３５に示すフローチャートを用いて説明する。
難読化装置１００の入力部１０１は、秘密鍵ｄを受け付け（ステップＳ１１０１）、乗算配置情報生成部１０２は、乗算配置情報を生成し（ステップＳ１１０２）、分割処理配置情報生成部１０３は、分割処理配置情報を生成し（ステップＳ１１０３）、変換生成部１０４は、入力値変換と出力値変換に対する関数を生成し（ステップＳ１１０４）、テーブル生成部１０５は、テーブルを生成し（ステップＳ１１０５）、読出情報配置部１０６は、読出命令順序情報を生成し（ステップＳ１１０６）、プログラム生成部は、難読化プログラムを生成し（ステップＳ１１０７）、難読化装置１００の媒体記録部１０８は、難読化プログラムを媒体２００に記録する（ステップＳ１１０８）。こうして、難読化処理が終了する。【０１６２】
（ｂ）暗号処理装置３００による復号化処理の動作
暗号処理装置３００による復号化処理の動作について、図３６に示すフローチャートを用いて説明する。
暗号処理装置３００の入力部３０１は、入力である暗号化データを受け付け、対象データＸとしてデータメモリに格納し（ステップＳ１２０１）、媒体読込部３０６は、媒体２００から難読化プログラムを読み込み、プログラムメモリ３０４に格納し（ステップＳ１２０２）、ＣＰＵ３０５は、プログラムメモリ３０４に格納されている難読化プログラムにしたがって、データメモリ３０３を使用し、対象データＸのべき乗値Ｘ＾ｄ  ｍｏｄ  ｎを計算し、データメモリ３０３に格納し（ステップＳ１２０３）、出力部３０２は、データメモリ３０３に格納されている値（対象データのべき乗値）を復号化データとして出力する（ステップＳ１２０４）。こうして、復号化処理の動作が終了する。【０１６３】
（ｃ）暗号処理装置３００による署名生成処理の動作
暗号処理装置３００による署名生成処理の動作について、図３７に示すフローチャートを用いて説明する。
暗号処理装置３００の入力部３０１は、入力であるメッセージデータを受け付け、対象データＸとしてデータメモリに格納し（ステップＳ１３０１）、媒体読込部３０６は、媒体２００から難読化プログラムを読み込み、プログラムメモリ３０４に格納し（ステップＳ１３０２）、ＣＰＵ３０５は、プログラムメモリ３０４に格納されている難読化プログラムにしたがって、データメモリ３０３を使用し、対象データＸのべき乗値Ｘ＾ｄ  ｍｏｄ  ｎを計算し、データメモリ３０３に格納し（ステップＳ１３０３）、出力部３０２は、データメモリ３０３に格納されている値（対象データのべき乗値）を署名データとして出力する（ステップＳ１３０４）。こうして、署名生成処理の動作が終了する。【０１６４】
（ｄ）難読化装置１００によるテーブル化の動作
難読化装置１００によるテーブル化の動作について、図３８に示すフローチャートを用いて説明する。なお、ここでは、図１５に示す乗算処理１００２のテーブル化を一例として説明しているが、他のテーブル化の例についても同様に実現できるので、その説明は省略する。【０１６５】
難読化装置１００のテーブル生成部１０５は、図１５に示すテーブルの配置のうち、ＲＭ0 １１２１、ＲＭ1 １１２２、ＲＭ2 １１２３、ＲＡ1 １１２４、ＲＡ2 １１２５、ＲＡ3 １１２６、ＲＡ1 １１２７、ＲＡ2 １１２８、ＲＡ2 １１２９、ＲＡ4 １１３０及びＲＡ5 １１３１の接続関係のみを予め記憶している。ここで、この接続関係は、上述したようにして、設計者が作成し、データ化したものである。【０１６６】
テーブル生成部１０５は、当初は、これらの接続関係のみを記憶しているのであって、ＲＭ0 １１２１、ＲＭ1 １１２２、ＲＭ2 １１２３、ＲＡ1 １１２４、ＲＡ2 １１２５、ＲＡ3 １１２６、ＲＡ1 １１２７、ＲＡ2 １１２８、ＲＡ2 １１２９、ＲＡ4 １１３０及びＲＡ5 １１３１の内容については、記憶されていない。
難読化装置１００によるテーブル化の手順においては、上記の接続関係に従って、ＲＭ0 １１２１、ＲＭ1 １１２２、ＲＭ2 １１２３、ＲＡ1 １１２４、ＲＡ2 １１２５、ＲＡ3 １１２６、ＲＡ1 １１２７、ＲＡ2 １１２８、ＲＡ2 １１２９、ＲＡ4 １１３０及びＲＡ5 １１３１の内容を決定していく。【０１６７】
また、テーブル生成部１０５は、予め、４０種類の異なる乗算パターンテーブルを記憶している。これらの乗算パターンテーブルは、ここでは、２個の入力値を２個の出力値に変換する２入力２出力のテーブルであり、各入力値は、３ビット長であり、各出力値も、３ビット長である。
テーブル生成部１０５は、図３８に示すステップＳ１４０１〜Ｓ１４０４において、図１５に示すＲＭ0 １１２１、ＲＭ1 １１２２及びＲＭ2 １１２３について、それぞれ、上記の４０種類の乗算パターンテーブルから１個の乗算パターンテーブルをランダムに選択し（ステップＳ１４０２）、これらのＲＭ0 １１２１、ＲＭ1 １１２２及びＲＭ2 １１２３に選択した乗算パターンテーブルを割り当てる（ステップＳ１４０３）。ここで、上記の４０種類の乗算パターンテーブルから１個の乗算パターンテーブルをランダムに選択する際に、異なるＲＭについて同じ乗算パターンテーブルが選択されないようにするため、一度選択した乗算パターンテーブルを次の選択では選択しないように、選択対象から除外する。【０１６８】
次に、テーブル生成部１０５は、図３８に示すステップＳ１４０５〜Ｓ１４１０において、乗算処理１００２の先頭の入力値から最終の出力値へ至る各経路について、以下を繰り返す。
ここで、乗算処理１００２の先頭の入力値から最終の出力値へ至る経路の一例は、入力値１１４１ａから、ＲＭ0 １１２１の乗算１１２１ａ、変換１１２１ｂを介して、出力値１１４２ａへ至る経路であり、また、別の経路の一例は、入力値１１４１ｂから、ＲＭ0 １１２１の乗算１１２１ａ、変換１１２１ｃ、      ＲＡ1 １１２４の変換１１２４ａ、加算１１２４ｃ、変換１１２４ｄを介して、出力値１１４２ｂへ至る経路である。【０１６９】
このように、前記経路とは、３ビットの入力値を開始点として、１個のＲＭ及び少なくとも１個のＲＡを介して、３ビットの出力値へ至る経路である。
各経路上には、変換を配置するべき位置が予め特定されている。テーブル生成部１０５は、各経路上における変換を配置するべき位置を予め記憶している。変換を配置するべき位置とは、図１５において、例えば、ＲＭ0 １１２１において、変換１１２１ｂ及び変換１１２１ｃが配置されている位置であり、また、      ＲＡ1 １１２４において、変換１１２４ａ、変換１１２４ｂ、変換１１２４ｄ及び変換１１２４ｅが配置されている位置である。【０１７０】
テーブル生成部１０５は、各経路の先頭から、順に変換が配置される位置を１個ずつ選択していく。
選択した位置の次が、最終出力値であるなら（ステップＳ１４０６でＹＥＳ）、テーブル生成部１０５は、１個の変換を選択し、選択した変換を当該位置に配置し（ステップＳ１４０９）、この経路における処理を終了する。【０１７１】
選択した位置の次が、最終出力値でないなら（ステップＳ１４０６でＮＯ）、テーブル生成部１０５は、１個の変換を選択し、選択した変換を当該位置に配置する。ここで、同一経路において、前に変換を選択した場合には、前に選択した変換とは別の変換を選択する（ステップＳ１４０７）。次に、次の位置において、ステップＳ１４０７において配置した変換の逆変換を配置し（ステップＳ１４０８）、次に、ステップＳ１４０６へ戻って処理を繰り返す。【０１７２】
２．５  実施の形態２の効果
実施の形態２では、乗算及び２乗算の処理を分割した処理に対して、同じ個数の引数を入力とするテーブルを生成し、さらに、それらの引数に出力が依存するようにテーブルの出力値を設定することで、乗算と２乗算の処理を入力数の違いによる攻撃者の攻撃を防ぐことが可能となる。これを以下で詳しく説明する。【０１７３】
乗算は２入力１出力であり、２乗算は１入力１出力の演算であるため、これの違いにより攻撃者に攻撃される可能性がある。これに対し、実施の形態２では、上記でも述べたように通常のＲＳＡ暗号等の処理では、乗算処理の入力に含まれるが、２乗算処理の入力に含まれなかった入力を含む入力値変換及び出力値変換を、乗算処理及び２乗算処理の前後に配置し、これらを含むようなテーブルを生成している。【０１７４】
これにより、乗算処理に対応するテーブルと、２乗算処理に対応するテーブルとにおいて、入力数の違いがなくなるので、攻撃者が入力を解析し、乗算と２乗算を区別する攻撃を防ぐことが可能となる。
さらに、入力値変換または出力値変換により、２乗算処理に元々含まれない入力の値を各テーブルの出力に反映することができるため、攻撃者が出力を解析し、入力がダミーであると気づくことによる乗算と２乗算を区別する攻撃を防ぐことが可能となる。【０１７５】
実施の形態２では、上述したように、乗算及び２乗算におけるそれぞれの入力値及び出力値は非常に大きい数（１０２４ビット程度）であるため、乗算及び２乗算の処理を各桁の処理に分割している。
この場合においても、乗算についても２乗算についても、各桁の処理を４入力１出力と２入力１出力のテーブルとに分割することで、上記のような入力値変換及び出力値変換を配置しやすいような構成を取っている。【０１７６】
このようにすることで、乗算及び２乗算の処理を各桁に分割した処理に対して、乗算及び２乗算のどちらでも同じ個数の引数を入力とし、それぞれの入力が出力に影響するようなテーブルを生成することができるので、テーブルの分割の仕方から乗算であるか２乗算であるかを区別することができない。すなわち、そのテーブルを解析し乗算処理であるか２乗算処理であるかを区別する攻撃を防ぐことが可能となる。したがって、乗算と２乗算の処理を攻撃者により区別しにくくなり、本発明は有効である。【０１７７】
また、乗算処理や２乗算処理を各桁の処理のテーブルに分割することで、一つの乗算処理または２乗算処理で必要とするテーブルサイズが、２2048×（テーブルの出力バイトサイズ）バイト程度であったものが、各桁の処理を４入力１出力と２入力１出力のテーブルに分割することで、（２５６×２５６）／２×２16×（テーブルの出力バイトサイズ）＝２31×（テーブルの出力バイトサイズ）程度に削減できる。【０１７８】
さらに、同一の変換を示すテーブルを共通化することで、分割後のテーブルとして、４入力１出力のテーブルが２個、２入力１出力のテーブルが２個となり、その結果、一つの乗算処理または２乗算処理で必要とするテーブルサイズが、２×２16×（テーブルの出力バイトサイズ）＋２×２8 ×（テーブルの出力バイトサイズ）＝１３１，５８４×（テーブルの出力バイトサイズ）程度に削減できる。このように、テーブルの分割・共通化をすることで、テーブルサイズの削減が可能となる。【０１７９】
以上のように、乗算と２乗算の処理を入力数の違いによる攻撃者の攻撃を防ぐことが可能となり、また、使用するテーブルサイズが削減できるため、本発明により計算機上で実装可能なＲＳＡ暗号のソースコード難読化されたプログラムを生成可能である。
２．６  安全性についての検討
実施の形態２につき、全単射写像の総当り攻撃に対する安全性について検討する。ここで、全単射写像の総当り攻撃とは、すべての取り得る全単射写像のバリエーションから正しい全単射写像を当てる攻撃である。具体的には、全単射写像それぞれに対してテーブルを生成し、実際にプログラムに含まれるテーブルと比較することで、正しい全単射写像であるかを判定する。正しい全単射写像の場合は、テーブルの値がすべて一致する。【０１８０】
（１）乗算テーブル又は２乗算テーブルが攻撃される場合
乗算テーブル又は２乗算テーブルが攻撃される場合には、各テーブルには、上述のｇ、φの全単射写像が含まれており、両方のテーブルに対して、各テーブルに相応する正しい写像を用いる攻撃が行われないと、テーブルに対する攻撃は成功しない。
実施の形態２において上述したように、各桁を４ビットで分割する場合、ｇ、φそれぞれの全単射写像のバリエーションは１６！＝２44通りあるため、総当りを行うためには、１６！＝２44の計算量が必要である。攻撃者は、ｇ、φの全単射写像の両方を当てる必要があるため、攻撃に要する計算量は、（２44）２＝２88となる。【０１８１】
（２）加算テーブルが攻撃される場合
加算テーブルが攻撃される場合には、加算テーブルには、少なくとも、２種類φが含まれているので、攻撃に要する計算量は、（２44）2 ＝２88である。
次に、実施の形態２につき、桁毎の分割前のテーブルが乗算テーブルか２乗算テーブルであるかの総当り攻撃に対する安全性について、検討すると、乗算テーブル及び２乗算テーブルは、８０種類存在し、それぞれが乗算テーブルか２乗算テーブルである可能性があるため、総当り攻撃の計算量は、２80となる。【０１８２】
攻撃に対する安全性を向上させるためには、各桁を４ビットで分割するとともに、２種類の関数に依存して、テーブルを生成することが有効である。
３．その他の変形例
上記に説明した各実施の形態は、本発明の実施の一例であり、本発明はこの実施の形態に何ら限定されるものではなく、その主旨を逸脱しない範囲において種々なる態様で実施し得るものである。例えば、以下のような場合も本発明に含まれる。【０１８３】
（１）実施の形態２では、テーブル化の対象処理をＲＳＡ暗号における乗算剰余処理及び２乗算剰余処理とし、これらの入力を統一したが、これに限らない。
入力する数が異なる処理をテーブル化するとしてもよい。例えば、楕円曲線暗号の楕円加算（２つの点の座標を入力）と楕円２倍算（１つの点の座標を入力）の処理をテーブル化対象としてもよい。なお、楕円曲線暗号の場合でも、楕円加算と楕円２倍加算が区別されると不正解析の手がかりとなるため、本発明のように区別がつかないようにすることで攻撃を防ぐ手法は有効である。【０１８４】
なお、本発明が、暗号化に関連する処理のみではなく、入力数が異なる処理を含み、それぞれの処理を区別されると不正解析の手がかりとなってしまうようなプログラムであれば、どのようなプログラムについても適用可能であり、かつ有効であることは言うまでもない。
また、実施の形態２では、入力値が対象データＸのみである２乗算の処理と、入力値が対象データＸおよび中間値Ｙである乗算の処理とについて、入力値の数をそろえる変換を行ったが、これに限られるものではない。本発明の手法を適用すれば、入力値がＸ、Ｙである第１の処理と入力値がＹ、Ｚである第２の処理との組など、一方の入力値の集合が他方の入力値の集合を完全に包含していない場合であっても、難読化を行うことができる。この場合には、第１の処理については入力値Ｚに依存する処理（実施の形態２における入力依存加算や減算に相当）を加えた上でテーブル化し、第２の処理については入力値Ｘに依存する処理を加えた上でテーブル化すればよい。【０１８５】
（２）実施の形態２では、難読化プログラムを使用して、ＲＳＡ暗号方式の復号化処理やＲＳＡ署名方式の署名生成時処理を実行しているが、秘密鍵をべき値としたべき乗演算処理を含むものであれば何でもよい。例えば、ＲＳＡ−ＰＳＳ署名方式の署名方式であってもよいし、ＲＳＡ−ＯＡＥＰ暗号方式の復号化処理であってもよいし、ＲＳＡ−ＫＥＭ方式の復号化処理であってもよい。また、ＥｌＧａｍａｌ暗号方式の復号化処理であってもよい。【０１８６】
（３）暗号処理装置において、媒体から読み込んだ難読化プログラムをプログラムメモリに格納するとしているが、これを何回かに分けて、読込みながら、プログラムメモリに格納し、その度にＣＰＵにて実行するとしてもよい。
（４）署名生成時の処理において、入力であるメッセージを対象データとして、対象データのべき乗値を計算しているが、メッセージｍを用いてＸ＝Ｈａｓｈ（ｍ）とし、対象データＸのべき乗値を計算するとしてもよい。【０１８７】
ここで、Ｈａｓｈはハッシュ関数を示し、Ｈａｓｈ（ｍ）はメッセージｍのハッシュ値を示す。使用するハッシュ関数は、例えば、ＳＨＡ−１、ＳＨＡ−２２４、ＳＨＡ−２５６、ＳＨＡ−３８４、ＳＨＡ−５１２、ＭＤ５、ＷＨＩＲＬＰＯＯＬ、ＲＩＰＥＭＤ１２８、ＲＩＰＥＭＤ１６０である。
（５）実施の形態２において、難読化プログラムは媒体に記録して配布するとしているが、これを通信路を用いて送信するとしてもよい。【０１８８】
（６）実施の形態２において、入力値変換に入力依存減算、出力値変換に入力依存減算を含ませていたが、これに限られるものではない。例えば、入力依存減算と入力依存加算配置を逆にしてもよい。また、減算や加算に限られるものではなく、乗算と除算の組等としてもよい。すなわち、対象データＸに依存する変換が行われるのであれば、どのような変換の組でも構わない。ただし、上述したやり方でテーブルの分割によりテーブルサイズを抑える場合には、加算と減算の組とすることが望ましい。【０１８９】
また、各乗算剰余演算及び各２乗算剰余演算の直前及び直後に、当該演算への１個の入力値に依存する減算及び加算を配置するとしてもよい。
また、各乗算剰余演算及び各２乗算剰余演算をそれぞれ分解して、乗算演算及び剰余演算、２乗算演算及び剰余演算が生成された場合に、各乗算演算及び各２乗算演算の直前及び直後に、当該演算への１個の入力値に依存する減算及び加算を配置するとしてもよい。【０１９０】
（７）実施の形態２においては乗算の処理にも２乗算の処理にも入力依存加算および入力依存減算を追加した上で、テーブル化を行っていたが、これに限られるものではない。すなわち、本発明では、少なくとも２乗算の処理について対象データＸに依存する変換（入力依存加算）が含まれれば、各テーブルの入出力値の関係を解析しても乗算のテーブルと２乗算のテーブルとを区別することが難しくなるので、そのようにしてもよい。【０１９１】
（８）従来技術において、ＲＳＡ暗号をバイナリ法を用いて復号化する場合、処理をランダムなテーブルに変換する従来方法を応用した方法では、乗算と２乗算とで入力数が異なるため、これを利用して攻撃者が解析可能となるという課題がある。より具体的には、各テーブルへの入力数から、そのテーブルが乗算を行うか２乗算を行うのかを区別することができるという問題点がある。【０１９２】
本発明では、乗算及び２乗算の処理に対して、同じ個数の引数を入力とするテーブルを生成し、さらに、それらの引数に出力が依存するようにテーブルの出力値を設定する。より具体的には、２乗算の処理に対して、乗算でのみ必要な引数を使った追加処理を付け加えた上でテーブル化することにより、引数の数を乗算と揃える。さらに、この場合、出力が全ての引数に依存するため、実際には処理されないダミーの引数を追加する場合と異なり、追加した引数があるか否かが分からないようになる。【０１９３】
（９）本発明は、乗算と２乗算の入力数を異なることによる攻撃を防ぐソースコード難読化システム、装置および方法を提供する。
上記に説明したように、本発明は、１つ以上の数からなる第一の処理入力情報から、１以上の数からなる第一の処理出力情報を算出する第一の処理を入力とし、第一のテーブルを出力する難読化装置であって、１以上の数からなる第一の変換入力情報を、１以上の数からなる第一の変換出力情報に変換する第一の変換手段と、１以上の数からなる第一のテーブル入力情報と１以上の数からなる第一のテーブル出力情報の対応を示す前記第一のテーブルを生成する第一のテーブル生成手段とを有し、前記第一のテーブル入力情報は、前記第一の処理入力情報または第一の変換入力情報に含まれる数と、１以上の数からなる追加入力情報に含まれる数からなり、前記第一のテーブル出力情報は、前記第一の処理出力情報または第一の変換出力情報を含む。【０１９４】
ここで、前記難読化装置は、さらに、１以上の数からなる第二の変換入力情報を、１以上の数からなる第二の変換出力情報に変換する第二の変換手段を有し、前記第一のテーブル入力情報は、前記第一の変換入力情報に含まれる数と、前記追加入力情報に含まれる数からなり、前記第一の処理入力情報は、前記変換出力情報の少なくとも１つの数を含み、前記第二の変換入力情報は、前記第一の処理出力情報の少なくとも１つの数を含み、前記第一のテーブル出力情報は、前記第二の変換出力情報を含むとしてもよい。【０１９５】
ここで、前記第一の変換手段による変換は、前記第一のテーブル入力情報に基づく変換であるとしてもよい。
ここで、前記難読化装置は、前記第一の処理に加え、１以上の数からなる第二の処理入力情報から、１以上の数からなる第二の処理出力情報を算出する第二の処理を入力とし、前記第二の処理入力情報のうち、前記第一の処理入力情報に含まれない数を前記追加入力情報とする追加入力情報決定手段を有するとしてもよい。【０１９６】
ここで、前記第二の処理は、第一の数と第二の数からなる前記第二の処理入力情報から、前記第一の数と前記第二の数の積からなる前記第二の処理出力情報を算出する処理であり、前記第一の処理は、前記第一の数からなる前記第一の処理入力情報から、前記第一の数の２乗からなる前記第一の処理出力情報を算出する処理であるとしてもよい。
ここで、前記難読化装置は、前記第一の処理と前記第二の処理に加え、１以上の数、または、少なくとも１つの第二の中間値情報の数を含む第三の処理入力情報から、１以上の数からなる第三の処理出力情報を算出する第三の処理を入力とし、前記第一のテーブルおよび第二のテーブルを出力する難読化装置であって、１以上の数からなる第三の変換入力情報を、１以上の数からなる第三の変換出力情報に変換する第三の変換手段と、１以上の数からなる第二のテーブル入力情報と１以上の数からなる第二のテーブル出力情報の対応を示す前記第二のテーブルを生成する第二のテーブル生成手段と、１以上の数からなる第三の変換入力情報を、１以上の数からなる第三の変換出力情報に変換する第三の変換手段とを有し、前記第二のテーブル入力情報は、少なくとも１つの前記第一のテーブル出力情報を含み、前記第三の変換入力情報は、少なくとも１つの前記第一のテーブル出力情報を含み、前記第二のテーブル出力情報は、前記第三の処理出力情報を含むとしてもよい。【０１９７】
ここで、前記難読化装置は、前記第一の処理、前記第二の処理、前記第三の処理に加え、１以上の数からなる第四の処理入力情報から、１以上の数からなる第四の処理出力情報を算出する第四の処理を入力とし、前記第二のテーブル入力情報は、少なくとも１つの前記第一のテーブル出力情報に含まれる数と、第二の追加入力情報を含み、前記第四の処理入力情報のうち、前記第三の処理入力情報に含まれない数を前記第二の追加入力情報とする第二の追加入力情報決定手段を有するとしてもよい。【０１９８】
ここで、前記難読化装置はさらに、前記第一の変換手段および前記第三の変換手段による変換は、前記第一の処理入力情報に含まれる数のうち、前記第三の処理入力情報に含まれる数に基づく変換であるとしてもよい。
ここで、前記難読化装置は、１以上の数からなる第四の変換入力情報を、１以上の数からなる第四の変換出力情報に変換する第四の変換手段を有し、前記第四の変換入力情報は、前記第三の処理出力情報の少なくとも１つの数を含み、前記第二のテーブル出力情報は、前記第三の処理出力情報を含む替わりに、前記第四の処理出力情報を含むとしてもよい。【０１９９】
ここで、前記難読化装置は、１つ以上の数からなる第五の処理入力情報から、１以上の数からなる第五の処理出力情報を算出する第五の処理を入力とし、前記第五の処理を４つの数からなる処理入力情報から、１つの数からなる処理出力情報を算出する１以上の４入力１出力処理と、２つの数からなる処理入力情報から、１つの数からなる処理出力情報を算出する１以上２入力１出力処理に分割する処理分割手段を有し、前記４入力１出力処理と前記２入力１出力処理の少なくとも１つを前記第一の処理とし、前記４入力１出力処理と前記２入力１出力処理の少なくとも１つを前記第三の処理としてもよい。【０２００】
また、本発明は、１つ以上の数からなる第一の処理入力情報から、１以上の数からなる第一の処理出力情報を算出する第一の処理を入力とし、第一のテーブルを出力する難読化方法であって、１以上の数からなる第一の変換入力情報を、１以上の数からなる第一の変換出力情報に変換する第一の変換ステップと、１以上の数からなる第一のテーブル入力情報と１以上の数からなる第一のテーブル出力情報の対応を示す前記第一のテーブルを生成する第一のテーブル生成ステップとを有し、前記第一のテーブル入力情報は、前記第一の処理入力情報または第一の変換入力情報に含まれる数と、１以上の数からなる追加入力情報に含まれる数からなり、前記第一のテーブル出力情報は、前記第一の処理出力情報または第一の変換出力情報を含むとしてもよい。【０２０１】
ここで、前記難読化方法は、さらに、１以上の数からなる第二の変換入力情報を、１以上の数からなる第二の変換出力情報に変換する第二の変換ステップを有し、前記第一のテーブル入力情報は、前記第一の変換入力情報に含まれる数と、前記追加入力情報に含まれる数からなり、前記第一の処理入力情報は、前記変換出力情報の少なくとも１つの数を含み、前記第二の変換入力情報は、前記第一の処理出力情報の少なくとも１つの数を含み、前記第一のテーブル出力情報は、前記第二の変換出力情報を含むとしてもよい。【０２０２】
ここで、前記第一の変換ステップによる変換は、前記第一のテーブル入力情報に基づく変換であるとしてもよい。
ここで、前記難読化方法は、前記第一の処理に加え、１以上の数からなる第二の処理入力情報から、１以上の数からなる第二の処理出力情報を算出する第二の処理を入力とし、前記第二の処理入力情報のうち、前記第一の処理入力情報に含まれない数を前記追加入力情報とする追加入力情報決定ステップを有するとしてもよい。【０２０３】
ここで、前記第二の処理は、第一の数と第二の数からなる前記第二の処理入力情報から、前記第一の数と前記第二の数の積からなる前記第二の処理出力情報を算出する処理であり、前記第一の処理は、前記第一の数からなる前記第一の処理入力情報から、前記第一の数の２乗からなる前記第一の処理出力情報を算出する処理であるとしてもよい。
ここで、前記難読化方法は、前記第一の処理と前記第二の処理に加え、１以上の数、または、少なくとも１つの第二の中間値情報の数を含む第三の処理入力情報から、１以上の数からなる第三の処理出力情報を算出する第三の処理を入力とし、前記第一のテーブルおよび第二のテーブルを出力する難読化方法であって、１以上の数からなる第三の変換入力情報を、１以上の数からなる第三の変換出力情報に変換する第三の変換ステップと、１以上の数からなる第二のテーブル入力情報と１以上の数からなる第二のテーブル出力情報の対応を示す前記第二のテーブルを生成する第二のテーブル生成ステップと、１以上の数からなる第三の変換入力情報を、１以上の数からなる第三の変換出力情報に変換する第三の変換ステップとを有し、前記第二のテーブル入力情報は、少なくとも１つの前記第一のテーブル出力情報を含み、前記第三の変換入力情報は、少なくとも１つの前記第一のテーブル出力情報を含み、前記第二のテーブル出力情報は、前記第三の処理出力情報を含むとしてもよい。【０２０４】
ここで、前記難読化方法は、前記第一の処理、前記第二の処理、前記第三の処理に加え、１以上の数からなる第四の処理入力情報から、１以上の数からなる第四の処理出力情報を算出する第四の処理を入力とし、前記第二のテーブル入力情報は、少なくとも１つの前記第一のテーブル出力情報に含まれる数と、第二の追加入力情報を含み、前記第四の処理入力情報のうち、前記第三の処理入力情報に含まれない数を前記第二の追加入力情報とする第二の追加入力情報決定ステップを有するとしてもよい。【０２０５】
ここで、前記難読化方法において、前記第一の変換ステップおよび前記第三の変換ステップによる変換は、前記第一の処理入力情報に含まれる数のうち、前記第三の処理入力情報に含まれる数に基づく変換であるとしてもよい。
ここで、前記難読化方法は、１以上の数からなる第四の変換入力情報を、１以上の数からなる第四の変換出力情報に変換する第四の変換ステップを有し、前記第四の変換入力情報は、前記第三の処理出力情報の少なくとも１つの数を含み、前記第二のテーブル出力情報は、前記第三の処理出力情報を含む替わりに、前記第四の処理出力情報を含むとしてもよい。【０２０６】
ここで、前記難読化方法は、１つ以上の数からなる第五の処理入力情報から、１以上の数からなる第五の処理出力情報を算出する第五の処理を入力とし、前記第五の処理を４つの数からなる処理入力情報から、１つの数からなる処理出力情報を算出する１以上の４入力１出力処理と、２つの数からなる処理入力情報から、１つの数からなる処理出力情報を算出する１以上２入力１出力処理に分割する処理分割ステップを有し、前記４入力１出力処理と前記２入力１出力処理の少なくとも１つを前記第一の処理とし、前記４入力１出力処理と前記２入力１出力処理の少なくとも１つを前記第三の処理としてもよい。【０２０７】
また、本発明は、前記難読化装置と、プログラムと、前記プログラムを実行する情報処理装置から構成される情報処理システムであって、前記プログラムは、前記第一のテーブルを用いて、前記第一のテーブル入力情報から前記第一のテーブル出力情報を算出する処理を含む。
また、本発明は、前記難読化装置と、プログラムと、前記プログラムを実行する情報処理装置から構成される情報処理システムにおけるプログラムであって、前記第一のテーブルを用いて、前記第一のテーブル入力情報から前記第一のテーブル出力情報を算出する処理を含む。【０２０８】
ここで、前記第一の処理は、復号処理の一部であるとしてもよい。
ここで、前記第一の処理は、署名生成処理の一部であるとしてもよい。
また、本発明は、前記プログラムを録した記録媒体である。
また、本発明は、前記難読化装置と、プログラムと、前記プログラムを実行する情報処理装置から構成される情報処理システムにおける情報処理装置であって、前記プログラムは、前記第一のテーブルを用いて、前記第一のテーブル入力情報から前記第一のテーブル出力情報を算出する処理を含む。【０２０９】
また、本発明は、１つ以上の数からなる第一の処理入力情報から、１以上の数からなる第一の処理出力情報を算出する第一の処理を入力とし、第一のテーブルを出力する難読化装置の集積回路であって、１以上の数からなる第一の変換入力情報を、１以上の数からなる第一の変換出力情報に変換する第一の変換手段と、１以上の数からなる第一のテーブル入力情報と１以上の数からなる第一のテーブル出力情報の対応を示す前記第一のテーブルを生成する第一のテーブル生成手段とを有し、前記第一のテーブル入力情報は、前記第一の処理入力情報または第一の変換入力情報に含まれる数と、１以上の数からなる追加入力情報に含まれる数からなり、前記第一のテーブル出力情報は、前記第一の処理出力情報または第一の変換出力情報を含む。【０２１０】
また、本発明は、前記第一の処理を含む情報処理を行う情報処理装置の集積回路であって、前記第一のテーブルを保持するテーブル保持手段と、前記第一のテーブル入力情報を入力とし、前記第一のテーブル出力情報を出力する出力値算出手段とを有する。
また、前記難読化装置は、前記第一のテーブルの代わりに、プログラムを出力し、前記難読化装置は、さらに、前記第一のテーブルと、１以上のプログラム命令からなるプログラム命令群からなる前記プログラムを生成するプログラム生成手段を有し、前記プログラム命令群は、前記第一のテーブル入力情報を入力とし、対応する前記第一のテーブル出力情報を出力する処理を含むとしてもよい。【０２１１】
また、本発明は、１つ以上の入力値の集合である第１の入力値群を用いた処理を行う第１の処理と、前記第１の処理よりも多くの入力値が含まれる集合である第２の入力値群を用いた処理を行う第２の処理とを含むプログラムを難読化して難読化プログラムを生成する難読化装置であって、前記プログラムを受け付ける入力手段と、前記第２の入力値群と前記第２の処理結果とを対応付けた第２テーブルと、前記第１の入力値群および追加入力値群と変換後の第１の処理の処理結果とを対応付けた第１テーブルとを生成するテーブル生成手段と、前記プログラムにおける前記第１の処理を、前記第１の入力値群を用いて前記第１テーブルから前記処理結果を取り出す処理に置き換え、かつ、前記第２の処理を、前記第２の入力値群を用いて前記第２テーブルから前記処理結果を取り出す処理に置き換えて前記難読化プログラムを生成するプログラム生成手段とを備え、前記追加入力値群は、前記第２の入力値群のうち前記第１の入力値群に含まれない入力値の集合であり、前記変換後の第１の処理は、前記第１の処理に前記追加入力値群を用いる処理を追加した処理である。【０２１２】
これらの構成によると、乗算と２乗算の入力数が異なることによる攻撃を防ぐことができ、その価値は大きい。
（１０）上記の各装置は、具体的には、マイクロプロセッサ、ＲＯＭ、ＲＡＭ、ハードディスクユニット、ディスプレイユニット、キーボード、マウスなどから構成されるコンピュータシステムである。前記ＲＡＭまたはハードディスクユニットには、コンピュータプログラムが記憶されている。前記マイクロプロセッサが、前記コンピュータプログラムにしたがって動作することにより、各装置は、その機能を達成する。ここでコンピュータプログラムは、所定の機能を達成するために、コンピュータに対する指令を示す命令コードが複数個組み合わされて構成されたものである。【０２１３】
（１１）上記の各装置を構成する構成要素の一部または全部は、１個のシステムＬＳＩ（Ｌａｒｇｅ  Ｓｃａｌｅ  Ｉｎｔｅｇｒａｔｉｏｎ：大規模集積回路）から構成されているとしてもよい。システムＬＳＩは、複数の構成部を１個のチップ上に集積して製造された超多機能ＬＳＩであり、具体的には、マイクロプロセッサ、ＲＯＭ、ＲＡＭなどを含んで構成されるコンピュータシステムである。前記ＲＡＭには、コンピュータプログラムが記憶されている。前記マイクロプロセッサが、前記コンピュータプログラムにしたがって動作することにより、システムＬＳＩは、その機能を達成する。【０２１４】
また、上記の各装置を構成する構成要素の各部は、個別に１チップ化されていても良いし、一部又は全てを含むように１チップ化されてもよい。
また、ここでは、システムＬＳＩとしたが、集積度の違いにより、ＩＣ、ＬＳＩ、スーパーＬＳＩ、ウルトラＬＳＩと呼称されることもある。また、集積回路化の手法はＬＳＩに限るものではなく、専用回路又は汎用プロセッサで実現してもよい。ＬＳＩ製造後に、プログラムすることが可能なＦＰＧＡ（Ｆｉｅｌｄ  Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙ）や、ＬＳＩ内部の回路セルの接続や設定を再構成可能なリコンフィギュラブル・プロセッサーを利用しても良い。【０２１５】
さらには、半導体技術の進歩又は派生する別技術によりＬＳＩに置き換わる集積回路化の技術が登場すれば、当然、その技術を用いて機能ブロックの集積化を行ってもよい。バイオ技術の適応等が可能性としてありえる。
（１２）上記の各装置を構成する構成要素の一部または全部は、各装置に脱着可能なＩＣカードまたは単体のモジュールから構成されているとしてもよい。前記ＩＣカードまたは前記モジュールは、マイクロプロセッサ、ＲＯＭ、ＲＡＭなどから構成されるコンピュータシステムである。前記ＩＣカードまたは前記モジュールは、上記の超多機能ＬＳＩを含むとしてもよい。マイクロプロセッサが、コンピュータプログラムにしたがって動作することにより、前記ＩＣカードまたは前記モジュールは、その機能を達成する。このＩＣカードまたはこのモジュールは、耐タンパ性を有するとしてもよい。【０２１６】
（１３）本発明は、上記に示す方法であるとしてもよい。また、これらの方法をコンピュータにより実現するコンピュータプログラムであるとしてもよいし、前記コンピュータプログラムからなるデジタル信号であるとしてもよい。
（１４）また、本発明は、前記コンピュータプログラムまたは前記デジタル信号をコンピュータ読み取り可能な記録媒体、例えば、フレキシブルディスク、ハードディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ、ＤＶＤ−ＲＯＭ、ＤＶＤ−ＲＡＭ、ＢＤ（Ｂｌｕ−ｒａｙ  Ｄｉｓｃ）、半導体メモリなどに記録したものとしてもよい。また、これらの記録媒体に記録されている前記デジタル信号であるとしてもよい。【０２１７】
（１５）また、本発明は、前記コンピュータプログラムまたは前記デジタル信号を、電気通信回線、無線または有線通信回線、インターネットを代表とするネットワーク、データ放送等を経由して伝送するものとしてもよい。
（１６）また、本発明は、マイクロプロセッサとメモリを備えたコンピュータシステムであって、前記メモリは、上記コンピュータプログラムを記憶しており、前記マイクロプロセッサは、前記コンピュータプログラムにしたがって動作するとしてもよい。【０２１８】
（１７）また、前記プログラムまたは前記デジタル信号を前記記録媒体に記録して移送することにより、または前記プログラムまたは前記デジタル信号を前記ネットワーク等を経由して移送することにより、独立した他のコンピュータシステムにより実施するとしてもよい。
（１８）本発明は、上記の実施の形態及び変形例の組合せであってもよい。
【産業上の利用可能性】
【０２１９】
これらの構成によると、乗算と２乗算の入力数が異なることによる攻撃を防ぐことができる。
本発明を構成する各装置は、情報を暗号化して復号化することにより第三者に知られないように情報を秘密に扱い、情報にデジタル署名を施し、署名検証を施すことにより情報の改ざんや他人によるなりすましなどを防止するなど、情報を安全にまた確実に扱う必要があるあらゆる産業において、経営的に、継続的及び反復的に使用することができる。また、本発明を構成する各装置は、電器機器製造産業において、経営的に、また継続的及び反復的に、製造し、販売することができる。
【図１】
2007126049.tif 000003
【図２】
2007126049.tif 000004
【図３】
2007126049.tif 000005
【図４】
2007126049.tif 000006
【図５】
2007126049.tif 000007
【図６】
2007126049.tif 000008
【図７】
2007126049.tif 000009
【図８】
2007126049.tif 000010
【図９】
2007126049.tif 000011
【図１０】
2007126049.tif 000012
【図１１】
2007126049.tif 000013
【図１２】
2007126049.tif 000014
【図１３】
2007126049.tif 000015
【図１４】
2007126049.tif 000016
【図１５】
2007126049.tif 000017
【図１６】
2007126049.tif 000018
【図１７】
2007126049.tif 000019
【図１８】
2007126049.tif 000020
【図１９】
2007126049.tif 000021
【図２０】
2007126049.tif 000022
【図２１】
2007126049.tif 000023
【図２２】
2007126049.tif 000024
【図２３】
2007126049.tif 000025
【図２４】
2007126049.tif 000026
【図２５】
2007126049.tif 000027
【図２６】
2007126049.tif 000028
【図２７】
2007126049.tif 000029
【図２８】
2007126049.tif 000030
【図２９】
2007126049.tif 000031
【図３０】
2007126049.tif 000032
【図３１】
2007126049.tif 000033
【図３２】
2007126049.tif 000034
【図３３】
2007126049.tif 000035
【図３４】
2007126049.tif 000036
【図３５】
2007126049.tif 000037
【図３６】
2007126049.tif 000038
【図３７】
2007126049.tif 000039
【図３８】
2007126049.tif 000040
【図３９】
2007126049.tif 000041
【図４０】
2007126049.tif 000042
【図４１】
2007126049.tif 000043
【図４２】
2007126049.tif 000044
【図４３】
2007126049.tif 000045
【手続補正書】
【提出日】平成19年8月9日(2007.8.9)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
鍵情報を用いて対象情報を安全又は確実に扱うセキュリティ演算を含む情報セキュリティプログラムを難読化するプログラム難読化装置であって、
前記セキュリティ演算と等価となるように、複数入力が必要な第１基本演算と、前記複数入力の一部のみ必要とする第２基本演算とを含む複数の基本演算が鍵情報により定まる順序で配置されている前記情報セキュリティプログラムを取得する取得手段と、
前記情報セキュリティプログラムに含まれる各第２基本演算について、当該第２基本演算の前後に、当該第２基本演算において必要とされない入力に依存する入力依存変換とその逆変換である入力依存逆変換を配置する変換手段と、
各第２基本演算について、直前に配置された前記入力依存変換、当該第２基本演算及び直後に配置された前記入力依存逆変換からなる一組の演算と等価の演算結果を得るテーブルを生成し、当該テーブルを参照する参照命令を生成するテーブル生成手段と、
生成された前記テーブル及び前記参照命令を含む難読化プログラムを出力する出力手段と
を備えることを特徴とするプログラム難読化装置。
【請求項２】
前記変換手段は、さらに、前記情報セキュリティプログラムに含まれる各第１基本演算について、当該第１基本演算の前後のいずれか、又は両方に、当該第１基本演算において必要な入力に依存する入力依存変換とその逆変換である入力依存逆変換を配置する
ことを特徴とする請求項１に記載のプログラム難読化装置。
【請求項３】
前記変換手段において、前記入力依存変換は減算であり、前記入力依存逆変換は加算である
ことを特徴とする請求項２に記載のプログラム難読化装置。
【請求項４】
前記変換手段は、さらに、前記情報セキュリティプログラムの先頭に配置された基本演算を除くその他の基本演算のそれぞれについて、当該基本演算の直前に、当該基本演算の直前の基本演算の演算結果に第１の変換を施す第１変換演算と、前記第１変換演算の演算結果に、第１の変換の逆変換である第２の変換を施す第２変換演算とを配置し、
前記テーブル生成手段は、
さらに、前記情報セキュリティプログラムの先頭に配置された基本演算とその直後に配置された第１変換演算とからなる一組の演算と等価の演算結果を得るテーブルを生成し、当該テーブルを参照する参照命令を生成し、
中間に配置された各基本演算について、直前に配置された前記減算、当該基本演算及び直後に配置された前記加算に加えて、第２変換演算及び第１変換演算からなる一組の演算と等価の演算結果を得る前記テーブルを生成し、当該テーブルを参照する前記参照命令を生成し、
さらに、前記情報セキュリティプログラムの末尾に配置された基本演算とその直前に配置された第２変換演算とからなる一組の演算と等価の演算結果を得るテーブルを生成し、当該テーブルを参照する参照命令を生成し、
前記出力手段は、生成された前記テーブル及び前記参照命令を含む前記難読化プログラムを出力する
ことを特徴とする請求項３に記載のプログラム難読化装置。
【請求項５】
前記変換手段は、前記基本演算、前記減算、前記加算、前記第１変換演算及び前記第２変換演算を、桁毎に分解して、複数の桁演算を生成し、生成した前記桁演算を配置し、
前記テーブル生成手段は、
前記情報セキュリティプログラムの先頭に配置された基本演算とその直後に配置された第１変換演算とからなる一組の演算と等価の演算結果が得られるように、生成した前記桁演算と等価の演算結果が得られる桁演算テーブルを生成し、当該桁演算テーブルを参照する桁演算参照命令を生成し、
中間に配置された各基本演算について、直前に配置された前記減算、当該基本演算及び直後に配置された前記加算、第２変換演算及び第１変換演算からなる一組の演算と等価の演算結果が得られるように、生成した前記桁演算と等価の演算結果が得られる桁演算テーブルを生成し、当該桁演算テーブルを参照する桁演算参照命令を生成し、
前記情報セキュリティプログラムの末尾に配置された基本演算とその直前に配置された第２変換演算とからなる一組の演算と等価の演算結果が得られるように、生成した前記桁演算と等価の演算結果が得られる桁演算テーブルを生成し、当該桁演算テーブルを参照する桁演算参照命令を生成し、
前記出力手段は、生成された前記桁演算テーブル及び前記桁演算参照命令を含む前記難読化プログラムを出力する
ことを特徴とする請求項４に記載のプログラム難読化装置。
【請求項６】
前記テーブル生成手段は、桁演算テーブルの生成に際して、所定数個の共通化されたテーブルから、１個のテーブルを選択する
ことを特徴とする請求項５に記載のプログラム難読化装置。
【請求項７】
前記セキュリティ演算は、法ｎの元で、鍵情報である秘密鍵ｄを用いる対象情報Ｃに対するべき乗剰余演算Ｃｎｍｏｄ  ｎであり、
鍵情報により定まる順序で配置された入力数の異なる前記複数の基本演算は、べき乗剰余演算Ｃｎｍｏｄ  ｎと等価になるように、バイナリ法により、前記基本演算として、乗算剰余演算と２乗剰余演算とが、秘密鍵ｄの各ビット値に基づいて、配置されたものであり、
前記変換手段は、中間に配置された乗算剰余演算又は２乗剰余演算の直前及び直後に、当該乗算剰余演算又は２乗剰余演算への１個の入力値に依存する減算及び加算を配置し、
前記テーブル生成手段は、中間に配置された各乗算剰余演算又は２乗剰余演算について、直前に配置された前記減算、当該乗算剰余演算又は２乗剰余演算及び直後に配置された前記加算からなる一組の演算と等価の演算結果を得るテーブルを生成する
ことを特徴とする請求項３に記載のプログラム難読化装置。
【請求項８】
前記情報セキュリティプログラムは、べき乗剰余演算Ｃｎｍｏｄ  ｎを用いて、前記対象情報に、秘密通信、デジタル署名又は署名検証を施すためのコンピュータプログラムである
ことを特徴とする請求項７に記載のプログラム難読化装置。
【請求項９】
前記セキュリティ演算は、法ｎの元で、鍵情報である秘密鍵ｄを用いる対象情報Ｃに対するべき乗剰余演算Ｃｎｍｏｄ  ｎであり、
鍵情報により定まる順序で配置された入力数の異なる前記複数の基本演算は、べき乗剰余演算Ｃｎｍｏｄ  ｎと等価になるように、バイナリ法により、前記基本演算として、乗算剰余演算と２乗剰余演算とが、秘密鍵ｄの各ビット値に基づいて、配置されたものであり、
前記変換手段は、中間に配置された各乗算剰余演算を分解して、乗算演算及び剰余演算を配置し、配置された乗算演算の直前及び直後に、当該乗算演算への１個の入力値に依存する減算及び加算を配置し、中間に配置された各２乗算剰余演算を分解して、２乗算演算及び剰余演算を配置し、配置された２乗算演算の直前及び直後に、当該２乗算演算への１個の入力値に依存する減算及び加算を配置し、
前記テーブル生成手段は、中間に配置された各乗算演算又は各２乗演算について、直前に配置された前記減算、当該乗算演算又は２乗演算及び直後に配置された前記加算からなる一組の演算と等価の演算結果を得るテーブルを生成する
ことを特徴とする請求項３に記載のプログラム難読化装置。
【請求項１０】
前記取得手段、前記変換手段、前記テーブル生成手段及び前記出力手段は、集積回路を構成する
ことを特徴とする請求項１に記載のプログラム難読化装置。
【請求項１１】
プログラム難読化装置及びプログラム実行装置から構成される難読化システムであって、
鍵情報を用いて対象情報を安全又は確実に扱うセキュリティ演算を含む情報セキュリティプログラムを難読化する前記プログラム難読化装置は、
前記セキュリティ演算と等価となるように、複数入力が必要な第１基本演算と、前記複数入力の一部のみ必要とする第２基本演算とを含む複数の基本演算が鍵情報により定まる順序で配置されている前記情報セキュリティプログラムを取得する取得手段と、
前記情報セキュリティプログラムに含まれる各第２基本演算について、当該第２基本演算の前後に、当該第２基本演算において必要とされない入力に依存する入力依存変換とその逆変換である入力依存逆変換を配置する変換手段と、
各第２基本演算について、直前に配置された前記入力依存変換、当該第２基本演算及び直後に配置された前記入力依存逆変換からなる一組の演算と等価の演算結果を得るテーブルを生成し、当該テーブルを参照する参照命令を生成するテーブル生成手段と、
生成された前記テーブル及び前記参照命令を含む難読化プログラムを出力する出力手段と
を備え、
前記プログラム実行装置は、
前記難読化プログラムを取得する手段と、
取得した前記難読化プログラムに含まれている参照命令に従って、当該難読化プログラムに含まれているテーブルを参照することにより、鍵情報を用いて対象情報を安全又は確実に扱う
ことを特徴とするプログラム難読化システム。
【請求項１２】
鍵情報を用いて対象情報を安全又は確実に扱うセキュリティ演算を含む情報セキュリティプログラムを難読化するプログラム難読化装置において用いられるプログラム難読化方法であって、
前記セキュリティ演算と等価となるように、複数入力が必要な第１基本演算と、前記複数入力の一部のみ必要とする第２基本演算とを含む複数の基本演算が鍵情報により定まる順序で配置されている前記情報セキュリティプログラムを取得する取得ステップと、
前記情報セキュリティプログラムに含まれる各第２基本演算について、当該第２基本演算の前後に、当該第２基本演算において必要とされない入力に依存する入力依存変換とその逆変換である入力依存逆変換を配置する変換ステップと、
各第２基本演算について、直前に配置された前記入力依存変換、当該第２基本演算及び直後に配置された前記入力依存逆変換からなる一組の演算と等価の演算結果を得るテーブルを生成し、当該テーブルを参照する参照命令を生成するテーブル生成ステップと、
生成された前記テーブル及び前記参照命令を含む難読化プログラムを出力する出力ステップと
を含むことを特徴とするプログラム難読化方法。
【請求項１３】
鍵情報を用いて対象情報を安全又は確実に扱うセキュリティ演算を含む情報セキュリティプログラムを難読化するプログラム難読化装置において用いられるプログラム難読化のためのコンピュータプログラムを記録しているコンピュータ読み取り可能な記録媒体であって、
前記コンピュータプログラムは、コンピュータに、
前記セキュリティ演算と等価となるように、複数入力が必要な第１基本演算と、前記複数入力の一部のみ必要とする第２基本演算とを含む複数の基本演算が鍵情報により定まる順序で配置されている前記情報セキュリティプログラムを取得する取得ステップと、
前記情報セキュリティプログラムに含まれる各第２基本演算について、当該第２基本演算の前後に、当該第２基本演算において必要とされない入力に依存する入力依存変換とその逆変換である入力依存逆変換を配置する変換ステップと、
各第２基本演算について、直前に配置された前記入力依存変換、当該第２基本演算及び直後に配置された前記入力依存逆変換からなる一組の演算と等価の演算結果を得るテーブルを生成し、当該テーブルを参照する参照命令を生成するテーブル生成ステップと、
生成された前記テーブル及び前記参照命令を含む難読化プログラムを出力する出力ステップとを実行させる
ことを特徴とする記録媒体。
【請求項１４】
鍵情報を用いて対象情報を安全又は確実に扱うセキュリティ演算を含む情報セキュリティプログラムを難読化するプログラム難読化装置において用いられるプログラム難読化のためのコンピュータプログラムであって、
前記コンピュータプログラムは、コンピュータに、
前記セキュリティ演算と等価となるように、複数入力が必要な第１基本演算と、前記複数入力の一部のみ必要とする第２基本演算とを含む複数の基本演算が鍵情報により定まる順序で配置されている前記情報セキュリティプログラムを取得する取得ステップと、
前記情報セキュリティプログラムに含まれる各第２基本演算について、当該第２基本演算の前後に、当該第２基本演算において必要とされない入力に依存する入力依存変換とその逆変換である入力依存逆変換を配置する変換ステップと、
各第２基本演算について、直前に配置された前記入力依存変換、当該第２基本演算及び直後に配置された前記入力依存逆変換からなる一組の演算と等価の演算結果を得るテーブルを生成し、当該テーブルを参照する参照命令を生成するテーブル生成ステップと、
生成された前記テーブル及び前記参照命令を含む難読化プログラムを出力する出力ステップとを実行させる
ことを特徴とするコンビュータプログラム。
【請求項１５】
前記変換手段は、前記入力依存変換及び前記入力依存逆変換として、それぞれ、前記第１基本演算に必要な入力数と同じ数の入力に依存する変換を配置する
ことを特徴とする請求項１に記載のプログラム難読化装置。
【請求項１６】
前記入力依存変換及び前記入力依存逆変換は、それぞれ、前記第１基本演算に必要であり、かつ、前記第２基本演算に必要でない入力に依存する
ことを特徴とする請求項１６に記載のブログラム難読化装置。
【手続補正書】
【提出日】平成20年10月23日(2008.10.23)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
鍵情報を用いて対象情報を安全又は確実に扱うセキュリティ演算を含む情報セキュリティプログラムを難読化するプログラム難読化装置であって、
前記セキュリティ演算と等価となるように、複数入力が必要な第１基本演算と、前記複数入力の一部のみ必要とする第２基本演算とを含む複数の基本演算が鍵情報により定まる順序で配置されている前記情報セキュリティプログラムを取得する取得手段と、
前記情報セキュリティプログラムに含まれる各第２基本演算について、当該第２基本演算の前後に、当該第２基本演算において必要とされない入力に依存する入力依存変換とその逆変換である入力依存逆変換を配置する変換手段と、
各第２基本演算について、直前に配置された前記入力依存変換、当該第２基本演算及び直後に配置された前記入力依存逆変換からなる一組の演算と等価の演算結果を得るテーブルを生成し、当該テーブルを参照する参照命令を生成するテーブル生成手段と、
生成された前記テーブル及び前記参照命令を含む難読化プログラムを出力する出力手段と
を備えることを特徴とするプログラム難読化装置。
【請求項２】
前記変換手段は、さらに、前記情報セキュリティプログラムに含まれる各第１基本演算について、当該第１基本演算の前後のいずれか、又は両方に、当該第１基本演算において必要な入力に依存する入力依存変換とその逆変換である入力依存逆変換を配置する
ことを特徴とする請求項１に記載のプログラム難読化装置。
【請求項３】
前記変換手段において、前記入力依存変換は減算であり、前記入力依存逆変換は加算である
ことを特徴とする請求項２に記載のプログラム難読化装置。
【請求項４】
前記変換手段は、さらに、前記情報セキュリティプログラムの先頭に配置された基本演算を除くその他の基本演算のそれぞれについて、当該基本演算の直前に、当該基本演算の直前の基本演算の演算結果に第１の変換を施す第１変換演算と、前記第１変換演算の演算結果に、第１の変換の逆変換である第２の変換を施す第２変換演算とを配置し、
前記テーブル生成手段は、
さらに、前記情報セキュリティプログラムの先頭に配置された基本演算とその直後に配置された第１変換演算とからなる一組の演算と等価の演算結果を得るテーブルを生成し、当該テーブルを参照する参照命令を生成し、
中間に配置された各基本演算について、直前に配置された前記減算、当該基本演算及び直後に配置された前記加算に加えて、第２変換演算及び第１変換演算からなる一組の演算と等価の演算結果を得る前記テーブルを生成し、当該テーブルを参照する前記参照命令を生成し、
さらに、前記情報セキュリティプログラムの末尾に配置された基本演算とその直前に配置された第２変換演算とからなる一組の演算と等価の演算結果を得るテーブルを生成し、当該テーブルを参照する参照命令を生成し、
前記出力手段は、生成された前記テーブル及び前記参照命令を含む前記難読化プログラムを出力する
ことを特徴とする請求項３に記載のプログラム難読化装置。
【請求項５】
前記変換手段は、前記基本演算、前記減算、前記加算、前記第１変換演算及び前記第２変換演算を、桁毎に分解して、複数の桁演算を生成し、生成した前記桁演算を配置し、
前記テーブル生成手段は、
前記情報セキュリティプログラムの先頭に配置された基本演算とその直後に配置された第１変換演算とからなる一組の演算と等価の演算結果が得られるように、生成した前記桁演算と等価の演算結果が得られる桁演算テーブルを生成し、当該桁演算テーブルを参照する桁演算参照命令を生成し、
中間に配置された各基本演算について、直前に配置された前記減算、当該基本演算及び直後に配置された前記加算、第２変換演算及び第１変換演算からなる一組の演算と等価の演算結果が得られるように、生成した前記桁演算と等価の演算結果が得られる桁演算テーブルを生成し、当該桁演算テーブルを参照する桁演算参照命令を生成し、
前記情報セキュリティプログラムの末尾に配置された基本演算とその直前に配置された第２変換演算とからなる一組の演算と等価の演算結果が得られるように、生成した前記桁演算と等価の演算結果が得られる桁演算テーブルを生成し、当該桁演算テーブルを参照する桁演算参照命令を生成し、
前記出力手段は、生成された前記桁演算テーブル及び前記桁演算参照命令を含む前記難読化プログラムを出力する
ことを特徴とする請求項４に記載のプログラム難読化装置。
【請求項６】
前記テーブル生成手段は、桁演算テーブルの生成に際して、所定数個の共通化されたテーブルから、１個のテーブルを選択する
ことを特徴とする請求項５に記載のプログラム難読化装置。
【請求項７】
前記セキュリティ演算は、法ｎの元で、鍵情報である秘密鍵ｄを用いる対象情報Ｃに対するべき乗剰余演算Ｃn ｍｏｄ  ｎであり、
鍵情報により定まる順序で配置された入力数の異なる前記複数の基本演算は、べき乗剰余演算Ｃn ｍｏｄ  ｎと等価になるように、バイナリ法により、前記基本演算として、乗算剰余演算と２乗剰余演算とが、秘密鍵ｄの各ビット値に基づいて、配置されたものであり、
前記変換手段は、中間に配置された乗算剰余演算又は２乗剰余演算の直前及び直後に、当該乗算剰余演算又は２乗剰余演算への１個の入力値に依存する減算及び加算を配置し、
前記テーブル生成手段は、中間に配置された各乗算剰余演算又は２乗剰余演算について、直前に配置された前記減算、当該乗算剰余演算又は２乗剰余演算及び直後に配置された前記加算からなる一組の演算と等価の演算結果を得るテーブルを生成する
ことを特徴とする請求項３に記載のプログラム難読化装置。
【請求項８】
前記情報セキュリティプログラムは、べき乗剰余演算Ｃn ｍｏｄ  ｎを用いて、前記対象情報に、秘密通信、デジタル署名又は署名検証を施すためのコンピュータプログラムである
ことを特徴とする請求項７に記載のプログラム難読化装置。
【請求項９】
前記セキュリティ演算は、法ｎの元で、鍵情報である秘密鍵ｄを用いる対象情報Ｃに対するべき乗剰余演算Ｃn ｍｏｄ  ｎであり、
鍵情報により定まる順序で配置された入力数の異なる前記複数の基本演算は、べき乗剰余演算Ｃn ｍｏｄ  ｎと等価になるように、バイナリ法により、前記基本演算として、乗算剰余演算と２乗剰余演算とが、秘密鍵ｄの各ビット値に基づいて、配置されたものであり、
前記変換手段は、中間に配置された各乗算剰余演算を分解して、乗算演算及び剰余演算を配置し、配置された乗算演算の直前及び直後に、当該乗算演算への１個の入力値に依存する減算及び加算を配置し、中間に配置された各２乗算剰余演算を分解して、２乗算演算及び剰余演算を配置し、配置された２乗算演算の直前及び直後に、当該２乗算演算への１個の入力値に依存する減算及び加算を配置し、
前記テーブル生成手段は、中間に配置された各乗算演算又は各２乗演算について、直前に配置された前記減算、当該乗算演算又は２乗演算及び直後に配置された前記加算からなる一組の演算と等価の演算結果を得るテーブルを生成する
ことを特徴とする請求項３に記載のプログラム難読化装置。
【請求項１０】
前記取得手段、前記変換手段、前記テーブル生成手段及び前記出力手段は、集積回路を構成する
ことを特徴とする請求項１に記載のプログラム難読化装置。
【請求項１１】
プログラム難読化装置及びプログラム実行装置から構成される難読化システムであって、
鍵情報を用いて対象情報を安全又は確実に扱うセキュリティ演算を含む情報セキュリティプログラムを難読化する前記プログラム難読化装置は、
前記セキュリティ演算と等価となるように、複数入力が必要な第１基本演算と、前記複数入力の一部のみ必要とする第２基本演算とを含む複数の基本演算が鍵情報により定まる順序で配置されている前記情報セキュリティプログラムを取得する取得手段と、
前記情報セキュリティプログラムに含まれる各第２基本演算について、当該第２基本演算の前後に、当該第２基本演算において必要とされない入力に依存する入力依存変換とその逆変換である入力依存逆変換を配置する変換手段と、
各第２基本演算について、直前に配置された前記入力依存変換、当該第２基本演算及び直後に配置された前記入力依存逆変換からなる一組の演算と等価の演算結果を得るテーブルを生成し、当該テーブルを参照する参照命令を生成するテーブル生成手段と、
生成された前記テーブル及び前記参照命令を含む難読化プログラムを出力する出力手段と
を備え、
前記プログラム実行装置は、
前記難読化プログラムを取得する手段と、
取得した前記難読化プログラムに含まれている参照命令に従って、当該難読化プログラムに含まれているテーブルを参照することにより、鍵情報を用いて対象情報を安全又は確実に扱う
ことを特徴とするプログラム難読化システム。
【請求項１２】
鍵情報を用いて対象情報を安全又は確実に扱うセキュリティ演算を含む情報セキュリティプログラムを難読化するプログラム難読化装置において用いられるプログラム難読化方法であって、
前記セキュリティ演算と等価となるように、複数入力が必要な第１基本演算と、前記複数入力の一部のみ必要とする第２基本演算とを含む複数の基本演算が鍵情報により定まる順序で配置されている前記情報セキュリティプログラムを取得する取得ステップと、
前記情報セキュリティプログラムに含まれる各第２基本演算について、当該第２基本演算の前後に、当該第２基本演算において必要とされない入力に依存する入力依存変換とその逆変換である入力依存逆変換を配置する変換ステップと、
各第２基本演算について、直前に配置された前記入力依存変換、当該第２基本演算及び直後に配置された前記入力依存逆変換からなる一組の演算と等価の演算結果を得るテーブルを生成し、当該テーブルを参照する参照命令を生成するテーブル生成ステップと、
生成された前記テーブル及び前記参照命令を含む難読化プログラムを出力する出力ステップと
を含むことを特徴とするプログラム難読化方法。
【請求項１３】
鍵情報を用いて対象情報を安全又は確実に扱うセキュリティ演算を含む情報セキュリティプログラムを難読化するプログラム難読化装置において用いられるプログラム難読化のためのコンピュータプログラムを記録しているコンピュータ読み取り可能な記録媒体であって、
前記コンピュータプログラムは、コンピュータに、
前記セキュリティ演算と等価となるように、複数入力が必要な第１基本演算と、前記複数入力の一部のみ必要とする第２基本演算とを含む複数の基本演算が鍵情報により定まる順序で配置されている前記情報セキュリティプログラムを取得する取得ステップと、
前記情報セキュリティプログラムに含まれる各第２基本演算について、当該第２基本演算の前後に、当該第２基本演算において必要とされない入力に依存する入力依存変換とその逆変換である入力依存逆変換を配置する変換ステップと、
各第２基本演算について、直前に配置された前記入力依存変換、当該第２基本演算及び直後に配置された前記入力依存逆変換からなる一組の演算と等価の演算結果を得るテーブルを生成し、当該テーブルを参照する参照命令を生成するテーブル生成ステップと、
生成された前記テーブル及び前記参照命令を含む難読化プログラムを出力する出力ステップとを実行させる
ことを特徴とする記録媒体。
【請求項１４】
鍵情報を用いて対象情報を安全又は確実に扱うセキュリティ演算を含む情報セキュリティプログラムを難読化するプログラム難読化装置において用いられるプログラム難読化のためのコンピュータプログラムであって、
前記コンピュータプログラムは、コンピュータに、
前記セキュリティ演算と等価となるように、複数入力が必要な第１基本演算と、前記複数入力の一部のみ必要とする第２基本演算とを含む複数の基本演算が鍵情報により定まる順序で配置されている前記情報セキュリティプログラムを取得する取得ステップと、
前記情報セキュリティプログラムに含まれる各第２基本演算について、当該第２基本演算の前後に、当該第２基本演算において必要とされない入力に依存する入力依存変換とその逆変換である入力依存逆変換を配置する変換ステップと、
各第２基本演算について、直前に配置された前記入力依存変換、当該第２基本演算及び直後に配置された前記入力依存逆変換からなる一組の演算と等価の演算結果を得るテーブルを生成し、当該テーブルを参照する参照命令を生成するテーブル生成ステップと、
生成された前記テーブル及び前記参照命令を含む難読化プログラムを出力する出力ステップとを実行させる
ことを特徴とするコンピュータプログラム。
【請求項１５】
前記変換手段は、前記入力依存変換及び前記入力依存逆変換として、それぞれ、前記第１基本演算に必要な入力数と同じ数の入力に依存する変換を配置する
ことを特徴とする請求項１に記載のプログラム難読化装置。
【請求項１６】
前記入力依存変換及び前記入力依存逆変換は、それぞれ、前記第１基本演算に必要であり、かつ、前記第２基本演算に必要でない入力に依存する
ことを特徴とする請求項１６に記載のプログラム難読化装置。    
【手続補正２】
【補正対象書類名】明細書
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報セキュリティ技術としてのコンピュータプログラムの難読化技術に関する。
【背景技術】
【０００２】
近年、情報通信技術の普及に伴い、情報セキュリティ技術の重要性が一段と増してきている。このような情報セキュリティ技術の一つとして、暗号技術が、コンピュータプログラムである暗号用ソフトウェアとして具現化され、秘密の通信、プライバシーの保護、通信相手の確認等のために用いられる。
情報処理装置や通信装置などのコンピュータシステムに暗号用ソフトウェアを実装する場合、秘密鍵や暗号アルゴリズムに何らの加工を施すことなくこれらをそのまま実装するなら、不正な利用者によりプログラム実行時にこれらを解析（プログラム解析と呼ぶ）されたとき、簡単に秘密鍵が漏洩してしまう。そのため、プログラム解析を困難にする耐タンパーソフト技術が要望されている。耐タンパーソフト技術の一例として、特許文献１において、暗号化などの処理をランダム変換を含めてテーブル化することで、プログラムを難読化する方法が記載されている。
【０００３】
特許文献１に記載されている従来の難読化方法の処理を図３９に示す。
従来のこの難読化方法では、共通鍵暗号の暗号用プログラムや復号用プログラムなどの難読化前の通常プログラム９０００に対して、難読化の処理（ステップＳ９００１〜Ｓ９００２）を施して、難読化プログラム９００２を生成し、出力する。この難読化方法の詳細について、以下に説明する。
【０００４】
従来の難読化方法では、最初に、通常プログラム９０００を構成する複数のプログラム命令を、共通鍵暗号における鍵ｋｅｙ1 〜ｋｅｙn を用いる処理１〜ｎ（ｎは自然数）に分けて、処理１〜ｎを含む処理分割プログラム９００１を生成する（ステップＳ９００１）。
次に、処理１の直後に、出力値変換π1 と出力値逆変換π1-1 とを挿入し、処理２の直後に、出力値変換π2 と出力値逆変換π2-1 とを挿入し、処理３の直後に、出力値変換π3 と出力値逆変換π2-1 とを挿入し、・・・、処理ｉの直後に、出力値変換πi と出力値逆変換πi-1 とを挿入し、・・・、処理ｎ−１の直後に、出力値変換πn-1 と出力値逆変換πn-1-1 とを挿入する。ここで、πi-1 は、変換πi の逆変換を示す。（ｉ＝１、２、３、・・・、ｎ−１）
次に、処理１及び出力値変換π1 をテーブル化してテーブルＲＴ1 を生成し、出力値逆変換π1-1 、処理２及び出力値変換π2 をテーブル化してテーブルＲＴ2 を生成し、出力値逆変換π2-1 、処理３及び出力値変換π3 をテーブル化してテーブルＲＴ3 を生成し、・・・、 出力値逆変換πi-1 、処理ｉ＋１及び出力値変換πi+1 をテーブル化してテーブルＲＴi+1 を生成し、・・・、最後に、出力値逆変換πn-1-1 及び処理ｎをテーブル化してテーブルＲＴn  を生成する。こうして、テーブルＲＴ1 、ＲＴ2 、・・・、ＲＴn を含む難読化プログラム９００２が生成される（ステップＳ９００２）。
【０００５】
このとき、鍵ｋｅｙ1 〜ｋｅｙn がそれぞれ予め与えられた定数であれば、それをも含めてテーブル化可能である。
特許文献１に記載の技術では、各テーブルＲＴ1 、・・・、ＲＴn-1 は、各処理１、・・・、ｎの出力値を出力値変換π1 、・・・、πn-1 により変換する。このように各テーブルへの入力値や各テーブルからの出力値は変換された値となっているため、各テーブルの入力値及び出力値を用いても、各テーブル中で行われている演算を解析しにくくなり、プログラム解析は困難となる。また、テーブルＲＴi において施される出力値変換πi は、テーブルＲＴi に続くテーブルＲＴi+1 において施される出力値変換πi-1 により逆変換されるのでプログラムの実行結果は難読化前の通常プログラムと同じものとなる。
【０００６】
図４０は、従来の難読化方法で生成されるテーブルの一例を示している。この図に示すように、集合９０１１に含まれる各入力値ｉｎについて、処理１により、中間値ａ1 を計算し（ステップＳ９００３）、それぞれの中間値ａ1 に対し、ランダムな全単射変換である出力値変換π1 を設定し、出力値変換π1 による変換後の値π1 （ａ1 ）を計算し（ステップＳ９００４）、入力値ｉｎと変換後の値π1 （ａ1 ）を対応づけるテーブルＲＴ1 ９０１４を作成する（ステップＳ９００５）。
【特許文献１】国際公開第ＷＯ０２／４６８９０号パンフレット
【非特許文献１】岡本龍明、山本博資、「現代暗号」、産業図書（１９９７年）
【非特許文献２】H.Cohen,"ACourse in Computational Algebraic Number Theory",GTM 138,Springer-Verlag,1996,p9
【発明の開示】
【発明が解決しようとする課題】
【０００７】
このように、特許文献１に記載されている従来の難読化方法は、プログラムを難読化するという一定の目的を達成しているが、さらに、プログラム解析の困難性を強化する難読化技術が要望されている。
本発明は、上記要望に対応するため、プログラム解析の困難性がさらに強化されたプログラム難読システム、プログラム難読化装置、プログラム難読化方法、プログラム難読化プログラム、プログラム難読化プログラムを記憶している記録媒体を提供することを目的とする。
【課題を解決するための手段】
【０００８】
上記目的を達成するために、本発明は、鍵情報を用いて対象情報を安全又は確実に扱うセキュリティ演算を含む情報セキュリティプログラムを難読化するプログラム難読化装置であって、前記セキュリティ演算と等価となるように、複数入力が必要な第１基本演算と、前記複数入力の一部のみ必要とする第２基本演算とを含む複数の基本演算が鍵情報により定まる順序で配置されている前記情報セキュリティプログラムを取得する取得手段と、前記情報セキュリティプログラムに含まれる各第２基本演算について、当該第２基本演算の前後に、当該第２基本演算において必要とされない入力に依存する入力依存変換とその逆変換である入力依存逆変換を配置する変換手段と、各第２基本演算について、直前に配置された前記入力依存変換、当該第２基本演算及び直後に配置された前記入力依存逆変換からなる一組の演算と等価の演算結果を得るテーブルを生成し、当該テーブルを参照する参照命令を生成するテーブル生成手段と、生成された前記テーブル及び前記参照命令を含む難読化プログラムを出力する出力手段とを備えることを特徴とする。
【発明の効果】
【０００９】
この構成によると、複数入力が必要な第１基本演算及び前記複数入力の一部のみ必要とする第２基本演算のうち、第２基本演算について、当該第２基本演算の前後に、当該第２基本演算において必要とされない入力に依存する入力依存変換とその逆変換である入力依存逆変換を配置して、第１基本演算及び第２基本演算の入力の数の差を少なくし、入力数の違いによる攻撃に対抗して、プログラム解析の困難性をより高めることができる。
【００１０】
ここで、前記変換手段は、さらに、前記情報セキュリティプログラムに含まれる各第１基本演算について、当該第１基本演算の前後のいずれか、又は両方に、当該第１基本演算において必要な入力に依存する入力依存変換とその逆変換である入力依存逆変換を配置するとしてもよい。
この構成によると、第１基本演算についても、当該第１基本演算の前後のいずれか、又は両方に、当該第２基本演算において必要とされない入力に依存する入力依存変換とその逆変換である入力依存逆変換を配置するので、プログラム解析の困難性をより高めることができる。
【００１１】
ここで、前記変換手段において、前記入力依存変換は減算であり、前記入力依存逆変換は加算であるとしてもよい。
この構成によると、入力値に依存する減算と加算とを配置するので、演算結果は、配置しない場合と等価となる。
ここで、前記変換手段は、さらに、前記情報セキュリティプログラムの先頭に配置された基本演算を除くその他の基本演算のそれぞれについて、当該基本演算の直前に、当該基本演算の直前の基本演算の演算結果に第１の変換を施す第１変換演算と、前記第１変換演算の演算結果に、第１の変換の逆変換である第２の変換を施す第２変換演算とを配置し、前記テーブル生成手段は、さらに、前記情報セキュリティプログラムの先頭に配置された基本演算とその直後に配置された第１変換演算とからなる一組の演算と等価の演算結果を得るテーブルを生成し、当該テーブルを参照する参照命令を生成し、中間に配置された各基本演算について、直前に配置された前記減算、当該基本演算及び直後に配置された前記加算に加えて、第２変換演算及び第１変換演算からなる一組の演算と等価の演算結果を得る前記テーブルを生成し、当該テーブルを参照する前記参照命令を生成し、さらに、前記情報セキュリティプログラムの末尾に配置された基本演算とその直前に配置された第２変換演算とからなる一組の演算と等価の演算結果を得るテーブルを生成し、当該テーブルを参照する参照命令を生成し、前記出力手段は、生成された前記テーブル及び前記参照命令を含む前記難読化プログラムを出力するとしてもよい。
【００１２】
この構成によると、基本演算の前後に第１変換演算と、その逆変換である第２変換演算が配置されるので、プログラム解析の困難性をより高めることができる。なお、第１変換演算と、その逆変換である第２変換演算が配置されるので、演算結果は、配置しない場合と等価である。
ここで、前記変換手段は、前記基本演算、前記減算、前記加算、前記第１変換演算及び前記第２変換演算を、桁毎に分解して、複数の桁演算を生成し、生成した前記桁演算を配置し、前記テーブル生成手段は、前記情報セキュリティプログラムの先頭に配置された基本演算とその直後に配置された第１変換演算とからなる一組の演算と等価の演算結果が得られるように、生成した前記桁演算と等価の演算結果が得られる桁演算テーブルを生成し、当該桁演算テーブルを参照する桁演算参照命令を生成し、中間に配置された各基本演算について、直前に配置された前記減算、当該基本演算及び直後に配置された前記加算、第２変換演算及び第１変換演算からなる一組の演算と等価の演算結果が得られるように、生成した前記桁演算と等価の演算結果が得られる桁演算テーブルを生成し、当該桁演算テーブルを参照する桁演算参照命令を生成し、前記情報セキュリティプログラムの末尾に配置された基本演算とその直前に配置された第２変換演算とからなる一組の演算と等価の演算結果が得られるように、生成した前記桁演算と等価の演算結果が得られる桁演算テーブルを生成し、当該桁演算テーブルを参照する桁演算参照命令を生成し、前記出力手段は、生成された前記桁演算テーブル及び前記桁演算参照命令を含む前記難読化プログラムを出力するとしてもよい。
【００１３】
この構成によると、各演算を桁毎に分解するので、生成されるテーブルの総量をより少なくすることができる。
ここで、前記テーブル生成手段は、桁演算テーブルの生成に際して、所定数個の共通化されたテーブルから、１個のテーブルを選択するとしてもよい。
この構成によると、前記テーブル生成手段は、所定数個の共通化されたテーブルから選択するので、保持するテーブルの総量をより少なくすることができる。
【００１４】
ここで、前記セキュリティ演算は、法ｎの元で、鍵情報である秘密鍵ｄを用いる対象情報Ｃに対するべき乗剰余演算Ｃn ｍｏｄ  ｎであり、鍵情報により定まる順序で配置された入力数の異なる前記複数の基本演算は、べき乗剰余演算    
Ｃn ｍｏｄ  ｎと等価になるように、バイナリ法により、前記基本演算として、乗算剰余演算と２乗剰余演算とが、秘密鍵ｄの各ビット値に基づいて、配置されたものであり、前記変換手段は、中間に配置された乗算剰余演算又は２乗剰余演算の直前及び直後に、当該乗算剰余演算又は２乗剰余演算への１個の入力値に依存する減算及び加算を配置し、前記テーブル生成手段は、中間に配置された各乗算剰余演算又は２乗剰余演算について、直前に配置された前記減算、当該乗算剰余演算又は２乗剰余演算及び直後に配置された前記加算からなる一組の演算と等価の演算結果を得るテーブルを生成するとしてもよい。
【００１５】
この構成によると、前記セキュリティ演算は、法ｎの元で、鍵情報である秘密鍵ｄを用いる対象情報Ｃに対するべき乗剰余演算Ｃn ｍｏｄ  ｎであるので、安全性がある程度確立されたＲＳＡ暗号技術を用いることができる。
ここで、前記セキュリティ演算は、法ｎの元で、鍵情報である秘密鍵ｄを用いる対象情報Ｃに対するべき乗剰余演算Ｃn ｍｏｄ  ｎであり、鍵情報により定まる順序で配置された入力数の異なる前記複数の基本演算は、べき乗剰余演算    
Ｃn ｍｏｄ  ｎと等価になるように、バイナリ法により、前記基本演算として、乗算剰余演算と２乗剰余演算とが、秘密鍵ｄの各ビット値に基づいて、配置されたものであり、前記変換手段は、中間に配置された各乗算剰余演算を分解して、乗算演算及び剰余演算を配置し、配置された乗算演算の直前及び直後に、当該乗算演算への１個の入力値に依存する減算及び加算を配置し、中間に配置された各２乗算剰余演算を分解して、２乗算演算及び剰余演算を配置し、配置された２乗算演算の直前及び直後に、当該２乗算演算への１個の入力値に依存する減算及び加算を配置し、前記テーブル生成手段は、中間に配置された各乗算演算又は各２乗演算について、直前に配置された前記減算、当該乗算演算又は２乗演算及び直後に配置された前記加算からなる一組の演算と等価の演算結果を得るテーブルを生成するとしてもよい。
【００１６】
この構成によると、べき乗剰余演算Ｃn ｍｏｄ  ｎにおける乗算剰余演算及び２乗算剰余演算がそれぞれ分解されて、乗算演算及び剰余演算、並びに２乗算演算及び剰余演算が配置され、乗算演算の直前及び直後に、前記減算及び加算が配置され、２乗算演算の直前及び直後に、前記減算及び加算が配置されるので、プログラム解析の困難性をより高めることができる。なお、入力値に依存する減算と加算とを配置するので、演算結果は、配置しない場合と等価である。
【００１７】
ここで、前記変換手段は、前記入力依存変換及び前記入力依存逆変換として、それぞれ、前記第１基本演算に必要な入力数と同じ数の入力に依存する変換を配置するしてもよい。
ここで、前記入力依存変換及び前記入力依存逆変換は、それぞれ、前記第１基本演算に必要であり、かつ、前記第２基本演算に必要でない入力に依存するとしてもよい。
【発明を実施するための最良の形態】
【００１８】
１．実施の形態１
本発明に係る１の実施の形態としての難読化方法について説明する。
ここでは、難読化の対象となるプログラムとして、共通鍵暗号ではなく、公開鍵暗号の復号化プログラムを使う場合について説明し、具体的には、公開鍵暗号の例としてＲＳＡ暗号の復号化プログラムを難読化する難読化方法について、説明する。なお、ＲＳＡ暗号については、非特許文献１の１１０〜１１３ページに記載されているので、詳細の説明を省略する。
【００１９】
ＲＳＡ暗号の復号化では、正整数である秘密鍵ｄを用いて、暗号文Ｃの復号文であるＭを計算する。
Ｍ＝Ｃ＾ｄ  ｍｏｄ  ｎ
このような演算をセキュリティ演算と呼ぶこともある。
ここで、ｎは、素数ｐと素数ｑの積であり、本明細書において、「Ｘ＾Ｙ」は、ＸのＹ乗を示し、「Ｘ  ｍｏｄ  Ｙ」は、ＸをＹで割ったときの余りを示している。
【００２０】
Ｃ＾ｄ  ｍｏｄ  ｎの計算は乗算と２乗算の繰返しによって実現でき、ＲＳＡ暗号をコンピュータシステムなどに実装する場合に、この性質を利用することが多い。このとき、乗算と２乗算が適用される順番は、秘密鍵の値に依存するので、これを解析することで、攻撃者が秘密鍵を知ることができる。
ＲＳＡ暗号の復号化プログラムである難読化前の通常プログラム５００１は、図１に示すように、２乗算Ｓ５０１１、乗算Ｓ５０１２、・・・、乗算Ｓ５０１３を含んでいる。このとき、乗算と２乗算が適用される順番は、秘密鍵ｄの値に依存する。ここで、秘密鍵ｄは、ｎビット長であり、一例として、秘密鍵ｄは、「０１・・・１」である。
【００２１】
Ｘ1 ＝Ｃ×Ｃ  ｍｏｄ  ｎ  
Ｘ2 ＝Ｘ1 ×Ｃ  ｍｏｄ  ｎ  
・・・
Ｘn ＝Ｘn-1 ×Ｃ  ｍｏｄ  ｎ  
こうして、復号文Ｍ＝Ｘn （＝Ｃ＾ｄ  ｍｏｄ  ｎ）が得られる。
【００２２】
ここで、説明の便宜のために、
Ｘ1 ＝Ｃ×Ｃ  ｍｏｄ  ｎ  
Ｘ2 ＝Ｘ1 ×Ｃ  ｍｏｄ  ｎ  
・・・
Ｘn ＝Ｘn-1 ×Ｃ  ｍｏｄ  ｎ  
をそれぞれ、演算１（Ｓ５０１１）、演算２（Ｓ５０１２）、・・・、演算ｎ（Ｓ５０１３）と呼ぶこととする。
【００２３】
この難読化方法は、演算１（Ｓ５０１１）の直後に、出力値変換π1 Ｓ５０３１と出力値逆変換π1-1 Ｓ５０３２とを挿入し、演算２（Ｓ５０１２）の直後に、出力値変換π2 Ｓ５０３３と出力値逆変換π2-1 とを挿入し、演算３の直後に、出力値変換π3 と出力値逆変換π3-1 とを挿入し、・・・、演算ｉの直後に、出力値変換πi と出力値逆変換πi-1 とを挿入し、・・・、演算（ｎ−１）の直後に、出力値変換πn-1 と出力値逆変換πn-1-1 Ｓ５０３４とを挿入する。ここで、πi-1 は、変換πi の逆変換を示す。（ｉ＝１、２、３、・・・、ｎ−１）
次に、この難読化方法は、演算Ｘ１（Ｓ５０１１）及び出力値変換π1 Ｓ５０３１をテーブル化してテーブルＲＴ1 ５０２１を生成し、出力値逆変換π1-1 Ｓ５０３２、演算Ｘ２（Ｓ５０１２）及び出力値変換π2 Ｓ５０３３をテーブル化してテーブルＲＴ2 ５０２２を生成し、出力値逆変換π2-1 、演算Ｘ３及び出力値変換π3 をテーブル化してテーブルＲＴ3 を生成し、・・・、 出力値逆変換πi-1 、演算Ｘｉ＋１及び出力値変換πi+1 をテーブル化してテーブル        
ＲＴi+1 を生成し、・・・、最後に、出力値逆変換πn-1-1 Ｓ５０３４及び演算Ｘｎ（Ｓ５０１３）をテーブル化してテーブルＲＴn  ５０２３を生成する。こうして、テーブルＲＴ1 ５０２１、ＲＴ2 ５０２２、・・・、ＲＴn ５０２３を含む難読化プログラム５００２が生成される（ステップＳ５００１）。
【００２４】
このように、この難読化方法では、最初と最後の演算を除く途中の演算の前後に、出力値変換及び出力値逆変換をセットで挿入する。次に、最初の演算と出力値変換をテーブル化する。次に、途中の各演算について、出力値逆変換と当該演算と出力値逆変換をテーブル化する。さらに、最後の演算について、出力値逆変換と当該演算とをテーブル化する。これにより、演算途中の中間値が変換されるので、演算内容を隠すことができる。
【００２５】
しかしながら、乗算と２乗算との繰り返しによってべき乗演算をしてＲＳＡ暗号を実現する場合、乗算と２乗算とでは、使用される入力値が異なる。すなわち、図２（ａ）に示すように、乗算では、第１の入力値ｉｎ１に第２の入力値ｉｎ２をかける演算を行うのに対し、図２（ｂ）に示すように、２乗算では、第１の入力値ｉｎ１のみを用いて、第１の入力値ｉｎ１の２乗算を行う。
【００２６】
このため、乗算のテーブルの出力はｉｎ１およびｉｎ２の両方に依存し、２乗算のテーブルの出力はｉｎ１のみに依存している。
この性質を利用すると、攻撃者は、テーブルの入出力に着目することで、各テーブルで乗算と２乗算のどちらが行われているのかを区別することができる。すなわち、２乗算のテーブルには入力値ｉｎ２が不要であるので、入力値ｉｎ２が入力されていないテーブルは２乗算のテーブルであり、入力値ｉｎ２が入力されているテーブルが乗算のテーブルであると推測することができる。また、仮に、２乗算のテーブルを（実際の処理に使用しないが）入力値ｉｎ２を入力するように構成したとしても、２乗算のテーブルの出力値は入力値ｉｎ２に依存しないので、この性質からテーブルが２乗算を行っているのか乗算を行っているのかを推測される可能性がある。
【００２７】
このため、乗算と２乗算の順序を推測される可能性があり、その結果、秘密鍵の値が知られてしまう可能性がある。
２．実施の形態２
次に示す実施の形態２は、実施の形態１による問題点を解決し、乗算と２乗算の入力数が異なることによる攻撃を防ぐことを目的とする。
【００２８】
本発明にかかる実施の形態２としての難読化システム１について説明する。
２．１  難読化システム１の概要
実施の形態２における難読化システム１の構成を図３に示す。難読化システム１は、秘密鍵ｄを入力値として受け付け難読化プログラムを生成し、生成した難読化プログラムを出力する難読化装置１００と、出力された難読化プログラムを記録する媒体２００と、媒体２００から難読化プログラムを読み出し、読み出した難読化プログラムを実行し、暗号文から復号文を生成し、又はメッセージから署名データを生成する暗号処理装置３００とから構成される。
【００２９】
難読化システム１において、難読化装置１００は、秘密鍵ｄと、ＲＳＡ暗号の復号化や署名生成で使用する対象データＸとに対し、Ｘ＾ｄ  ｍｏｄ  ｎを計算する難読化プログラムを生成し、生成した難読化プログラムを媒体２００に記録する。暗号処理装置３００は、媒体２００に記録された難読化プログラムを読み出し、暗号処理装置３００が備えるＣＰＵが読み出した難読化プログラムに従って動作することにより、暗号文から復号文を生成し、又はメッセージから署名データを生成する。
【００３０】
２．２  ＲＳＡ暗号方法及びＲＳＡ署名方法
ここでは、ＲＳＡ暗号方法及びＲＳＡ署名方法について説明する。ＲＳＡ暗号方法やＲＳＡ署名方法を用いることにより、情報を安全又は確実に扱うことができる。
（１）ＲＳＡ暗号方法
（ａ）鍵の生成
ＲＳＡ暗号方法では、次に示すようにして、公開鍵及び秘密鍵を計算する。
【００３１】
（ｉ）ランダムに大きい素数ｐ，ｑを選択し、その積ｎ＝ｐ×ｑを計算する。ｐ，ｑの大きさは、例えば、５１２ビットであり、ｎの大きさは、例えば、１０２４ビットである。
（ii）（ｐ−１）及び（ｑ−１）の最小公倍数Ｌ＝ＬＣＭ（ｐ−１，ｑ−１）を計算する。
【００３２】
（iii）Ｌと互いに素（Ｌとの最大公約数が１）でＬより小さい自然数ｅをランダムに選ぶ。
１≦ｅ≦Ｌ−１、ＧＣＤ（ｅ，Ｌ）＝１
ここで、ＧＣＤ（ｅ，Ｌ）は、ｅとＬの最大公約数を示している。
（iv）ｅ×ｄ＝１  ｍｏｄ  Ｌを満たすｄを計算する。ＧＣＤ（ｅ，Ｌ）＝１の場合、このようなｄは必ず存在することが数学的に知られている。このようにして、得られた整数ｅ及び整数ｎが公開鍵である。また、整数ｄが秘密鍵である。
【００３３】
（ｂ）暗号文の生成
公開鍵である整数ｅ及び整数ｎを用いて、平文ｍに以下の暗号演算を施して暗号文ｃを計算する。ただし、平文ｍは整数ｎよりも小さいものとする。
ｃ＝ｍ＾ｅ  ｍｏｄ  ｎ
（ｃ）復号文の生成
秘密鍵である整数ｄを用いて、暗号文ｃに復号演算を施して復号文ｍ’を計算する。
【００３４】
ｍ’＝ｃ＾ｄ  ｍｏｄ  ｎ
なお、
ｍ’＝ｃ＾ｄ  ｍｏｄ  ｎ
＝（ｍ＾ｅ  ）＾ｄ  ｍｏｄ  ｎ
＝ｍ＾（ｅ×ｄ  ｍｏｄ  Ｌ）  ｍｏｄ  ｎ
＝ｍ＾１  ｍｏｄ  ｎ
＝ｍ  ｍｏｄ  ｎ
であり、ｍ＜ｎであるので、ｍ  ｍｏｄ  ｎ＝ｍであることから、復号文ｍ’は、平文ｍと一致する。
【００３５】
なお、ＲＳＡ暗号方法については、非特許文献１の１１０〜１１３ページに詳しく説明されている。
（２）ＲＳＡ署名方法
（ａ）鍵の生成
鍵の生成方法については、ＲＳＡ暗号方法と同様である。
【００３６】
（ｂ）署名生成
メッセージデータＤに対して、以下のように署名データＳを計算する。
最初に、ハッシュ関数Ｈａｓｈを用いて、メッセージデータＤのハッシュ値ｈ＝Ｈａｓｈ（Ｄ）を計算する。
次に、秘密鍵である整数ｄを用いて、ハッシュ値ｈをｄ乗して、署名データＳを計算する。
【００３７】
Ｓ＝ｈ＾ｄ  ｍｏｄ  ｎ
すなわち、ハッシュ値ｈを平文として、ＲＳＡ暗号によって暗号化した値が署名データＳである。
（ｃ）署名検証
署名データＳがメッセージデータＤの正しい署名であるかは、以下のように検証される。
【００３８】
メッセージデータＤと署名データＳとを受信し、Ｈａｓｈ（Ｄ）を計算し、Ｓ＾ｅ  ｍｏｄ  ｎ（署名データＳをＲＳＡ暗号によって復号した値に相当する）を計算する。
次に、Ｈａｓｈ（Ｄ）とＳ＾ｅ  ｍｏｄ  ｎとが等しいか否かを確認する。等しい場合は、署名データＳが正しい署名であるとして、受理する。等しくない場合は、署名データＳが正しくない署名であるとして、拒否する。
【００３９】
なお、ＲＳＡ署名については、非特許文献１の１７５〜１７６ページに詳しく説明されている。
２．３  難読化装置１００で実行する難読化について
（１）バイナリ法によるべき乗演算
難読化装置１００による難読化の対象となる難読化前の通常プログラムは、対象データＸに対し、べき乗値Ｘ＾ｄ  ｍｏｄ  ｎを計算する命令を含む。このようなべき乗剰余算を、セキュリティ演算と呼ぶこともある。
【００４０】
この通常プログラムは、このべき乗演算として、バイナリ法によるべき乗演算を用いる。ここで、バイナリ法によるべき乗演算とは、Ｘ＾ｄ  ｍｏｄ  ｎのような式（一般にべき剰余と言われる）の値を、乗算と２乗算の繰り返しにより計算する方法である。バイナリ法の詳細については、非特許文献２に記載されている。
（２）難読化装置１００による難読化処理の方法（第１の難読化の方法）
難読化装置１００による難読化処理の方法（第１の難読化の方法）について、図４を用いて、説明する。図４には、難読化処理の考え方を記している。
【００４１】
この難読化処理の方法（第１の難読化の方法）では、図４に示すように、難読化前の通常プログラム４００を、中間プログラム４２０に変換し（ステップＳ４０１）、さらに、難読化プログラム４４０に変換する（ステップＳ４０２）。
ここで、通常プログラム４００、中間プログラム４２０及び難読化プログラム４４０の演算結果は、それぞれ同じである。このような性質を等価と呼ぶこともある。
【００４２】
（通常プログラム４００の内容）
図４に示す難読化前の通常プログラム４００は、バイナリ法によるべき乗剰余演算を行う命令ブロック４０１を含み、命令ブロック４０１は、命令４１１、４１２及び４１３を含む。このような通常プログラム４００を情報セキュリティプログラムと呼ぶこともある。
【００４３】
通常プログラム４００において、変数Ｘには、べき乗剰余演算の対象データである値が格納され、変数ｌｅｎには、秘密鍵ｄの総ビット長が格納され、変数Ｙには、演算途中の結果値が格納される。また、変数ｉは、秘密鍵ｄのうち、着目しているビット位置を示している。ここで、秘密鍵ｄのビットは最下位ビットを０ビット目とし、下位から順に数えるものとする。
【００４４】
命令４１１では、変数Ｘの値が変数Ｙに代入される。
命令４１２では、変数ｌｅｎに、秘密鍵ｄの総ビット長が格納される。
命令４１３では、変数ｉに、最初に（ｌｅｎ−１）の値を格納し、変数ｉから「１」ずつ減らしながら、変数ｉ≧０を満たす間、次に示す命令４１４及び命令４１５を繰り返す。
【００４５】
命令４１４では、法ｎにおいて変数Ｙの２乗算を行いその結果を変数Ｙに格納する。
命令４１５では、秘密鍵ｄにおいて変数ｉの値が示すビットを見て、そのビットの値が「１」の場合には、さらに、法ｎにおいて変数Ｙと変数Ｘの乗算を行いその結果を変数Ｙに格納する。
こうして、命令ブロック４０１による演算が完了すると、変数Ｙには、法ｎにおいて変数Ｘをｄ乗して得られる値が格納される。
【００４６】
Ｙ＝Ｘ＾ｄ  ｍｏｄ  ｎ
このように、バイナリ法によるべき乗においては、秘密鍵ｄの各ビットを見て、当該ビットの値が「０」の場合には２乗算のみを行い、「１」の場合には２乗算及び乗算を行う。そのため、もしも、２乗算のみが行われているか、又は２乗算及び乗算が行われているかが分かるなら、秘密鍵ｄを復元することができる。従って、難読化処理では、秘密鍵ｄの各ビットに対応する処理において、２乗算及び乗算のどちらが行われているのか区別が付かないようにする必要がある。
【００４７】
（通常プログラム４００から中間プログラム４２０への変換）
図４に示すステップＳ４０１における通常プログラム４００から中間プログラム４２０への変換について説明する。
難読化装置１００による難読化処理の方法では、中間プログラム４２０内において、最初に、変数Ｘの値を変数Ｙに代入する初期化命令４２２「Ｙ＝Ｘ；」を生成する。
【００４８】
次に、通常プログラム４００内の命令ブロック４０１から、秘密鍵ｄの値による分岐命令であるｉｆ文及びループ命令であるｆｏｒ文を取り除き、中間プログラム４２０内において、秘密鍵ｄの最下位ビットから最上位ビットに向けて、ビット毎に、当該ビットの値が「０」であるなら、２乗算剰余命令「Ｙ＝Ｙ×Ｙ  ｍｏｄ  ｎ；」を生成する。当該ビットの値が「１」であるなら、２乗算剰余命令「Ｙ＝Ｙ×Ｙ  ｍｏｄ  ｎ；」及び乗算剰余命令「Ｙ＝Ｙ×Ｘ  ｍｏｄ  
ｎ；」を生成する。
【００４９】
こうして、初期化命令４２２と、１個以上の２乗算剰余命令と、１個以上の２乗算剰余命令及び乗算剰余命令からなる組命令とから構成される乗算配置情報４２１が生成される。ここで、２乗算剰余命令及び乗算剰余命令を基本剰余演算又は単に基本演算と呼ぶこともある。また、２乗算剰余命令及び乗算剰余命令をそれぞれ、第２基本演算及び第１基本演算と呼ぶこともある。ここで、第１基本演算である乗算剰余命令は、複数入力を必要とし、第２基本演算である２乗算剰余命令は、前記複数入力の一部のみを必要とする。
【００５０】
乗算配置情報４２１内において、初期化命令４２２は、先頭に配置され、続いて、１個以上の２乗算剰余命令と、１個以上の２乗算剰余命令及び乗算剰余命令の組命令とが、秘密鍵ｄの値に応じて配置される。  乗算配置情報４２１内におけるこれら命令の配置の順序は、初期化命令４２２、２乗算剰余命令及び乗算剰余命令の実行順序を規定している。
一例として、図４の中間プログラム４２０は、秘密鍵ｄが「１０１・・・０１」である場合の様子を示す。乗算配置情報４２１は、初期化命令４２２、組命令４２３、２乗算剰余命令４２４、組命令４２５、・・・、２乗算剰余命令４２６及び組命令４２７から構成され、この順序で配置されている。
【００５１】
ここで、乗算剰余は乗算をした後、剰余（ｍｏｄ）演算を行う演算、２乗算剰余は２乗算をした後、剰余演算を行う演算を示す。
（中間プログラム４２０から難読化プログラム４４０への変換）
図４に示すステップＳ４０２における中間プログラム４２０から難読化プログラム４４０への変換について説明する。
【００５２】
難読化装置１００による難読化処理の方法では、中間プログラム４２０内の乗算配置情報４２１に含まれる全ての２乗算剰余命令及び全ての乗算剰余命令を、中間値Ｙを変換した変数Ｚ及び対象データＸを入力とし、変数Ｚを出力とする２入力１出力の処理テーブル（ＲＴ1 、・・・、ＲＴk ）を参照する命令に変換する。ここで、ＲＴi は、ｉ番目の２乗算剰余命令又は乗算剰余命令をテーブル化したものである。
【００５３】
なお、初期化命令４２２は、変数Ｘの値を変数Ｚに代入する初期化命令４４２に変換される。
こうして、一例として図４に示すように、初期化命令４４２、テーブル参照命令４４３、４４４、４４５、４４６、４４７、・・・、４４８及び４４９を含む命令ブロック４４１が生成される。命令ブロック４４１には、前記命令がこの順序で配置される。
【００５４】
これらの命令をこの順序に従って実行することにより、べき乗剰余演算が行われてべき乗値が算出される。
（３）難読化装置１００による難読化処理の方法（第２の難読化の方法）
難読化装置１００による難読化処理の方法（第２の難読化の方法）について説明する。
（ｉ）演算命令の展開
この難読化処理の方法（第２の難読化の方法）では、図４に示すように、難読化前の通常プログラム４００を、中間プログラム４２０に変換する（ステップＳ４０１）。ここまでは、第１の難読化の方法と同一である。
【００５５】
ここで、中間プログラム４２０の乗算配置情報４２１内の２乗算剰余命令及び乗算剰余命令を演算命令と呼び、乗算配置情報４２１内には、ｋ個の演算命令が配置されているものとする。つまり、乗算配置情報４２１内の２乗算剰余命令の数と、乗算配置情報４２１内の乗算剰余命令の数の合計は、ｋ個である。
（ii）出力値変換及び入力値変換の挿入
次に、この難読化処理の方法（第２の難読化の方法）では、中間プログラム４２０の乗算配置情報４２１内の全ての演算命令のうち、最後に配置された演算命令を除いて、最初と途中に配置されたｉ番目の演算命令（ｉ＝１、２、３、・・・、ｋ−１）について、当該演算命令の直後に、出力値変換Πi 及び入力値変換Πi-1 を、この順序で挿入する。
【００５６】
ここで、出力値変換Πi は、前段の演算命令の出力である中間値Ｚと対象データＸとを用いる変換である。また、入力値変換Πi-1 は、対応する出力値変換Πi の出力である中間値Ｚと対象データＸとを用いる変換である。さらに、入力値変換Πi-1 は、出力値変換Πi の逆変換と同じ変換である。
このように、演算命令の後に、変換とその逆変換を挿入することにより、変換の影響を相殺することができ、これらの変換及び逆変換を挿入しない場合と同一の演算結果が得られる。
【００５７】
ｉ＝１の場合、２≦ｉ≦ｋ−１の場合、及びｉ＝ｋの場合のそれぞれについて、出力値変換Πi 及び入力値変換Πi-1 の挿入の一例を、図５（ａ）、（ｂ）及び（ｃ）に示す。
図５（ａ）に示すように、ｉ＝１の場合、１番目の演算命令４６１の直後に出力値変換Π1 ４６２が挿入されている。
また、図５（ｂ）に示すように、２≦ｉ≦ｋ−１の場合、ｉ番目の演算命令４７２の直後に出力値変換Πi ４７３が挿入されている。また、ｉ番目の演算命令４７２の直前に入力値変換Πi-1-1 ４７１が挿入されている。
【００５８】
さらに、図５（ｃ）に示すように、ｉ＝ｋの場合、ｋ番目の演算命令４８２の直前に入力値変換Πk-1-1 ４８１が挿入されている。
（iii） テーブル化
さらに、この難読化処理の方法（第２の難読化の方法）では、図５（ａ）に示すように、ｉ＝１の場合、１番目の演算命令４６１及び出力値変換Π1 ４６２をまとめて、１個のテーブルＲＴ1 ４６０とし、テーブルＲＴ1 ４６０を参照する命令を生成する。
【００５９】
また、図５（ｂ）に示すように、２≦ｉ≦ｋ−１の場合、                  
入力値変換Πi-1-1 ４７１、演算命令４７２及び出力値変換Πi ４７３をまとめて、１個のテーブルＲＴi ４７０とし、テーブルＲＴi ４７０を参照する命令を生成する。
さらに、図５（ｃ）に示すように、ｉ＝ｋの場合、入力値変換Πk-1-1 ４８１及び演算命令４８２をまとめて、１個のテーブルＲＴk ４８０とし、ＲＴk ４８０を参照する命令を生成する。
【００６０】
（４）難読化装置１００による難読化処理の方法（第３の難読化の方法）
難読化装置１００による難読化処理の方法（第３の難読化の方法）について説明する。
（ｉ）演算命令の展開
この難読化処理の方法（第３の難読化の方法）では、第１の難読化の方法及び第２の難読化の方法と同様に、図４のステップＳ４０１に示すように、難読化前の通常プログラム４００を、中間プログラム４２０に変換する。
【００６１】
（ii）出力値変換及び入力値変換の挿入
次に、この難読化処理の方法（第３の難読化の方法）では、第２の難読化の方法と同様にして、中間プログラム４２０の乗算配置情報４２１内に出力値変換及び入力値変換の挿入を行う。ここまでは、第２方法と同じである。
第３の難読化の方法では、さらに、次のようにする。
【００６２】
ｉ＝１の場合、出力値変換Π1 を変換π1 とし、出力値変換Π1 として      
変換π1 を挿入する。
また、ｉ＝ｋの場合、入力値変換Πk-1-1 を変換πk-1-1 と、入力値変換    
Πk-1-1 として変換πk-1-1 を挿入する。
さらに、２≦ｉ≦ｋ−１の場合、図６（ａ）に示すように、入力値変換      
Πi-1-1 ４７１を、変換πi-1-1 ４７１ａ及び入力依存値減算４７１ｂとし、入力値変換Πi-1-1 ４７１として、変換πi-1-1 ４７１ａ及び入力依存値減算４７１ｂを挿入する。また、出力値変換Πi ４７３を、入力依存値加算４７３ａ及び変換πi ４７３ｂとし、出力値変換Πi ４７３として、入力依存値加算４７３ａ及び変換πi ４７３ｂを挿入する。
【００６３】
ここで、変換πi-1 は、変換πi の逆変換であり、変換πi-1 及び変換πi は、それぞれ、Ｚと同じビットサイズをもつ数から同じビットサイズの数への全単射変換である。
また、入力依存値減算は、対象データＸに変換ｆを施したｆ（Ｘ）を減算する演算であり、入力依存値加算は、対象データＸに変換ｆを施したｆ（Ｘ）を加算する演算である。ここで、入力依存値加算は、入力依存値減算の逆変換である。
【００６４】
なお、図６（ａ）では、乗算について示しているが、２乗算においても同様に入力値変換及び出力値変換を配置する。
（iii） テーブル化
さらに、この難読化処理の方法（第３の難読化の方法）では、第２の難読化の方法と同様に、上記のように変換を配置した後に、ＲＴi をテーブル化し、各テーブルを参照する命令を配置する。  
【００６５】
テーブル化することにより、一連の計算過程を、テーブルから値を引く処理に変換できるので、外部からは何らかのテーブルを用いていることしか分からないようにすることができる。これにより、計算過程を追っていくことによる不正解析を防止することができる。
（第３の難読化の方法のまとめ）
以上説明したように、第３方法では、乗算剰余処理及び２乗算剰余処理を、入力依存加算や入力依存減算を含む入力値変換及び出力値変換を配置した変換後乗算剰余処理及び変換後２乗算剰余処理に変換してテーブル化することにより、乗算と２乗算に対応するテーブルの入力が両方とも、中間値Ｚと対象データＸを用いることとなる。この結果、各テーブルの出力は、中間値Ｚと対象データＸとに依存して変化することとなる。
【００６６】
これにより、テーブルの入力を監視したとしても、それぞれのテーブルで乗算と２乗算のいずれの処理が行われているのかを追跡することが困難になる。また、上記の変換で得られるテーブルＲＴi では、どちらのテーブルの出力も中間値Ｚと対象データＸとの両方に依存するようになる。これにより、テーブルの出力を監視したとしても、それぞれのテーブルで乗算と２乗算のいずれの処理が行われているのかを解析することを困難にすることができる。
【００６７】
（５）難読化装置１００による難読化処理の方法（第４の難読化の方法−処理の分割（その１））
上記において、変換後乗算剰余処理及び変換後２乗算剰余処理をテーブル化するとしたが、中間値Ｚ及び対象データＸを、例えば、１０２４ビットの整数とすると、一つのテーブルサイズが２2048×（テーブルの出力バイトサイズ）バイトとなり、非常に大きく実装が困難になる。
【００６８】
そこで、本実施の形態の第４の難読化の方法では、変換後乗算剰余処理及び変換後２乗算剰余処理を小さな値（例えば、４ビットや８ビットの整数）を入力とする処理（分割処理と呼ぶ）に分割した上でテーブル化する。
難読化装置１００による難読化処理の方法（第４の難読化の方法）について説明する。
難読化処理の方法（第４の難読化の方法）では、第３の難読化の方法と同様に、演算命令の展開を行う。ここまでは、第３の難読化の方法と同じである。
【００６９】
第４の難読化の方法では、さらに、次のようにする。
各演算命令を分割する。つまり、乗算剰余演算を、乗算及び剰余演算に分割し、２乗算剰余演算を、２乗算及び剰余演算に分割する。
ｉ＝１の場合、最初の乗算又は２乗算の直後に変換π1 を挿入する。
また、２≦ｉ≦ｋ−１の場合、乗算剰余演算を分割する場合を例として説明する。図６（ｂ）に示すように、乗算剰余演算を分割して、乗算５１２と剰余演算５１５とが得られているものとする。次に、乗算５１２の直前に、入力値変換  Πi-1-1 ５１１を挿入する。ここで、入力値変換Πi-1-1 ５１１は、          
変換πi-1-1 ５１１ａ及び入力依存値減算５１１ｂから構成されている。また、乗算５１２の直後に、出力値変換Ａ５１３を挿入する。ここで、出力値変換Ａ５１３は、入力依存値加算５１３ａ及び変換α５１３ｂから構成されている。また、剰余演算５１５の直前に、変換α-1 ５１４を挿入し、剰余演算５１５の直後に、変換πi ５１６を挿入する。ここで、変換α-1 は、変換αの逆変換である。
【００７０】
さらに、ｉ＝ｋの場合、最後の乗算又は２乗算の直前に入力値変換Πk-1 -1を挿入する。乗算剰余演算を分割する場合を例として説明すると、図７（ｂ）に示すように、最後の乗算８１３の直前に、入力値変換Πk-1 -1８１２を挿入する。ここで、入力値変換Πk-1 -1８１２は、変換πk-1 -1８１２ａ及び入力依存値減算８１２ｂから構成される。最後の剰余演算８２１は、単独で、つまり、変換などが挿入されることなく、存在する。
【００７１】
なお、２乗算剰余演算を分割する場合も同様である。
以上説明したように、第４の難読化の方法によると、乗算処理側の変換α５１３ｂが剰余演算処理側の変換α-1５１４により相殺されるので、分割処理全体でみると変換前と同じ処理が行われることが分かる。
以下、入力値変換Πi-1-1 ５１１、乗算５１２及び出力値変換Ａ５１３を含めた処理を変換乗算処理と呼び、変換α-1５１４、剰余演算５１５及び変換πi ５１６を含めた処理を変換剰余処理と呼ぶ。
【００７２】
第４の難読化の方法では、さらに、変換乗算処理及び変換剰余処理をそれぞれ、中間値Ｚと対象データＸの桁ごとの処理に分割する。
例えば、Ｚ及びＸを４ビットごとの桁に分割する。
ここで、Ｚ＝Ｚ0 ＋Ｚ1 ×２4 ＋Ｚ2 ×２8 ＋・・・とし、
Ｘ＝Ｘ0 ＋Ｘ1 ×２4 ＋Ｘ2 ×２8 ＋・・・とすると、
Ｚは、最下位桁から、それぞれ４ビット毎のＺ0 、Ｚ1 、Ｚ2 、・・・に分割され、Ｘは、最下位桁から、それぞれ４ビット毎のＸ0 、Ｘ1 、Ｘ2 ・・・に分割される。
【００７３】
また、ここで、変換πi 、変換α及び変換ｆは、それぞれ、桁ごとの変換を合わせると分割前の変換に戻せるような変換であるとする。
すなわち、変換πi は、４ビットの数から４ビットの数へ変換する全単射変換φi を用いて、
πi （Ｘ）＝φi （Ｘ0 ）＋φi （Ｘ1 ）×２4 ＋φi （Ｘ2 ）×２8 ＋・・・と表せるような変換とする。
【００７４】
同様に、変換ｆ（Ｘ）＝ｇ（Ｘ0 ）＋ｇ（Ｘ1 ）×２4 ＋ｇ（Ｘ2 ）×２8 ＋・・・と表せ、
α（Ｘ）＝β（Ｘ0 ）＋β（Ｘ1 ）×２4 ＋β（Ｘ2 ）×２8 ＋・・・と表せるものとする。また、それぞれの逆変換についても同様に表せるものとする。
これらの変換の具体例としては、所定の値とのビット毎の論理積や論理和、排他的論理和などの論理演算による変換等が挙げられる。ただし、安全性を高めるためには、これらの変換は、論理積や論理和、排他的論理和などの論理演算などとするよりも、ランダムな置換である方が望ましい。
【００７５】
続いて、分割処理の例を、図８を用いて説明する。図８は、２≦ｉ≦ｋ−１の場合における変換乗算処理の分割の様子を示したものであり、図８（ａ）は、分割前の変換乗算処理を示し、図８（ｂ）は、分割後の変換乗算処理を示している。
図８（ａ）に示す変換乗算処理５０１を分割すると、図８（ｂ）に示す変換乗算処理５２０が得られる。図８では、各桁の処理を分割し、それぞれの加算処理後の値を出力とするよう変換している。これは、大きな数の乗算が、小さな数の乗算結果の和であることを利用している。
【００７６】
ここで、各桁の変換テーブルＲＭ0 、・・・、ＲＭk は以下のようにして求められる。
まず、分割前の変換乗算処理の全体を式で表すと、図６（ｂ）に示すように、
α（（（πi-1 -1（Ｚ）−ｆ（Ｘ））×Ｘ）＋ｆ（Ｘ））となる。
ここで、Ｘ、Ｚ、さらに各変換について、上述した分割後の式を代入して展開し、２4 、２8 ・・・がかけられている値や式ごとにまとめる。
【００７７】
これにより、０桁目の変換に相当する式は、式５３１になり、２4 でまとめられる式が１桁目の変換に相当する式５３２になり、２8 でまとめられる式が２桁目の変換に相当する式５３３になる。こうして、４ビット毎にまとめ、４ビットを１桁としている。以下、同様にして最上位桁までの各桁の変換に相当する式が求められる。これらの式では、簡略のためにインデックスｉを省略している。
【００７８】
それぞれの桁の式を元に、その式中で用いられる中間値Ｚ及び対象データＸをそれぞれ分割したＺ0 、Ｚ1 、Ｚ2 ・・・、Ｘ0 、Ｘ1 、Ｘ2 ・・・等を入力とし、それぞれの桁の式に相当する変換を行うテーブルがＲＭ0 ５２１、ＲＭ1 ５２２、ＲＭ2 ５２３、・・・となる。
ここで、それぞれの桁については、下位桁からの桁上がりを反映する必要があるので、１桁目以上の桁の値を算出するには、各変換テーブルＲＭi による演算に加え、図１０に示す加算処理１（５５１）を行う必要がある。さらに、加算処理１（５５１）を行った結果、更なる桁上がりが発生する可能性があるので、２桁目以降の値を算出するためには図１０に示す加算処理２（５５２）を行う必要がある。なお、加算処理１（５５１）及び加算処理２（５５１）では、図１０のように入力依存値減算や入力依存値加算を含め、入力に施されている変換を取り除く逆変換を入力値変換として追加し、さらに、出力値変換にも次の段のＲＴ（厳密には、ＲＴを変換して得られるＲＭ）において相殺されるような出力値変換を追加する必要がある。なお、本実施の形態では、加算処理も同様にテーブル化することにより、加算処理に対する解析も困難にしている。
【００７９】
以上のことをまとめたのが図８である。ここで、それぞれの桁のＲＭ0 ５２１、ＲＭ1 ５２２及びＲＭ2 ５２３に相当する式５３１、５３２及び５３３を示している。
ＲＭ0 ５２１の出力の下位４ビットは、当該変換乗算処理５２０の０桁めの出力値となり、ＲＭ0 ５２１の上位４ビットは、加算処理１（５４１）へ出力される。ＲＭ1 ５２２の出力の下位４ビットは、加算処理１（５４１）へ出力され、ＲＭ1 ５２２の出力の上位４ビットは、加算処理１（５４２）へ出力される。ＲＭ2 ５２３の出力の下位４ビットは、加算処理１（５４２）へ出力され、      
ＲＭ2 ５２３の出力の上位４ビットは、図示していない加算処理１へ出力される。
【００８０】
加算処理１（５４１）の出力の下位４ビットは、当該変換乗算処理５２０の１桁めの出力値となり、加算処理１（５４１）の出力の上位４ビットは、加算処理２（５４３）へ出力される。加算処理１（５４２）の出力の下位４ビットは、加算処理２（５４３）へ出力され、加算処理１（５４２）の出力の上位４ビットは、図示していない加算処理２へ出力される。
【００８１】
さらに、分割処理の例を、図９を用いて説明する。図９は、ｉ＝ｋの場合における変換乗算処理の分割の様子を示したものであり、変換乗算処理８４１を分割すると、変換乗算処理８５１が得られる。図８と同様に、図９では、各桁の処理を分割し、それぞれの加算処理後の値を出力とするよう変換している。これは、大きな数の乗算が、小さな数の乗算結果の和であることを利用している。
【００８２】
ＲＭ0 ８６１の出力の下位４ビットは、当該変換乗算処理８５１の０桁めの出力値となり、ＲＭ0 ８６１の上位４ビットは、加算処理１（８７１）へ出力される。ＲＭ1 ８６２の出力の下位４ビットは、加算処理１（８７１）へ出力され、ＲＭ1 ８６２の出力の上位４ビットは、加算処理１（８７２）へ出力される。ＲＭ2 ８６３の出力の下位４ビットは、加算処理１（８７２）へ出力され、      
ＲＭ2 ８６３の出力の上位４ビットは、図示していない加算処理１へ出力される。
【００８３】
加算処理１（８７１）の出力の下位４ビットは、当該変換乗算処理８５１の１桁めの出力値となり、加算処理１（８７１）の出力の上位４ビットは、加算処理２（８７３）へ出力される。加算処理１（８７２）の出力の下位４ビットは、加算処理２（８７３）へ出力され、加算処理１（８７２）の出力の上位４ビットは、図示していない加算処理２へ出力される。
【００８４】
以上説明したように、処理を各桁に分割することで、入力のビットサイズの和（上記例では、１０２４＋１０２４＝２０４８ビット）が小さくなるため、テーブル化したときのテーブルサイズを削減できる。
例えば、１００桁目、すなわち、ＲＭ100 では、入力が４ビットの整数２０２個分であり、入力のビットサイズの和が２０２×４＝８０８ビットとなる。そのため、１００桁目のテーブルサイズは、２808 ×（テーブルの出力バイトサイズ）バイトとなる。分割前では一つのテーブルサイズが２2048×（テーブルの出力バイトサイズ）バイトであるため、テーブルサイズが削減できている。
【００８５】
上記では、変換乗算処理について示したが、変換剰余処理についても、同様の代入及び展開の処理により、図１１のように分割することができる。なお、図１１の中のπは、変換乗算剰余処理ＲＴi 内のπi を示しているが、簡単のため、インデックスｉを省略している。
以下、図１１を用いて分割処理について、説明する。
【００８６】
変換剰余処理を示す式における入力Ｚに、
Ｚ0 ＋Ｚ1 ×２4 ＋Ｚ2 ×２8 ＋・・・＋Ｚb-1 ×２4(b-1)＋Ｚb ×２4b＋・・・＋Ｚ2b-1×２4(2b-1)を代入する。ここで、ｂは整数ｎのビットサイズを４で割ったものであり、本実施の形態における整数ｎの桁数を表す。ｎのビットサイズを１０２４としたときは、ｂ＝２５６となる。
【００８７】
なお、上記の式では、変換剰余処理の入力Ｚの桁数を２×ｂ−１桁としているが、これは以下の理由による。変換剰余処理の入力Ｚは、変換乗算処理の結果である。この変換乗算処理では、前段のテーブルの出力結果と対象データＸとの演算が行われる。ここで、前段のテーブルの出力結果は前段のテーブルにおいてｍｏｄ  ｎがかけられているためにｂ−１桁以下の桁数を持ち、また、対象データＸはＲＳＡ暗号ではｎ以下の値である必要があるので、こちらもｂ−１桁以下の桁数を持つ。ｂ−１桁同士の乗算は、２×ｂ−２桁の演算結果を取り、さらに１桁の桁上がりが発生することがあるので、それも加えて変換後剰余処理の入力は最大２×ｂ−１桁となる。
【００８８】
ここで、
Ｚ  ｍｏｄ  ｎ
＝（（Ｚ0 ＋Ｚ1 ×２4 ＋．．．＋Ｚb-1 ×２4(b-1)）
＋（Ｚb ×２4b  ｍｏｄ  ｎ）
＋（Ｚb+1 ×２4(b+1)）  ｍｏｄ  ｎ）
＋・・・
＋（Ｚ2b-1×２4(2b-1)  ｍｏｄ  ｎ））  ｍｏｄ  ｎ
となることを利用して、
Ｚb ×２4b  ｍｏｄ  ｎの演算を示す処理、
Ｚb+1 ×２4(b+1)  ｍｏｄ  ｎの演算を示す処理、
・・・、Ｚ2b+1×２4(2b-1)  ｍｏｄ  ｎを示す処理に分割し、それぞれをテーブル化して、これらのテーブルの出力を、加算テーブルを用いて、加算することで、剰余演算を行う。
【００８９】
図１１では、ｉ≧ｂに対するＺi ×２4i  ｍｏｄ  ｎを示す処理をＲＤi と表現している。なお、図１１において、分割された各処理ＲＤi の間に加算“＋”を入れているが、この加算は、変換後乗算処理の分割の際に使用した加算と同じように、それぞれの桁に分割し、分割した後の加算処理には、それぞれ入力値変換及び出力値変換を追加するような処理を示す。
【００９０】
（６）難読化装置１００による難読化処理の方法（第５の難読化の方法−処理の分割（その２））
第４の難読化の方法で説明したように、処理を分割した場合、０桁目（最下位の桁）や１桁目であれば、入力（４ビットの整数の個数）が少ないため、テーブルサイズはあまり大きくない。しかし、桁が増えるほど、テーブルサイズが大きくなってしまう。
【００９１】
例えば、１００桁目では、入力が４ビットの整数２０２個分であり、入力のビットサイズの和が２０２×４＝８０８ビットとなる。そのため、１００桁目のテーブルサイズは、２808 ×（テーブルの出力バイトサイズ）バイトとなり、非常に大きい。
そこで、第５の難読化の方法では、各桁に対しても、処理をさらに分割する。図１２には、２桁目の処理のさらなる分割を示している。２桁目の分割前の処理６０１では、ＲＭ2 ６０２の入力をＺ0 、Ｚ1 、Ｚ2 、Ｘ0 、Ｘ1 及びＸ2 としているが、さらなる分割後の処理６１１では、処理６０１をＺ0 、Ｚ2、 Ｘ0 及びＸ2 の４入力とする処理６２１と、Ｚ1 及びＸ1 の２入力とする処理６２２とに分割する。
【００９２】
他の桁の処理に対しても、同様に４入力のテーブルと２入力のテーブルに分割する。
ここで、処理６２１は、インデックスの値の加算結果が桁数と同じものになるパターンであるＺの各桁（例えば、２桁目を分割する場合、０＋２＝２であるので、Ｚ0 ，Ｚ2 となる）と、これと同じインデックスを持つＸの各桁（Ｘ0 ，Ｘ2 ）とを４個の入力とするテーブルである。
【００９３】
さらに、桁数が偶数である場合には、処理６２２は、桁数の半分のインデックスを持つＺの桁（桁数が２であるとき、Ｚ1 。１＋１＝２であるから。）と、これと同じインデックスを持つＸの桁（Ｘ1 ）とを２個の入力とするテーブルである。このような桁は、変換の内容自体は４入力の場合と同様になるのであるが、４入力中の入力値に互いに同一になる入力値が含まれるため、２入力にまとめることができる。
【００９４】
他の桁に対しても、これと同様の方法でテーブル分割する。例えば、５桁目のテーブルは、以下の入力を持つテーブルに分割する。
ＲＭ＿（５，０）：Ｚ0 ，Ｚ5 ，Ｘ0 ，Ｘ5 
ＲＭ＿（５，１）：Ｚ1 ，Ｚ4 ，Ｘ1 ，Ｘ4 
ＲＭ＿（５，２）：Ｚ2 ，Ｚ3 ，Ｘ2 ，Ｘ3 
また、８桁目のテーブルは、以下の入力を持つテーブルに分割する。
【００９５】
ＲＭ＿（８，０）：Ｚ0 ，Ｚ8 ，Ｘ0 ，Ｘ8 
ＲＭ＿（８，１）：Ｚ1 ，Ｚ7 ，Ｘ1 ，Ｘ7 
ＲＭ＿（８，２）：Ｚ2 ，Ｚ6 ，Ｘ2 ，Ｘ6 
ＲＭ＿（８，３）：Ｚ3 ，Ｚ5 ，Ｘ3 ，Ｘ5 
ＲＭ＿（８，４）：Ｚ4 ，Ｘ4 
なお、ＲＭに付されたインデックス（Ｘ、Ｙ）は、はじめのものＸが何桁目であるかを示し、二つ目のものＹが入力のインデックスの最小値を示している。
【００９６】
上記のように、処理を分割し、分割した処理をテーブル化することで、一つのテーブルサイズが、２16×（テーブルの出力バイトサイズ）バイトとなり、テーブル削減できる。
なお、２乗算においても同様の分割が可能である。分割の仕方は乗算とほぼ同様なので省略する。
（７）分割したテーブルの共通化
上記のようにテーブルを分割すると、図１３に示すように、テーブルの処理に共通点があり、この共通点を用いて、複数のテーブルの共通化ができる。図１３においては、ＲＭの分割テーブルの共通化６５７とＲＳの分割テーブルの共通化６５８について示している。ここで、ＲＳは、２乗算を示す処理である。
【００９７】
図１３に示すＲＭの分割テーブルの共通化６５７において、枠で囲んだ二つのテーブル、例えば、テーブル６６１及びテーブル６６２は、それぞれ、入力に対し、同じ処理をしている。テーブル６６１及びテーブル６６２は、インデックスが、２×ｉ，ｉ（ｉ≠０）のテーブルである。インデックスが、２×ｉ，ｉ（ｉ≠０）のテーブルは、共通化することができ、複数のテーブルに代えて、同一の１個のテーブルを使用することが可能となる。
【００９８】
また、テーブル６６３及びテーブル６６４は、それぞれ、入力に対し、同じ処理をしている。テーブル６６３及びテーブル６６４は、インデックスが、ｉ，０（ｉ≠０）のテーブルである。これらのテーブルについても共通化が可能である。
さらに、テーブル６６５及びテーブル６５６は、それぞれ、入力に対し、同じ処理をしている。これらのテーブルについても共通化が可能である。
【００９９】
このように、各テーブルは、インデックスの組合せに依存して、次の４個のケースに分類できる。
（ケースａ）インデックスが０，０のテーブル
（ケースｂ）インデックスが、２×ｉ，ｉ（ｉ≠０）のテーブル
（ケースｃ）インデックスが、ｉ，０（ｉ≠０）
（ケースｄ）その他のインデックスを持つテーブル
ここで、インデックスが、ｉ，０（ｉ≠０）のテーブルと、その他のインデックスを持つテーブルとは、出力にｇ（Ｘi ）が加算されるか否かのみが異なる。また、インデックスが０，０のテーブルと、インデックスが２×ｉ，ｉ（ｉ≠０）のテーブルとは、これと同様にｇ（Ｘi ）（インデックスが０，０の場合はｇ（Ｘ0 ））が加算されるか否かのみが異なる。すなわち、インデックスの二つ目が０のテーブルは、他のものと異なり、ｇ（Ｘi ）もしくはｇ（Ｘ0 ）が出力に加算されている。
【０１００】
このように、ケースａ、ケースｂ、ケースｃ及びケースｄのそれぞれに属する複数のテーブルについては、テーブルの入力値が異なるだけで、入力値と出力値との対応関係は、同じである。従って、各ケースに属する複数のテーブルをそれぞれ用いることなく、ケース毎にテーブルを共通化し、１個の共通化したテーブルを用いるようにすることができる。
【０１０１】
こうして、分割された乗算処理において、多数のテーブルを用いることに代えて、４個のテーブルのみを使用することが可能となる。入力されるＸ及びＺのイッデックスに応じて、４個のテーブルから適切なテーブルを１個選択すればよい。
また、図１３に示すＲＳの分割テーブルの共通化６５８においても、上記と同様に、枠で囲んだ二つのテーブル、例えば、テーブル６８１及びテーブル６８２は、それぞれ、入力に対し、同じ処理をしている。テーブル６８１及びテーブル６８２は、インデックスが、２×ｉ，ｉ（ｉ≠０）のテーブルである。インデックスが、２×ｉ，ｉ（ｉ≠０）のテーブルは、共通化することができ、複数のテーブルに代えて、同一の１個のテーブルを使用することが可能となる。
【０１０２】
また、テーブル６８３及びテーブル６８４は、それぞれ、入力に対し、同じ処理をしている。テーブル６８３及びテーブル６８４は、インデックスが、ｉ，０（ｉ≠０）のテーブルである。これらのテーブルについても共通化が可能である。
さらに、テーブル６８５及びテーブル６８６は、それぞれ、入力に対し、同じ処理をしている。
【０１０３】
図１３に示すＲＳの分割テーブルの共通化６５８においても、上記と同様に、各テーブルは、インデックスの組合せに依存して、上記の４個のケースに分類できる。
こうして、分割された２乗算処理においても、多数のテーブルを用いることに代えて、４個のテーブルのみを使用することが可能となる。
（８）難読化装置１００による難読化の実行
以上で示したように、入力値変換や出力値変換、処理の分割、分割した処理をテーブル化したときの共通化を施すことにより、難読化装置１００は、難読化を実行する。
【０１０４】
以下では、図４の乗算剰余と２乗算剰余の配置情報を乗算配置情報と呼ぶ。また、図５〜１３において説明した入力値変換や出力値変換、処理の分割の結果、得られる処理やテーブルの配置が定まる。この処理やテーブルの配置を示す情報を、以下では、分割処理配置情報と呼ぶ。
難読化装置１００は、まず、乗算配置情報を生成し、次に分割処理配置情報を生成する。その後、分割処理配置情報で使用する入力値変換や出力値変換を決定し、それに基づいてテーブルを生成する。
【０１０５】
テーブルは、例えば、入力値に、その入力値が入力された場合に変換後の処理で算出される値をそれぞれ計算し、対応付けることにより生成される。具体的な実現方法としては多次元の配列などが考えられる。さらに、分割処理配置情報に基づいて、テーブルの読出命令の順序を示す読出命令順序情報を生成する。その後、生成した読出命令順序情報と生成したテーブルとを合わせることで、難読化プログラムが完成する。
【０１０６】
なお、難読化装置１００により生成される難読化プログラムは、上記読出命令順序情報とテーブル以外の命令やデータを含んでもよい。また、予め、分割処理配置情報は難読化装置１００に予め与えられるとしてもよい。
（９）乗算処理の分割の具体例
乗算処理の分割の具体例について図１４〜図１９を用いて説明する。
【０１０７】
（ａ）ＲＴ1 の分割
秘密鍵ｄの１桁目にあたる変換であるＲＴ1 の分割について、ＲＴ1 が乗算処理である場合を例に説明する。図１４は、ＲＴ1 について分割された乗算処理１００２の構成を示す図である。
このＲＴ1 は、秘密鍵ｄの１桁目にあたる変換であるので、入力値依存減算や変換π-1は含まれない。この例では、ｎのビットサイズを６ビットとし、この６ビットのデータを２桁に分割している。ここで、各桁は、３ビットからなる。また、中間値Ｚ，Ｘはそれぞれ、
Ｚ＝Ｚ0 ＋Ｚ1 ×２3 ，
Ｘ＝Ｘ0 ＋Ｘ1 ×２3 となる。
【０１０８】
すなわち、Ｚ0 、Ｚ1 、Ｘ0 、Ｘ1 はそれぞれ、Ｚ，Ｘを３ビットずつに分割した値である。このとき、乗算処理が上述の方法に基づいて、各桁に分割され、乗算処理１００２は、図１４に示すように、ＲＭ0 １１２１、ＲＭ1 １１２２、ＲＭ2 １１２３、加算処理ＲＡ1 １１２４、ＲＡ2 １１２５、ＲＡ3 １１２６、ＲＡ1 １１２７、ＲＡ2 １１２８、ＲＡ2 １１２９、ＲＡ4 １１３０及び      
ＲＡ5 １１３１を含む。
【０１０９】
ここで、ＲＭ0 １１２１は、ＲＴ1 の０桁目の計算であり、Ｚ0 ，Ｘ0 を入力とする分割後の乗算処理であり、ＲＭ1 １１２２は、ＲＴ1 の１桁目の計算であり、Ｚ0 ，Ｚ1 ，Ｘ0 ，Ｘ1 を入力とする分割後の乗算処理であり、ＲＭ2 １１２３は、ＲＴ2 の２桁目計算であり、Ｚ1 ，Ｘ1 を入力とする分割後の乗算処理である。
ＲＭ0 ，ＲＭ1 ，ＲＭ2 のそれぞれ出力を加算処理ＲＡ1 ，ＲＡ2 ，．．．，ＲＡ5 によって加算して得られる結果が、ＺとＸの乗算結果の変換後の値である。
【０１１０】
本実施の形態では、上述したようにＲＭ0 ，ＲＭ1 ，ＲＭ2 ，ＲＡ1 ，      
ＲＡ2 ，．．．，ＲＡ5 もそれぞれテーブル化することで解析が困難になるようにする。なお、ＲＡ1 ，ＲＡ2 ，．．．，ＲＡ5 は、図１０に示す加算処理１や加算処理２と同様、それぞれに入力値変換及び出力値変換が含まれている。
ここで、ＲＭ0 １１２１，ＲＭ1 １１２２及びＲＭ2 １１２３を示すボックス内部に“［０，５６］”、“［０，１０５］”及び“［０，１０５］”の記述があるが、これらは、これらの処理における出力値の、これらの処理内の出力値変換前の値が、それぞれ、「０」から「５６」の範囲、「０」から「１０５」の範囲及び「０」から「４９」の範囲の値であることを示す。
【０１１１】
また、ＲＭ0 １１２１，ＲＭ1 １１２２，ＲＭ2 １１２３，ＲＡ1 １１２４，ＲＡ2 １１２５，ＲＡ3 １１２６は、複数個の出力（ＲＭ1 については、３桁の出力であるため、中位部分も存在し、３個の出力を有し、その他については、２個の出力を有する）を有する。ここで、ＲＭ1 １１２２以外については、図面に向かって左側の出力が出力値変換前の出力の上位部分を示し、右側の出力が出力値変換前の出力の下位部分を示す。ＲＭ1 １１２２については、３桁の出力であるため、中位部分も存在する。
【０１１２】
例えば、ＲＭ0 １１２１については、出力値が「０」から「５６」の範囲であり、その出力値の上位３ビットは、ＲＡ1 １１２４に入力され、下位３ビットは乗算処理１００２の出力とされている。ＲＭ0 １１２１の上位部分及び下位部分の“［０，７］”についても、それぞれの出力値変換前の値が０から７の範囲の値であることを示す。また、乗算処理１００２は、最終出力値として、図１４の最下部に記載されている各３ビットの出力値１１４２ａ、１１４２ｂ、１１４２ｃ、１１４２ｄ及び１１４２ｅを出力する。この例では、乗算処理１００２は、６ビットのＺ及びＸを入力し、１５ビットの値を出力している。
【０１１３】
図１５では、図１４の乗算処理１００２を構成するＲＭ0 １１２１，ＲＭ1 １１２２，ＲＭ2 １１２３，ＲＡ1 １１２４，ＲＡ2 １１２５，・・・，ＲＡ5 １１３１のそれぞれについて、図面上において、入力値変換及び出力値変換を明らかにしている。
例えば、ＲＡ1 １１２４は、上位側の入力値の直後に入力値変換β-1１１２４ｂを含み、下位側の入力値の直後に入力値変換β-1１１２４ａを含み、入力値変換β-1１１２４ｂの出力値と入力値変換β-1１１２４ａの出力値とを加算する加算１１２４ｃを含み、加算１１２４ｃの上位側の出力値の直後に              
出力値変換γ1 １１２４ｅを含み、加算１１２４ｃの下位側の出力値の直後に出力値変換β１１２４ｄを含む。
【０１１４】
また、ＲＭ0 １１２１は、上位側の入力値及び下位側の入力値に対する乗算１１２１ａを含み、乗算１１２１ａの上位側の出力値の直後に、出力値変換β１１２１ｃを含み、乗算１１２１ａの下位側の出力値の直後に、出力値変換β１１２１ｂを含む。
（ｂ）ＲＴi （２≦ｉ≦ｋ−１）の分割
続いて、ＲＴi （２≦ｉ≦ｋ−１）について分割された乗算処理の構成について説明する。これらの変換には、前段の出力値変換等の逆変換が含まれているので、ＲＴ1 とは内容が多少異なっている。図１６は、ＲＴi （２≦ｉ≦ｋ−１）について分割された乗算処理１００４の構成を示す図である。この例においても、ｎのビットサイズを６ビットとし、６ビットのデータを２桁に分割している。各桁は、３ビットからなる。
【０１１５】
このとき、乗算処理が各桁において分割され、ＲＴ1 に対する乗算処理のときと同様に、乗算処理１００４は、図１６に示すように、ＲＭ0 １１８１、      
ＲＭ1 １１８２、ＲＭ2 １１８３、加算処理ＲＡ6 １１８４、ＲＡ7 １１８５、ＲＡ8 １１８６、ＲＡ1 １１８７、ＲＡ7 １１８８、ＲＡ2 １１８９、ＲＡ9 １１９０及びＲＡ10１１９１を含む。
【０１１６】
ここで、ＲＭ0 １１８１は、Ｚ0 ，Ｘ0 を入力とする分割後の乗算処理であり、ＲＭ1 １１８２は、Ｚ0 ，Ｚ1 ，Ｘ0 ，Ｘ1 を入力とする分割後の乗算処理であり、ＲＭ2 １１８３は、Ｚ1 ，Ｘ1 を入力とする分割後の乗算処理である。
さらに、ＲＭ0 ，ＲＭ1 ，ＲＭ2 の出力を加算処理ＲＡ1 ，ＲＡ2 ，．．．，ＲＡ10によって加算した結果がＺとＸの乗算結果の変換後の値である。ここで、ＲＭ0 ，ＲＭ1 ，ＲＭ2 ，ＲＡ1 ，ＲＡ2 ，・・・，ＲＡ10をテーブル化する。
【０１１７】
ここで、ＲＭ0 ，ＲＭ1 ，ＲＭ2 に“［−７，５６］”などの記述があるが、これはこの処理の出力が−７から５６の範囲の値であることを示す。ここで、ＲＴ1 に対する乗算処理と異なり、負の値が範囲に含まれることに注意する。負の出力は、前段の入力値依存加算を相殺するための、入力依存値減算が行われるために発生する。ここで、ＲＭ0 ，ＲＭ1 ，ＲＭ2 ，ＲＡ1 ，ＲＡ2 ，・・・，ＲＡ10は、負の値の範囲として含む上位部分と、正の値を範囲とする下位部分の２個の出力を有する。図面に向かって左側の出力が出力値変換前の出力の上位部分を示し、右側の出力が出力値変換前の出力の下位部分となる（ＲＭ1 は、０〜１０５までの１０６種類の値を取り、２進数標記では７ビット必要となるため、１桁を３ビットとした場合には３桁となり、正の値を範囲とする中位部分も存在する）。
【０１１８】
例えば、ＲＭ0 については、出力ｏｕｔに対し、
下位部分＝ｏｕｔ  ｍｏｄ  ８，
上位部分＝（ｏｕｔ−（下位部分））／８である。
また、ＲＭ＿１については、出力ｏｕｔに対し、
下位部分＝ｏｕｔ  ｍｏｄ  ８，
中位部分＝（ｏｕｔ−（下位部分））／８  ｍｏｄ  ８，
上位部分＝（ｏｕｔ−下位部分−中位部分×８）／６４である。
【０１１９】
なお、出力の上位部分や下位部分などに対する値の範囲は、出力値変換前の値であり、出力値変換後はこの範囲の値となるとは限らない。例えば、ＲＭ0 の出力の上位部分は、出力値変換前は［−１，７］であるが、出力値変換後は、扱いやすいように［０，８］などとする。この例では、乗算処理において、６ビットのＺ及びＸを入力し、１６ビットの値（最上位桁は符号の情報を含む）を出力している。
【０１２０】
図１７では、図１６に示すＲＭ0 １１８１，ＲＭ1 １１８２，ＲＭ2 １１８３、・・・、ＲＡ1 １１８７，ＲＡ2 １１８９，・・・，ＲＡ10１１９１について、それぞれに含まれる入力値変換及び出力値変換を明らかにしている。例えば、ＲＡ6 １１８４は、上位側の入力値の直後に入力値変換β-1１１８４ｂを、上位側の入力値の直後にγ5 -1１１８４ａを、出力値の上位部分の直前に            
出力値変換γ7 １１８４ｄを、出力値の下位部分の直後に出力値変換β１１８４ｃを含むことを示している。
【０１２１】
なお、各入力値変換と出力値変換は、図中で直接繋がっている箇所同士で打ち消しあう変換であれば、どのような変換でも構わない。
（ｃ）ＲＴk の分割
次に、ＲＴk について分割された乗算処理の構成について説明する。
図１８は、ＲＴk について分割された乗算処理１００９の構成を示す図である。
【０１２２】
乗算処理１００９は、図１８に示すように、ＲＭ0 １３３１、ＲＭ1 １３３２、ＲＭ2 １３３３、加算処理ＲＡ17１３３４、ＲＡ7 １３３５、ＲＡ8 １３３６、ＲＡ14１３３７、ＲＡ7 １３３８、ＲＡ15１３３９、ＲＡ9 １３４０及び      
ＲＡ18１３４１を含む。
ここで、ＲＭ0 １３３１は、Ｚ0 ，Ｘ0 を入力とする分割後の乗算処理であり、ＲＭ1 １３３２は、Ｚ0 ，Ｚ1 ，Ｘ0 ，Ｘ1 を入力とする分割後の乗算処理であり、ＲＭ2 １３３３は、Ｚ1 ，Ｘ1 を入力とする分割後の乗算処理である。
【０１２３】
さらに、ＲＭ0 ，ＲＭ1 ，ＲＭ2 の出力を加算処理ＲＡ17，ＲＡ7 ，．．．，によって加算した結果がＺとＸの乗算結果の変換後の値である。
図１９では、図１８の乗算処理１００９を構成するＲＭ0 １３３１、ＲＭ1 １３３２、ＲＭ2 １３３３、ＲＡ17１３３４、ＲＡ7 １３３５、ＲＡ8 １３３６、ＲＡ14１３３７、ＲＡ7 １３３８、ＲＡ15１３３９、ＲＡ9 １３４０及び      
ＲＡ18１３４１のそれぞれについて、図面上において、入力値変換及び出力値変換を明らかにしている。
【０１２４】
なお、図１９に示すＲＭ0 １３３１、ＲＡ17１３３４、ＲＡ14１３３７、ＲＡ15１３３９及びＲＡ18１３４１には、それぞれ、変換Ｅが含まれている。ここで、変換Ｅは、何もしないことを示す。
（ｄ）ＲＴ1 についてのＲＭ1 に対応するテーブルの具体例
ＲＴ1 についての図１５に示すＲＭ1 １１２２に対応するテーブルの具体例を図４１〜図４３に示している。
【０１２５】
図４１は、ＲＴ1 について図１５に示すＲＭ1 １１２２の詳細を示す。      
ＲＭ1 は、４個の入力値ｉｎ１、ｉｎ２、ｉｎ３及びｉｎ４から構成される入力値群（ｉｎ１、ｉｎ２、ｉｎ３、ｉｎ４）に対して、図４３に示すテーブル１４２１を用いた変換を施して、３個の出力値ｏｕｔ１、ｏｕｔ２及びｏｕｔ３から構成される出力値群（ｏｕｔ１、ｏｕｔ２、ｏｕｔ３）を出力する。
【０１２６】
ここで、ｉｎ１＝Ｚ0 、ｉｎ２＝Ｚ1 、ｉｎ３＝Ｘ0 及びｉｎ４＝Ｘ1 とすると、ＲＴ1 は、
ｖａｌ＝Ｚ0 ×Ｘ1 ＋Ｚ1 ×Ｘ0
−ｇ（Ｘ0 ）×Ｘ1 −  ｇ（Ｘ1 ）×Ｘ0 ＋ｇ（Ｘ1 ）を算出し、
ｏｕｔ１＝γ3 [val - (val mod 8) -(((val-(val mod 8)))mod8)×8))/64]、
ｏｕｔ２＝β[((val - (val mod 8))8)mod8]、
ｏｕｔ３＝β[val mod 8]  を算出する。
【０１２７】
テーブル１４２１は、図４３に示すように、複数の入力値群（ｉｎ１、ｉｎ２、ｉｎ３、ｉｎ４）と、前記複数の入力値群にそれぞれ対応する複数の出力値群（ｏｕｔ１、ｏｕｔ２、ｏｕｔ３）とから構成されている。
なお、図４３では、演算過程の理解を容易にするために、複数の入力値群（ｉｎ１、ｉｎ２、ｉｎ３、ｉｎ４）及び複数の出力値群（ｏｕｔ１、ｏｕｔ２、ｏｕｔ３）以外に、演算途中の中間値についても、記載しているが、上述した通り、テーブル１４２１は、複数の入力値群（ｉｎ１、ｉｎ２、ｉｎ３、ｉｎ４）及び複数の出力値群（ｏｕｔ１、ｏｕｔ２、ｏｕｔ３）のみから構成されているので、注意を要する。
【０１２８】
図４２（ａ）、図４２（ｂ）及び図４２（ｃ）は、それぞれ、ＲＴ1 について図１５に示すＲＭ1 における変換β、変換ｇ及び変換γ3 の具体例としてのテーブル１４２２、１４２３、１４２４を示す。
（ｅ）ＲＴi （２≦ｉ≦ｋ−１）についてのＲＭ1 に対応するテーブルの具体例
ＲＴi （２≦ｉ≦ｋ−１）についての図１７に示すＲＭ1 １１８２に対応するテーブルの具体例を図２４〜図２６に示している。
【０１２９】
図２４は、ＲＴi （２≦ｉ≦ｋ−１）について図１７に示すＲＭ1 １１８２の詳細を示す。ＲＭ1 は、４個の入力値ｉｎ１、ｉｎ２、ｉｎ３及びｉｎ４から構成される入力値群（ｉｎ１、ｉｎ２、ｉｎ３、ｉｎ４）に対して、図２５に示すテーブル１３６０を用いた変換を施して、３個の出力値ｏｕｔ１、ｏｕｔ２及びｏｕｔ３から構成される出力値群（ｏｕｔ１、ｏｕｔ２、ｏｕｔ３）を出力する。
【０１３０】
ここで、ｉｎ１＝Ｚ0 、ｉｎ２＝Ｚ1 、ｉｎ３＝Ｘ0 及びｉｎ４＝Ｘ1 とすると、ＲＴi （２≦ｉ≦ｋ−１）は、
ｖａｌ＝φ-1（Ｚ0 ）×（Ｘ1 ）＋φ-1（Ｚ1 ）×（Ｘ0 ）
−ｇ（Ｘ0 ）×Ｘ1 −  ｇ（Ｘ1 ）×Ｘ0 ＋ｇ（Ｘ1 ）を算出し、
ｏｕｔ１＝γ3 [val - (val mod 8) -(((val-(val mod 8))/8)mod8)×8))/64]、
ｏｕｔ２＝β[((val - (val mod 8)) /8)mod8]、
ｏｕｔ３＝β[val mod 8]  を算出する。
【０１３１】
テーブル１３６０は、図２５に示すように、複数の入力値群（ｉｎ１、ｉｎ２、ｉｎ３、ｉｎ４）と、前記複数の入力値群にそれぞれ対応する複数の出力値群（ｏｕｔ１、ｏｕｔ２、ｏｕｔ３）とから構成されている。
なお、図２５では、演算過程の理解を容易にするために、複数の入力値群（ｉｎ１、ｉｎ２、ｉｎ３、ｉｎ４）及び複数の出力値群（ｏｕｔ１、ｏｕｔ２、ｏｕｔ３）以外に、演算途中の中間値についても、記載しているが、上述した通り、テーブル１３６０は、複数の入力値群（ｉｎ１、ｉｎ２、ｉｎ３、ｉｎ４）及び複数の出力値群（ｏｕｔ１、ｏｕｔ２、ｏｕｔ３）のみから構成されているので、注意を要する。
【０１３２】
図２６（ａ）、図２６（ｂ）、図２６（ｃ）及び図２６（ｄ）は、それぞれ、ＲＴ1 について図１７に示すＲＭ1 における変換β、変換φ-1、変換ｇ及び変換γ3 の具体例としてのテーブルを示す。
なお、図２５において、ｏｕｔ１の出力値変換前の値は、−２から２の範囲の５種類であるが、γ3 を施すことにより、０から７の範囲の値（８種類）に変換している。こうすることで、攻撃者が変換後の値それぞれの発生確率を調べて、変換前の値を推測することを困難にしている。例えば、最も発生確率が高い値が、変換前の０であると推測することでテーブルの処理の内容を解析する攻撃を防ぐ。なお、このとき、−１に対応するγ3 （−１）が０と１の２値となっているが、全体のＲＭ1 のテーブルの出力ｏｕｔ１の値が可能な限り一様となるように、  γ3 を設定する。すなわち、出力ｏｕｔ１の値は０から７で分布するが、このそれぞれの値が同じ発生確率となるようにγ3 を設定する。図２６では、γ3 への入力として−１，０，１の発生確率が高いため、これをそれぞれ２値へ変換している。また、後述する図３１のｏｕｔ１におけるγ1 も同様に多値へ変換するようにしている。
【０１３３】
（ｆ）ＲＴk についてのＲＭ1 に対応するテーブルの具体例
ＲＴk についての図１９に示すＲＭ1 １３３２に対応するテーブルの具体例を図２７〜図２９に示している。
図２７は、ＲＴk について図１９に示すＲＭ1 １３３２の詳細を示す。      
ＲＭ1 は、４個の入力値ｉｎ１、ｉｎ２、ｉｎ３及びｉｎ４から構成される入力値群（ｉｎ１、ｉｎ２、ｉｎ３、ｉｎ４）に対して、図２８に示すテーブル１３９０を用いた変換を施して、３個の出力値ｏｕｔ１、ｏｕｔ２及びｏｕｔ３から構成される出力値群（ｏｕｔ１、ｏｕｔ２、ｏｕｔ３）を出力する。
【０１３４】
ここで、ｉｎ１＝Ｚ0 、ｉｎ２＝Ｚ1 、ｉｎ３＝Ｘ0 及びｉｎ４＝Ｘ1 とすると、ＲＴk は、
ｖａｌ＝φ-1（Ｚ0 ）×（Ｘ1 ）＋φ-1（Ｚ1 ）×（Ｘ0 ）
−ｇ（Ｘ0 ）×Ｘ1 −  ｇ（Ｘ1 ）×Ｘ0 を算出し、
ｏｕｔ１＝γ3 [val - (val mod 8) -(((val-(val mod 8)))mod8)×8))/64]、
ｏｕｔ２＝β[((val - (val mod 8)))mod8]、
ｏｕｔ３＝β[val mod 8]  を算出する。
【０１３５】
テーブル１３９０は、図２８に示すように、複数の入力値群（ｉｎ１、ｉｎ２、ｉｎ３、ｉｎ４）と、前記複数の入力値群にそれぞれ対応する複数の出力値群（ｏｕｔ１、ｏｕｔ２、ｏｕｔ３）とから構成されている。
なお、図２８では、演算過程の理解を容易にするために、複数の入力値群（ｉｎ１、ｉｎ２、ｉｎ３、ｉｎ４）及び複数の出力値群（ｏｕｔ１、ｏｕｔ２、ｏｕｔ３）以外に、演算途中の中間値についても、記載しているが、上述した通り、テーブル１３９０は、複数の入力値群（ｉｎ１、ｉｎ２、ｉｎ３、ｉｎ４）及び複数の出力値群（ｏｕｔ１、ｏｕｔ２、ｏｕｔ３）のみから構成されているので、注意を要する。
【０１３６】
図２９（ａ）、図２９（ｂ）、図２９（ｃ）及び図２９（ｄ）は、それぞれ、ＲＴk について図１９に示すＲＭ1 における変換β、変換φ-1、変換ｇ及び変換γ3 の具体例としてのテーブル１３９１、１３９２、１３９３、１３９４を示す。
（ｇ）ＲＴ1 についてのＲＡ1 に対応するテーブルの具体例
ＲＴ1 についての図１５に示すＲＡ1 １１２４に対応するテーブルの具体例を図３０〜図３２に示している。
【０１３７】
図３０は、ＲＴ1 について図１５に示すＲＡ1 １１２４の詳細を示す。      
ＲＡ1 は、２個の入力値ｉｎ１及びｉｎ２から構成される入力値群（ｉｎ１、ｉｎ２）に対して、図３１に示すテーブル１４１０を用いた変換を施して、２個の出力値ｏｕｔ１及びｏｕｔ２から構成される出力値群（ｏｕｔ１、ｏｕｔ２）を出力する。
ＲＴ1 は、
ｏｕｔ１＝γ1 [(β-1(in1)+β-1(in2)-out2)/8]、
ｏｕｔ２＝β[β-1(in1)+β-1(in2) mod8]を算出する。
【０１３８】
テーブル１４１０は、図３１に示すように、複数の入力値群（ｉｎ１、ｉｎ２）と、前記複数の入力値群にそれぞれ対応する複数の出力値群（ｏｕｔ１、ｏｕｔ２）とから構成されている。
なお、図３１では、演算過程の理解を容易にするために、複数の入力値群（ｉｎ１、ｉｎ２）及び複数の出力値群（ｏｕｔ１、ｏｕｔ２）以外に、演算途中の中間値についても、記載しているが、上述した通り、テーブル１４１０は、複数の入力値群（ｉｎ１、ｉｎ２）及び複数の出力値群（ｏｕｔ１、ｏｕｔ２）のみ構成されているので、注意を要する。
【０１３９】
図３２（ａ）、図３２（ｂ）及び図２９（ｃ）は、それぞれ、ＲＴ1 について図１５に示すＲＡ1 における変換β、変換γ1 及び変換β-1の具体例としてのテーブル１４１１、１４１２、１４１３を示す。
（１０）剰余処理の分割の具体例
剰余処理の分割の具体例について図２０〜２３を用いて説明する。
【０１４０】
分割された剰余処理１００５は、図２０〜２３に示すように、剰余算ＲＤ0 １２０１、ＲＤ1 １２０６、ＲＤ2 １２１２、ＲＤ3 １２１８、加算ＲＡ1 １２０２、ＲＡ1 １２０３、ＲＡ2 １２０４、ＲＡ12１２０５、ＲＡ1 １２０７、ＲＡ1 １２０８、ＲＡ2 １２０９、ＲＡ12１２１０、ＲＡ4 １２１１、ＲＡ1 １２１３、ＲＡ1 １２１４、ＲＡ2 １２１５、ＲＡ13１２１６、ＲＡ4 １２１７、ＲＡ1 １２１９、ＲＡ1 １２２０、ＲＡ2 １２２１及びＲＡ4 １２２２から構成されている。
【０１４１】
ここで、剰余算ＲＤ0 １２０１、ＲＤ1 １２０６、ＲＤ2 １２１２、ＲＤ3 １２１８は、剰余算を行うためのテーブルである。これらのテーブルは、演算対象である対象値と、対象値に対する剰余値とを対応付けて構成する組を複数個記憶しており、ある対象値が入力として指定されると、その対象値に対応する剰余値が当該テーブルから引かれて出力される。なお、剰余算ＲＤ0 １２０１、      
ＲＤ1 １２０６、ＲＤ2 １２１２、ＲＤ3 １２１８は、上記の剰余算の前後において、変換を施す。
【０１４２】
また、ＲＡ1 、ＲＡ2 、ＲＡ12、・・・は、桁ごとの加算や桁上がりを反映するための加算を行う加算処理のテーブルである。これらのテーブルも、演算対象である２個の対象値と、前記２個の対象値の加算値とを対応付けて構成する組を複数個記憶しており、ある２個の対象値が入力として指定されると、その対象値に対応する加算値が当該テーブルから引かれて出力される。なお、ＲＡ1 、ＲＡ2 、ＲＡ12、・・・は、上記の加算の前後において、変換を施す。
【０１４３】
この例では、剰余処理１００５は、整数ｎを法としたときの、
Ｚ＝Ｚ0 ＋Ｚ1 ×２3 ＋Ｚ2 ×２6 ＋Ｚ3 ×２9 ＋Ｚ4 ×２12の剰余を計算している。
（ａ）剰余処理１００５のうち、図２０に示す演算では、
（Ｚ0 ＋Ｚ1 ×２3 ）＋（Ｚ2 ×２6   ｍｏｄ  ｎ）を計算している。
すなわち、図２０に示す演算では、剰余処理１００５の剰余算ＲＤ0 １２０１、加算ＲＡ1 １２０３、ＲＡ1 １２０２、は、それぞれ、３個の３ビットの入力値Ｚ2 、Ｚ1 、Ｚ0 の入力を受け付ける。
【０１４４】
剰余算ＲＤ0 １２０１は、その演算結果の上位３ビット及び下位３ビットをそれぞれ、加算ＲＡ1 １２０３、ＲＡ1 １２０２へ出力する。加算ＲＡ1 １２０３は、その演算結果の上位１ビット及び下位３ビットをそれぞれ、加算ＲＡ12１２０５及びＲＡ2 １２０４へ出力する。加算ＲＡ1 １２０２は、その演算結果の上位１ビット及び下位３ビットをそれぞれ、加算ＲＡ2 １２０４及びＲＡ1 １２０７へ出力する。加算ＲＡ2 １２０４は、その演算結果の上位１ビット及び下位３ビットをそれぞれ、加算ＲＡ12１２０５及びＲＡ1 １２０８へ出力する。加算ＲＡ12１２０５は、その演算結果の１ビットを、加算ＲＡ4 １２１１へ出力する。
【０１４５】
（ｂ）剰余処理１００５のうち、図２１に示す演算では、１個の入力値Ｚ3 が入力され、入力値Ｚ3 及び図２０における３個の最終の演算結果を用いて、（Ｚ3 ×２9   ｍｏｄ  ｎ）を加算している。
剰余算ＲＤ1 １２０６は、１個の３ビットの入力値Ｚ3 の入力を受け付け、その演算結果の上位３ビット及び下位３ビットをそれぞれ、加算ＲＡ1 １２０８、ＲＡ1 １２０７へ出力する。
【０１４６】
加算ＲＡ1 １２０８は、その演算結果の上位１ビット及び下位３ビットをそれぞれ、加算ＲＡ12１２１０及びＲＡ2 １２０９へ出力する。加算ＲＡ1 １２０７は、その演算結果の上位１ビット及び下位３ビットをそれぞれ、加算ＲＡ2 １２０９及びＲＡ1 １２１３へ出力する。加算ＲＡ2 １２０９は、その演算結果の上位１ビット及び下位３ビットをそれぞれ、加算ＲＡ12１２１０及びＲＡ1 １２１４へ出力する。加算ＲＡ12１２１０は、その演算結果の１ビットを、          
加算ＲＡ4 １２１１へ出力する。加算ＲＡ4 １２１１は、その演算結果の１ビットを、加算ＲＡ13１２１６へ出力する。
【０１４７】
（ｃ）さらに、剰余処理１００５のうち、図２２に示す演算では、１個の入力値Ｚ4 が入力され、入力値Ｚ4 及び図２１における３個の最終の演算結果を用いて、（Ｚ4 ×２12  ｍｏｄ  ｎ）を加算している。
剰余算ＲＤ2 １２１２は、１個の４ビットの入力値Ｚ4 の入力を受け付け、その演算結果の上位３ビット及び下位３ビットをそれぞれ、加算ＲＡ1 １２１４、ＲＡ1 １２１３へ出力する。
【０１４８】
加算ＲＡ1 １２１４は、その演算結果の上位１ビット及び下位３ビットをそれぞれ、加算ＲＡ4 １２１７及びＲＡ2 １２１５へ出力する。加算ＲＡ1 １２１３は、その演算結果の上位１ビット及び下位３ビットをそれぞれ、加算ＲＡ2 １２１５及びＲＡ1 １２１９へ出力する。加算ＲＡ2 １２１５は、その演算結果の上位１ビット及び下位３ビットをそれぞれ、加算ＲＡ4 １２１７及びＲＡ1 １２２０へ出力する。加算ＲＡ4 １２１７は、その演算結果の１ビットを、          
加算ＲＡ13１２１６へ出力する。加算ＲＡ13１２１６は、その演算結果の２ビットを、剰余算ＲＤ3 １２１８へ出力する。
【０１４９】
（ｄ）剰余処理１００５のうち、図２２における最終の計算結果は、３桁となるため、次に、さらなる剰余処理が必要になる。
剰余処理１００５のうち、図２３に示す演算は、その剰余処理を行う。図２３に示す演算の計算結果も３桁となる場合があり、その場合には、さらなる剰余処理が必要となり、図２３と同様の処理を繰り返す。その結果、２桁の値となれば、剰余演算結果（の出力値変換後）の値とする。
【０１５０】
剰余処理１００５のうち、図２３に示す演算では、剰余算ＲＤ3 １２１８は、その演算結果の上位３ビット及び下位３ビットをそれぞれ、加算ＲＡ1 １２２０、ＲＡ1 １２１９へ出力する。加算ＲＡ1 １２２０は、その演算結果の上位１ビット及び下位３ビットをそれぞれ、加算ＲＡ4 １２２２及びＲＡ2 １２２１へ出力する。加算ＲＡ1 １２１９は、その演算結果の上位１ビットを加算ＲＡ2 １２２１へ出力し、その演算結果の下位３ビットを最終出力とする。加算ＲＡ2 １２２１は、その演算結果の上位１ビットを加算ＲＡ4 １２２２へ出力し、その演算結果の下位３ビットを最終出力とする。加算ＲＡ4 １２２２は、その演算結果の１ビットを最終出力とする。
【０１５１】
（ｅ）なお、上記数値例では、ｎが６ビットの値であり、小さいため、乗算処理を各桁までの分割としているが、ビットサイズが大きくなった場合は、各桁の処理を「処理の分割（その２）」のようにさらに分割してもよい。
２．４  難読化システム１の構成及び動作
ここでは、難読化システム１を構成する難読化装置１００及び暗号処理装置３００の構成及び動作について説明する。
【０１５２】
（１）難読化装置１００の構成
図３３は、難読化装置１００の構成を示す図である。
難読化装置１００は、図３３に示すように、秘密鍵ｄの入力を受け付ける入力部１０１と、秘密鍵ｄから乗算処理及び２乗算処理の処理の順番を示す乗算配置情報を生成する乗算配置情報生成部１０２と、乗算処理及び２乗算処理を分割した処理と、それに対して追加する１つ以上の入力値変換と１つ以上の出力値変換の配置情報である分割処理配置情報を生成する分割処理配置情報生成部１０３と、入力値変換及び出力値変換を示す関数を生成する変換生成部１０４と、分割処理配置情報、入力値変換及び出力値変換を用いて、テーブルを生成するテーブル生成部１０５と、乗算配置情報と分割処理配置情報を用いて、テーブルを読み出す命令の配置を示す読出命令順序情報を生成する読出情報配置部１０６と、テーブルと読出命令順序情報を用いて、難読化プログラムを生成するプログラム生成部１０７と、難読化プログラムを媒体に記録する媒体記録部１０８とを備える。
【０１５３】
入力部１０１は、秘密鍵ｄを入力として受け付ける。
乗算配置情報生成部１０２は、秘密鍵ｄから乗算剰余処理及び２乗算剰余処理の処理の順番を示す乗算配置情報を生成する。これは、図４のステップＳ４０１に示す処理に対応する。図４の場合、乗算配置情報４２１は、｛２乗算剰余、乗算剰余、２乗算剰余、２乗算剰余、乗算剰余、．．．｝のような順番を示す情報となる。
【０１５４】
分割処理配置情報生成部１０３は、予め与えられた配置方法に従い、乗算剰余処理と２乗算剰余処理を分割した処理とそれに対して追加する１つ以上の入力値変換と１つ以上の出力値変換の配置情報である、分割処理配置情報を生成する。なお、ここで生成する情報は、各処理や変換の配置情報のみであり、処理や変換に対応する関数は生成しない。
変換生成部１０４は、分割処理配置情報を参照して、配置した入力値変換と出力値変換に対する関数を生成する。入力値変換及び出力値変換に対する関数の生成方法については、先の「２．３  難読化装置１００で実行する難読化について」で述べたとおりである。
【０１５５】
テーブル生成部１０５は、分割処理配置情報、入力値変換及び出力値変換を用いて、テーブルを生成する。テーブルの生成方法については、先の「２．３  難読化装置１００で実行する難読化について」で述べたとおりである。
読出情報配置部１０６は、乗算配置情報と分割処理配置情報を用いて、テーブルを読み出す命令を順番に配置した読出命令順序情報を生成する。具体的には、分割処理配置情報を用いて、変換後乗算剰余処理内及び変換後２乗算剰余処理内の各処理に対応するテーブル読出命令を順番に配置することでテーブル読出命令群を生成し、それらの変換後乗算剰余処理内及び変換後２乗算剰余処理内に対応するテーブル読出命令群を、乗算配置情報を用いて配置することで、テーブル読出命令を配置する。
【０１５６】
プログラム生成部１０７は、上記読出命令順序情報とテーブルを合わせた難読化プログラムを生成する。
媒体記録部１０８は、難読化プログラムを媒体２００に記録する。
（２）暗号処理装置３００の構成
図３４は暗号処理装置３００の構成を示す図である。
【０１５７】
暗号処理装置３００は、図３４に示すように、暗号化データまたはメッセージデータを入力する入力部３０１と、復号化データまたは署名データを出力する出力部３０２と、データメモリ３０３と、プログラムメモリ３０４と、ＣＰＵ３０５と、媒体２００から難読化プログラムを読込む媒体読込部３０６とを備える。
入力部３０１は、後述する復号化処理時に暗号化データ、署名生成処理時にメッセージデータを入力として受け付ける。
【０１５８】
出力部３０２は、後述する復号化処理時に復号化データ、署名生成処理時に署名データを出力する。
データメモリ３０３は、入力である復号化データやメッセージデータ、難読化プログラムを実行する際の中間値データを記憶する。
プログラムメモリ３０４は、難読化プログラムを記憶する。
【０１５９】
ＣＰＵ３０５は、難読化プログラムに記述されている命令を実行する。
媒体読込部３０６は、媒体２００から難読化プログラムを読込み、プログラムメモリ３０４に格納する。
（３）  難読化システム１の動作
難読化システム１の動作は、難読化装置１００において難読化プログラムを生成し、媒体２００に記録する「難読化処理時」の動作と、暗号処理装置３００において媒体２００に記録されている難読化プログラムを実行して復号化処理を行う「復号化処理時」と署名生成処理を行う「署名生成処理時」の動作からなる。
【０１６０】
以下において、それぞれの動作について説明する。
（ａ）難読化装置１００による難読化処理時の動作
難読化装置１００による難読化処理時の動作について、図３５に示すフローチャートを用いて説明する。
難読化装置１００の入力部１０１は、秘密鍵ｄを受け付け（ステップＳ１１０１）、乗算配置情報生成部１０２は、乗算配置情報を生成し（ステップＳ１１０２）、分割処理配置情報生成部１０３は、分割処理配置情報を生成し（ステップＳ１１０３）、変換生成部１０４は、入力値変換と出力値変換に対する関数を生成し（ステップＳ１１０４）、テーブル生成部１０５は、テーブルを生成し（ステップＳ１１０５）、読出情報配置部１０６は、読出命令順序情報を生成し（ステップＳ１１０６）、プログラム生成部は、難読化プログラムを生成し（ステップＳ１１０７）、難読化装置１００の媒体記録部１０８は、難読化プログラムを媒体２００に記録する（ステップＳ１１０８）。こうして、難読化処理が終了する。
【０１６１】
（ｂ）暗号処理装置３００による復号化処理の動作
暗号処理装置３００による復号化処理の動作について、図３６に示すフローチャートを用いて説明する。
暗号処理装置３００の入力部３０１は、入力である暗号化データを受け付け、対象データＸとしてデータメモリに格納し（ステップＳ１２０１）、媒体読込部３０６は、媒体２００から難読化プログラムを読み込み、プログラムメモリ３０４に格納し（ステップＳ１２０２）、ＣＰＵ３０５は、プログラムメモリ３０４に格納されている難読化プログラムにしたがって、データメモリ３０３を使用し、対象データＸのべき乗値Ｘ＾ｄ  ｍｏｄ  ｎを計算し、データメモリ３０３に格納し（ステップＳ１２０３）、出力部３０２は、データメモリ３０３に格納されている値（対象データのべき乗値）を復号化データとして出力する（ステップＳ１２０４）。こうして、復号化処理の動作が終了する。
【０１６２】
（ｃ）暗号処理装置３００による署名生成処理の動作
暗号処理装置３００による署名生成処理の動作について、図３７に示すフローチャートを用いて説明する。
暗号処理装置３００の入力部３０１は、入力であるメッセージデータを受け付け、対象データＸとしてデータメモリに格納し（ステップＳ１３０１）、媒体読込部３０６は、媒体２００から難読化プログラムを読み込み、プログラムメモリ３０４に格納し（ステップＳ１３０２）、ＣＰＵ３０５は、プログラムメモリ３０４に格納されている難読化プログラムにしたがって、データメモリ３０３を使用し、対象データＸのべき乗値Ｘ＾ｄ  ｍｏｄ  ｎを計算し、データメモリ３０３に格納し（ステップＳ１３０３）、出力部３０２は、データメモリ３０３に格納されている値（対象データのべき乗値）を署名データとして出力する（ステップＳ１３０４）。こうして、署名生成処理の動作が終了する。
【０１６３】
（ｄ）難読化装置１００によるテーブル化の動作
難読化装置１００によるテーブル化の動作について、図３８に示すフローチャートを用いて説明する。なお、ここでは、図１５に示す乗算処理１００２のテーブル化を一例として説明しているが、他のテーブル化の例についても同様に実現できるので、その説明は省略する。
【０１６４】
難読化装置１００のテーブル生成部１０５は、図１５に示すテーブルの配置のうち、ＲＭ0 １１２１、ＲＭ1 １１２２、ＲＭ2 １１２３、ＲＡ1 １１２４、ＲＡ2 １１２５、ＲＡ3 １１２６、ＲＡ1 １１２７、ＲＡ2 １１２８、ＲＡ2 １１２９、ＲＡ4 １１３０及びＲＡ5 １１３１の接続関係のみを予め記憶している。ここで、この接続関係は、上述したようにして、設計者が作成し、データ化したものである。
【０１６５】
テーブル生成部１０５は、当初は、これらの接続関係のみを記憶しているのであって、ＲＭ0 １１２１、ＲＭ1 １１２２、ＲＭ2 １１２３、ＲＡ1 １１２４、ＲＡ2 １１２５、ＲＡ3 １１２６、ＲＡ1 １１２７、ＲＡ2 １１２８、ＲＡ2 １１２９、ＲＡ4 １１３０及びＲＡ5 １１３１の内容については、記憶されていない。
難読化装置１００によるテーブル化の手順においては、上記の接続関係に従って、ＲＭ0 １１２１、ＲＭ1 １１２２、ＲＭ2 １１２３、ＲＡ1 １１２４、ＲＡ2 １１２５、ＲＡ3 １１２６、ＲＡ1 １１２７、ＲＡ2 １１２８、ＲＡ2 １１２９、ＲＡ4 １１３０及びＲＡ5 １１３１の内容を決定していく。
【０１６６】
また、テーブル生成部１０５は、予め、４０種類の異なる乗算パターンテーブルを記憶している。これらの乗算パターンテーブルは、ここでは、２個の入力値を２個の出力値に変換する２入力２出力のテーブルであり、各入力値は、３ビット長であり、各出力値も、３ビット長である。
テーブル生成部１０５は、図３８に示すステップＳ１４０１〜Ｓ１４０４において、図１５に示すＲＭ0 １１２１、ＲＭ1 １１２２及びＲＭ2 １１２３について、それぞれ、上記の４０種類の乗算パターンテーブルから１個の乗算パターンテーブルをランダムに選択し（ステップＳ１４０２）、これらのＲＭ0 １１２１、ＲＭ1 １１２２及びＲＭ2 １１２３に選択した乗算パターンテーブルを割り当てる（ステップＳ１４０３）。ここで、上記の４０種類の乗算パターンテーブルから１個の乗算パターンテーブルをランダムに選択する際に、異なるＲＭについて同じ乗算パターンテーブルが選択されないようにするため、一度選択した乗算パターンテーブルを次の選択では選択しないように、選択対象から除外する。
【０１６７】
次に、テーブル生成部１０５は、図３８に示すステップＳ１４０５〜Ｓ１４１０において、乗算処理１００２の先頭の入力値から最終の出力値へ至る各経路について、以下を繰り返す。
ここで、乗算処理１００２の先頭の入力値から最終の出力値へ至る経路の一例は、入力値１１４１ａから、ＲＭ0 １１２１の乗算１１２１ａ、変換１１２１ｂを介して、出力値１１４２ａへ至る経路であり、また、別の経路の一例は、入力値１１４１ｂから、ＲＭ0 １１２１の乗算１１２１ａ、変換１１２１ｃ、      
ＲＡ1 １１２４の変換１１２４ａ、加算１１２４ｃ、変換１１２４ｄを介して、出力値１１４２ｂへ至る経路である。
【０１６８】
このように、前記経路とは、３ビットの入力値を開始点として、１個のＲＭ及び少なくとも１個のＲＡを介して、３ビットの出力値へ至る経路である。
各経路上には、変換を配置するべき位置が予め特定されている。テーブル生成部１０５は、各経路上における変換を配置するべき位置を予め記憶している。変換を配置するべき位置とは、図１５において、例えば、ＲＭ0 １１２１において、変換１１２１ｂ及び変換１１２１ｃが配置されている位置であり、また、      
ＲＡ1 １１２４において、変換１１２４ａ、変換１１２４ｂ、変換１１２４ｄ及び変換１１２４ｅが配置されている位置である。
【０１６９】
テーブル生成部１０５は、各経路の先頭から、順に変換が配置される位置を１個ずつ選択していく。
選択した位置の次が、最終出力値であるなら（ステップＳ１４０６でＹＥＳ）、テーブル生成部１０５は、１個の変換を選択し、選択した変換を当該位置に配置し（ステップＳ１４０９）、この経路における処理を終了する。
【０１７０】
選択した位置の次が、最終出力値でないなら（ステップＳ１４０６でＮＯ）、テーブル生成部１０５は、１個の変換を選択し、選択した変換を当該位置に配置する。ここで、同一経路において、前に変換を選択した場合には、前に選択した変換とは別の変換を選択する（ステップＳ１４０７）。次に、次の位置において、ステップＳ１４０７において配置した変換の逆変換を配置し（ステップＳ１４０８）、次に、ステップＳ１４０６へ戻って処理を繰り返す。
【０１７１】
２．５  実施の形態２の効果
実施の形態２では、乗算及び２乗算の処理を分割した処理に対して、同じ個数の引数を入力とするテーブルを生成し、さらに、それらの引数に出力が依存するようにテーブルの出力値を設定することで、乗算と２乗算の処理を入力数の違いによる攻撃者の攻撃を防ぐことが可能となる。これを以下で詳しく説明する。
【０１７２】
乗算は２入力１出力であり、２乗算は１入力１出力の演算であるため、これの違いにより攻撃者に攻撃される可能性がある。これに対し、実施の形態２では、上記でも述べたように通常のＲＳＡ暗号等の処理では、乗算処理の入力に含まれるが、２乗算処理の入力に含まれなかった入力を含む入力値変換及び出力値変換を、乗算処理及び２乗算処理の前後に配置し、これらを含むようなテーブルを生成している。
【０１７３】
これにより、乗算処理に対応するテーブルと、２乗算処理に対応するテーブルとにおいて、入力数の違いがなくなるので、攻撃者が入力を解析し、乗算と２乗算を区別する攻撃を防ぐことが可能となる。
さらに、入力値変換または出力値変換により、２乗算処理に元々含まれない入力の値を各テーブルの出力に反映することができるため、攻撃者が出力を解析し、入力がダミーであると気づくことによる乗算と２乗算を区別する攻撃を防ぐことが可能となる。
【０１７４】
実施の形態２では、上述したように、乗算及び２乗算におけるそれぞれの入力値及び出力値は非常に大きい数（１０２４ビット程度）であるため、乗算及び２乗算の処理を各桁の処理に分割している。
この場合においても、乗算についても２乗算についても、各桁の処理を４入力１出力と２入力１出力のテーブルとに分割することで、上記のような入力値変換及び出力値変換を配置しやすいような構成を取っている。
【０１７５】
このようにすることで、乗算及び２乗算の処理を各桁に分割した処理に対して、乗算及び２乗算のどちらでも同じ個数の引数を入力とし、それぞれの入力が出力に影響するようなテーブルを生成することができるので、テーブルの分割の仕方から乗算であるか２乗算であるかを区別することができない。すなわち、そのテーブルを解析し乗算処理であるか２乗算処理であるかを区別する攻撃を防ぐことが可能となる。したがって、乗算と２乗算の処理を攻撃者により区別しにくくなり、本発明は有効である。
【０１７６】
また、乗算処理や２乗算処理を各桁の処理のテーブルに分割することで、一つの乗算処理または２乗算処理で必要とするテーブルサイズが、２2048×（テーブルの出力バイトサイズ）バイト程度であったものが、各桁の処理を４入力１出力と２入力１出力のテーブルに分割することで、（２５６×２５６）／２×２16×（テーブルの出力バイトサイズ）＝２31×（テーブルの出力バイトサイズ）程度に削減できる。
【０１７７】
さらに、同一の変換を示すテーブルを共通化することで、分割後のテーブルとして、４入力１出力のテーブルが２個、２入力１出力のテーブルが２個となり、その結果、一つの乗算処理または２乗算処理で必要とするテーブルサイズが、２×２16×（テーブルの出力バイトサイズ）＋２×２8 ×（テーブルの出力バイトサイズ）＝１３１，５８４×（テーブルの出力バイトサイズ）程度に削減できる。このように、テーブルの分割・共通化をすることで、テーブルサイズの削減が可能となる。
【０１７８】
以上のように、乗算と２乗算の処理を入力数の違いによる攻撃者の攻撃を防ぐことが可能となり、また、使用するテーブルサイズが削減できるため、本発明により計算機上で実装可能なＲＳＡ暗号のソースコード難読化されたプログラムを生成可能である。
２．６  安全性についての検討
実施の形態２につき、全単射写像の総当り攻撃に対する安全性について検討する。ここで、全単射写像の総当り攻撃とは、すべての取り得る全単射写像のバリエーションから正しい全単射写像を当てる攻撃である。具体的には、全単射写像それぞれに対してテーブルを生成し、実際にプログラムに含まれるテーブルと比較することで、正しい全単射写像であるかを判定する。正しい全単射写像の場合は、テーブルの値がすべて一致する。
【０１７９】
（１）乗算テーブル又は２乗算テーブルが攻撃される場合
乗算テーブル又は２乗算テーブルが攻撃される場合には、各テーブルには、上述のｇ、φの全単射写像が含まれており、両方のテーブルに対して、各テーブルに相応する正しい写像を用いる攻撃が行われないと、テーブルに対する攻撃は成功しない。
実施の形態２において上述したように、各桁を４ビットで分割する場合、ｇ、φそれぞれの全単射写像のバリエーションは１６！＝２44通りあるため、総当りを行うためには、１６！＝２44の計算量が必要である。攻撃者は、ｇ、φの全単射写像の両方を当てる必要があるため、攻撃に要する計算量は、（２44）２＝２88となる。
【０１８０】
（２）加算テーブルが攻撃される場合
加算テーブルが攻撃される場合には、加算テーブルには、少なくとも、２種類φが含まれているので、攻撃に要する計算量は、（２44）2 ＝２88である。
次に、実施の形態２につき、桁毎の分割前のテーブルが乗算テーブルか２乗算テーブルであるかの総当り攻撃に対する安全性について、検討すると、乗算テーブル及び２乗算テーブルは、８０種類存在し、それぞれが乗算テーブルか２乗算テーブルである可能性があるため、総当り攻撃の計算量は、２80となる。
【０１８１】
攻撃に対する安全性を向上させるためには、各桁を４ビットで分割するとともに、２種類の関数に依存して、テーブルを生成することが有効である。
３．その他の変形例
上記に説明した各実施の形態は、本発明の実施の一例であり、本発明はこの実施の形態に何ら限定されるものではなく、その主旨を逸脱しない範囲において種々なる態様で実施し得るものである。例えば、以下のような場合も本発明に含まれる。
【０１８２】
（１）実施の形態２では、テーブル化の対象処理をＲＳＡ暗号における乗算剰余処理及び２乗算剰余処理とし、これらの入力を統一したが、これに限らない。
入力する数が異なる処理をテーブル化するとしてもよい。例えば、楕円曲線暗号の楕円加算（２つの点の座標を入力）と楕円２倍算（１つの点の座標を入力）の処理をテーブル化対象としてもよい。なお、楕円曲線暗号の場合でも、楕円加算と楕円２倍加算が区別されると不正解析の手がかりとなるため、本発明のように区別がつかないようにすることで攻撃を防ぐ手法は有効である。
【０１８３】
なお、本発明が、暗号化に関連する処理のみではなく、入力数が異なる処理を含み、それぞれの処理を区別されると不正解析の手がかりとなってしまうようなプログラムであれば、どのようなプログラムについても適用可能であり、かつ有効であることは言うまでもない。
また、実施の形態２では、入力値が対象データＸのみである２乗算の処理と、入力値が対象データＸおよび中間値Ｙである乗算の処理とについて、入力値の数をそろえる変換を行ったが、これに限られるものではない。本発明の手法を適用すれば、入力値がＸ、Ｙである第１の処理と入力値がＹ、Ｚである第２の処理との組など、一方の入力値の集合が他方の入力値の集合を完全に包含していない場合であっても、難読化を行うことができる。この場合には、第１の処理については入力値Ｚに依存する処理（実施の形態２における入力依存加算や減算に相当）を加えた上でテーブル化し、第２の処理については入力値Ｘに依存する処理を加えた上でテーブル化すればよい。
【０１８４】
（２）実施の形態２では、難読化プログラムを使用して、ＲＳＡ暗号方式の復号化処理やＲＳＡ署名方式の署名生成時処理を実行しているが、秘密鍵をべき値としたべき乗演算処理を含むものであれば何でもよい。例えば、ＲＳＡ−ＰＳＳ署名方式の署名方式であってもよいし、ＲＳＡ−ＯＡＥＰ暗号方式の復号化処理であってもよいし、ＲＳＡ−ＫＥＭ方式の復号化処理であってもよい。また、ＥｌＧａｍａｌ暗号方式の復号化処理であってもよい。
【０１８５】
（３）暗号処理装置において、媒体から読み込んだ難読化プログラムをプログラムメモリに格納するとしているが、これを何回かに分けて、読込みながら、プログラムメモリに格納し、その度にＣＰＵにて実行するとしてもよい。
（４）署名生成時の処理において、入力であるメッセージを対象データとして、対象データのべき乗値を計算しているが、メッセージｍを用いてＸ＝Ｈａｓｈ（ｍ）とし、対象データＸのべき乗値を計算するとしてもよい。
【０１８６】
ここで、Ｈａｓｈはハッシュ関数を示し、Ｈａｓｈ（ｍ）はメッセージｍのハッシュ値を示す。使用するハッシュ関数は、例えば、ＳＨＡ−１、ＳＨＡ−２２４、ＳＨＡ−２５６、ＳＨＡ−３８４、ＳＨＡ−５１２、ＭＤ５、ＷＨＩＲＬＰＯＯＬ、ＲＩＰＥＭＤ１２８、ＲＩＰＥＭＤ１６０である。
（５）実施の形態２において、難読化プログラムは媒体に記録して配布するとしているが、これを通信路を用いて送信するとしてもよい。
【０１８７】
（６）実施の形態２において、入力値変換に入力依存減算、出力値変換に入力依存減算を含ませていたが、これに限られるものではない。例えば、入力依存減算と入力依存加算配置を逆にしてもよい。また、減算や加算に限られるものではなく、乗算と除算の組等としてもよい。すなわち、対象データＸに依存する変換が行われるのであれば、どのような変換の組でも構わない。ただし、上述したやり方でテーブルの分割によりテーブルサイズを抑える場合には、加算と減算の組とすることが望ましい。
【０１８８】
また、各乗算剰余演算及び各２乗算剰余演算の直前及び直後に、当該演算への１個の入力値に依存する減算及び加算を配置するとしてもよい。
また、各乗算剰余演算及び各２乗算剰余演算をそれぞれ分解して、乗算演算及び剰余演算、２乗算演算及び剰余演算が生成された場合に、各乗算演算及び各２乗算演算の直前及び直後に、当該演算への１個の入力値に依存する減算及び加算を配置するとしてもよい。
【０１８９】
（７）実施の形態２においては乗算の処理にも２乗算の処理にも入力依存加算および入力依存減算を追加した上で、テーブル化を行っていたが、これに限られるものではない。すなわち、本発明では、少なくとも２乗算の処理について対象データＸに依存する変換（入力依存加算）が含まれれば、各テーブルの入出力値の関係を解析しても乗算のテーブルと２乗算のテーブルとを区別することが難しくなるので、そのようにしてもよい。
【０１９０】
（８）従来技術において、ＲＳＡ暗号をバイナリ法を用いて復号化する場合、処理をランダムなテーブルに変換する従来方法を応用した方法では、乗算と２乗算とで入力数が異なるため、これを利用して攻撃者が解析可能となるという課題がある。より具体的には、各テーブルへの入力数から、そのテーブルが乗算を行うか２乗算を行うのかを区別することができるという問題点がある。
【０１９１】
本発明では、乗算及び２乗算の処理に対して、同じ個数の引数を入力とするテーブルを生成し、さらに、それらの引数に出力が依存するようにテーブルの出力値を設定する。より具体的には、２乗算の処理に対して、乗算でのみ必要な引数を使った追加処理を付け加えた上でテーブル化することにより、引数の数を乗算と揃える。さらに、この場合、出力が全ての引数に依存するため、実際には処理されないダミーの引数を追加する場合と異なり、追加した引数があるか否かが分からないようになる。
【０１９２】
（９）本発明は、乗算と２乗算の入力数を異なることによる攻撃を防ぐソースコード難読化システム、装置および方法を提供する。
上記に説明したように、本発明は、１つ以上の数からなる第一の処理入力情報から、１以上の数からなる第一の処理出力情報を算出する第一の処理を入力とし、第一のテーブルを出力する難読化装置であって、１以上の数からなる第一の変換入力情報を、１以上の数からなる第一の変換出力情報に変換する第一の変換手段と、１以上の数からなる第一のテーブル入力情報と１以上の数からなる第一のテーブル出力情報の対応を示す前記第一のテーブルを生成する第一のテーブル生成手段とを有し、前記第一のテーブル入力情報は、前記第一の処理入力情報または第一の変換入力情報に含まれる数と、１以上の数からなる追加入力情報に含まれる数からなり、前記第一のテーブル出力情報は、前記第一の処理出力情報または第一の変換出力情報を含む。
【０１９３】
ここで、前記難読化装置は、さらに、１以上の数からなる第二の変換入力情報を、１以上の数からなる第二の変換出力情報に変換する第二の変換手段を有し、前記第一のテーブル入力情報は、前記第一の変換入力情報に含まれる数と、前記追加入力情報に含まれる数からなり、前記第一の処理入力情報は、前記変換出力情報の少なくとも１つの数を含み、前記第二の変換入力情報は、前記第一の処理出力情報の少なくとも１つの数を含み、前記第一のテーブル出力情報は、前記第二の変換出力情報を含むとしてもよい。
【０１９４】
ここで、前記第一の変換手段による変換は、前記第一のテーブル入力情報に基づく変換であるとしてもよい。
ここで、前記難読化装置は、前記第一の処理に加え、１以上の数からなる第二の処理入力情報から、１以上の数からなる第二の処理出力情報を算出する第二の処理を入力とし、前記第二の処理入力情報のうち、前記第一の処理入力情報に含まれない数を前記追加入力情報とする追加入力情報決定手段を有するとしてもよい。
【０１９５】
ここで、前記第二の処理は、第一の数と第二の数からなる前記第二の処理入力情報から、前記第一の数と前記第二の数の積からなる前記第二の処理出力情報を算出する処理であり、前記第一の処理は、前記第一の数からなる前記第一の処理入力情報から、前記第一の数の２乗からなる前記第一の処理出力情報を算出する処理であるとしてもよい。
ここで、前記難読化装置は、前記第一の処理と前記第二の処理に加え、１以上の数、または、少なくとも１つの第二の中間値情報の数を含む第三の処理入力情報から、１以上の数からなる第三の処理出力情報を算出する第三の処理を入力とし、前記第一のテーブルおよび第二のテーブルを出力する難読化装置であって、１以上の数からなる第三の変換入力情報を、１以上の数からなる第三の変換出力情報に変換する第三の変換手段と、１以上の数からなる第二のテーブル入力情報と１以上の数からなる第二のテーブル出力情報の対応を示す前記第二のテーブルを生成する第二のテーブル生成手段と、１以上の数からなる第三の変換入力情報を、１以上の数からなる第三の変換出力情報に変換する第三の変換手段とを有し、前記第二のテーブル入力情報は、少なくとも１つの前記第一のテーブル出力情報を含み、前記第三の変換入力情報は、少なくとも１つの前記第一のテーブル出力情報を含み、前記第二のテーブル出力情報は、前記第三の処理出力情報を含むとしてもよい。
【０１９６】
ここで、前記難読化装置は、前記第一の処理、前記第二の処理、前記第三の処理に加え、１以上の数からなる第四の処理入力情報から、１以上の数からなる第四の処理出力情報を算出する第四の処理を入力とし、前記第二のテーブル入力情報は、少なくとも１つの前記第一のテーブル出力情報に含まれる数と、第二の追加入力情報を含み、前記第四の処理入力情報のうち、前記第三の処理入力情報に含まれない数を前記第二の追加入力情報とする第二の追加入力情報決定手段を有するとしてもよい。
【０１９７】
ここで、前記難読化装置はさらに、前記第一の変換手段および前記第三の変換手段による変換は、前記第一の処理入力情報に含まれる数のうち、前記第三の処理入力情報に含まれる数に基づく変換であるとしてもよい。
ここで、前記難読化装置は、１以上の数からなる第四の変換入力情報を、１以上の数からなる第四の変換出力情報に変換する第四の変換手段を有し、前記第四の変換入力情報は、前記第三の処理出力情報の少なくとも１つの数を含み、前記第二のテーブル出力情報は、前記第三の処理出力情報を含む替わりに、前記第四の処理出力情報を含むとしてもよい。
【０１９８】
ここで、前記難読化装置は、１つ以上の数からなる第五の処理入力情報から、１以上の数からなる第五の処理出力情報を算出する第五の処理を入力とし、前記第五の処理を４つの数からなる処理入力情報から、１つの数からなる処理出力情報を算出する１以上の４入力１出力処理と、２つの数からなる処理入力情報から、１つの数からなる処理出力情報を算出する１以上２入力１出力処理に分割する処理分割手段を有し、前記４入力１出力処理と前記２入力１出力処理の少なくとも１つを前記第一の処理とし、前記４入力１出力処理と前記２入力１出力処理の少なくとも１つを前記第三の処理としてもよい。
【０１９９】
また、本発明は、１つ以上の数からなる第一の処理入力情報から、１以上の数からなる第一の処理出力情報を算出する第一の処理を入力とし、第一のテーブルを出力する難読化方法であって、１以上の数からなる第一の変換入力情報を、１以上の数からなる第一の変換出力情報に変換する第一の変換ステップと、１以上の数からなる第一のテーブル入力情報と１以上の数からなる第一のテーブル出力情報の対応を示す前記第一のテーブルを生成する第一のテーブル生成ステップとを有し、前記第一のテーブル入力情報は、前記第一の処理入力情報または第一の変換入力情報に含まれる数と、１以上の数からなる追加入力情報に含まれる数からなり、前記第一のテーブル出力情報は、前記第一の処理出力情報または第一の変換出力情報を含むとしてもよい。
【０２００】
ここで、前記難読化方法は、さらに、１以上の数からなる第二の変換入力情報を、１以上の数からなる第二の変換出力情報に変換する第二の変換ステップを有し、前記第一のテーブル入力情報は、前記第一の変換入力情報に含まれる数と、前記追加入力情報に含まれる数からなり、前記第一の処理入力情報は、前記変換出力情報の少なくとも１つの数を含み、前記第二の変換入力情報は、前記第一の処理出力情報の少なくとも１つの数を含み、前記第一のテーブル出力情報は、前記第二の変換出力情報を含むとしてもよい。
【０２０１】
ここで、前記第一の変換ステップによる変換は、前記第一のテーブル入力情報に基づく変換であるとしてもよい。
ここで、前記難読化方法は、前記第一の処理に加え、１以上の数からなる第二の処理入力情報から、１以上の数からなる第二の処理出力情報を算出する第二の処理を入力とし、前記第二の処理入力情報のうち、前記第一の処理入力情報に含まれない数を前記追加入力情報とする追加入力情報決定ステップを有するとしてもよい。
【０２０２】
ここで、前記第二の処理は、第一の数と第二の数からなる前記第二の処理入力情報から、前記第一の数と前記第二の数の積からなる前記第二の処理出力情報を算出する処理であり、前記第一の処理は、前記第一の数からなる前記第一の処理入力情報から、前記第一の数の２乗からなる前記第一の処理出力情報を算出する処理であるとしてもよい。
ここで、前記難読化方法は、前記第一の処理と前記第二の処理に加え、１以上の数、または、少なくとも１つの第二の中間値情報の数を含む第三の処理入力情報から、１以上の数からなる第三の処理出力情報を算出する第三の処理を入力とし、前記第一のテーブルおよび第二のテーブルを出力する難読化方法であって、１以上の数からなる第三の変換入力情報を、１以上の数からなる第三の変換出力情報に変換する第三の変換ステップと、１以上の数からなる第二のテーブル入力情報と１以上の数からなる第二のテーブル出力情報の対応を示す前記第二のテーブルを生成する第二のテーブル生成ステップと、１以上の数からなる第三の変換入力情報を、１以上の数からなる第三の変換出力情報に変換する第三の変換ステップとを有し、前記第二のテーブル入力情報は、少なくとも１つの前記第一のテーブル出力情報を含み、前記第三の変換入力情報は、少なくとも１つの前記第一のテーブル出力情報を含み、前記第二のテーブル出力情報は、前記第三の処理出力情報を含むとしてもよい。
【０２０３】
ここで、前記難読化方法は、前記第一の処理、前記第二の処理、前記第三の処理に加え、１以上の数からなる第四の処理入力情報から、１以上の数からなる第四の処理出力情報を算出する第四の処理を入力とし、前記第二のテーブル入力情報は、少なくとも１つの前記第一のテーブル出力情報に含まれる数と、第二の追加入力情報を含み、前記第四の処理入力情報のうち、前記第三の処理入力情報に含まれない数を前記第二の追加入力情報とする第二の追加入力情報決定ステップを有するとしてもよい。
【０２０４】
ここで、前記難読化方法において、前記第一の変換ステップおよび前記第三の変換ステップによる変換は、前記第一の処理入力情報に含まれる数のうち、前記第三の処理入力情報に含まれる数に基づく変換であるとしてもよい。
ここで、前記難読化方法は、１以上の数からなる第四の変換入力情報を、１以上の数からなる第四の変換出力情報に変換する第四の変換ステップを有し、前記第四の変換入力情報は、前記第三の処理出力情報の少なくとも１つの数を含み、前記第二のテーブル出力情報は、前記第三の処理出力情報を含む替わりに、前記第四の処理出力情報を含むとしてもよい。
【０２０５】
ここで、前記難読化方法は、１つ以上の数からなる第五の処理入力情報から、１以上の数からなる第五の処理出力情報を算出する第五の処理を入力とし、前記第五の処理を４つの数からなる処理入力情報から、１つの数からなる処理出力情報を算出する１以上の４入力１出力処理と、２つの数からなる処理入力情報から、１つの数からなる処理出力情報を算出する１以上２入力１出力処理に分割する処理分割ステップを有し、前記４入力１出力処理と前記２入力１出力処理の少なくとも１つを前記第一の処理とし、前記４入力１出力処理と前記２入力１出力処理の少なくとも１つを前記第三の処理としてもよい。
【０２０６】
また、本発明は、前記難読化装置と、プログラムと、前記プログラムを実行する情報処理装置から構成される情報処理システムであって、前記プログラムは、前記第一のテーブルを用いて、前記第一のテーブル入力情報から前記第一のテーブル出力情報を算出する処理を含む。
また、本発明は、前記難読化装置と、プログラムと、前記プログラムを実行する情報処理装置から構成される情報処理システムにおけるプログラムであって、前記第一のテーブルを用いて、前記第一のテーブル入力情報から前記第一のテーブル出力情報を算出する処理を含む。
【０２０７】
ここで、前記第一の処理は、復号処理の一部であるとしてもよい。
ここで、前記第一の処理は、署名生成処理の一部であるとしてもよい。
また、本発明は、前記プログラムを録した記録媒体である。
また、本発明は、前記難読化装置と、プログラムと、前記プログラムを実行する情報処理装置から構成される情報処理システムにおける情報処理装置であって、前記プログラムは、前記第一のテーブルを用いて、前記第一のテーブル入力情報から前記第一のテーブル出力情報を算出する処理を含む。
【０２０８】
また、本発明は、１つ以上の数からなる第一の処理入力情報から、１以上の数からなる第一の処理出力情報を算出する第一の処理を入力とし、第一のテーブルを出力する難読化装置の集積回路であって、１以上の数からなる第一の変換入力情報を、１以上の数からなる第一の変換出力情報に変換する第一の変換手段と、１以上の数からなる第一のテーブル入力情報と１以上の数からなる第一のテーブル出力情報の対応を示す前記第一のテーブルを生成する第一のテーブル生成手段とを有し、前記第一のテーブル入力情報は、前記第一の処理入力情報または第一の変換入力情報に含まれる数と、１以上の数からなる追加入力情報に含まれる数からなり、前記第一のテーブル出力情報は、前記第一の処理出力情報または第一の変換出力情報を含む。
【０２０９】
また、本発明は、前記第一の処理を含む情報処理を行う情報処理装置の集積回路であって、前記第一のテーブルを保持するテーブル保持手段と、前記第一のテーブル入力情報を入力とし、前記第一のテーブル出力情報を出力する出力値算出手段とを有する。
また、前記難読化装置は、前記第一のテーブルの代わりに、プログラムを出力し、前記難読化装置は、さらに、前記第一のテーブルと、１以上のプログラム命令からなるプログラム命令群からなる前記プログラムを生成するプログラム生成手段を有し、前記プログラム命令群は、前記第一のテーブル入力情報を入力とし、対応する前記第一のテーブル出力情報を出力する処理を含むとしてもよい。
【０２１０】
また、本発明は、１つ以上の入力値の集合である第１の入力値群を用いた処理を行う第１の処理と、前記第１の処理よりも多くの入力値が含まれる集合である第２の入力値群を用いた処理を行う第２の処理とを含むプログラムを難読化して難読化プログラムを生成する難読化装置であって、前記プログラムを受け付ける入力手段と、前記第２の入力値群と前記第２の処理結果とを対応付けた第２テーブルと、前記第１の入力値群および追加入力値群と変換後の第１の処理の処理結果とを対応付けた第１テーブルとを生成するテーブル生成手段と、前記プログラムにおける前記第１の処理を、前記第１の入力値群を用いて前記第１テーブルから前記処理結果を取り出す処理に置き換え、かつ、前記第２の処理を、前記第２の入力値群を用いて前記第２テーブルから前記処理結果を取り出す処理に置き換えて前記難読化プログラムを生成するプログラム生成手段とを備え、前記追加入力値群は、前記第２の入力値群のうち前記第１の入力値群に含まれない入力値の集合であり、前記変換後の第１の処理は、前記第１の処理に前記追加入力値群を用いる処理を追加した処理である。
【０２１１】
これらの構成によると、乗算と２乗算の入力数が異なることによる攻撃を防ぐことができ、その価値は大きい。
（１０）上記の各装置は、具体的には、マイクロプロセッサ、ＲＯＭ、ＲＡＭ、ハードディスクユニット、ディスプレイユニット、キーボード、マウスなどから構成されるコンピュータシステムである。前記ＲＡＭまたはハードディスクユニットには、コンピュータプログラムが記憶されている。前記マイクロプロセッサが、前記コンピュータプログラムにしたがって動作することにより、各装置は、その機能を達成する。ここでコンピュータプログラムは、所定の機能を達成するために、コンピュータに対する指令を示す命令コードが複数個組み合わされて構成されたものである。
【０２１２】
（１１）上記の各装置を構成する構成要素の一部または全部は、１個のシステムＬＳＩ（Ｌａｒｇｅ  Ｓｃａｌｅ  Ｉｎｔｅｇｒａｔｉｏｎ：大規模集積回路）から構成されているとしてもよい。システムＬＳＩは、複数の構成部を１個のチップ上に集積して製造された超多機能ＬＳＩであり、具体的には、マイクロプロセッサ、ＲＯＭ、ＲＡＭなどを含んで構成されるコンピュータシステムである。前記ＲＡＭには、コンピュータプログラムが記憶されている。前記マイクロプロセッサが、前記コンピュータプログラムにしたがって動作することにより、システムＬＳＩは、その機能を達成する。
【０２１３】
また、上記の各装置を構成する構成要素の各部は、個別に１チップ化されていても良いし、一部又は全てを含むように１チップ化されてもよい。
また、ここでは、システムＬＳＩとしたが、集積度の違いにより、ＩＣ、ＬＳＩ、スーパーＬＳＩ、ウルトラＬＳＩと呼称されることもある。また、集積回路化の手法はＬＳＩに限るものではなく、専用回路又は汎用プロセッサで実現してもよい。ＬＳＩ製造後に、プログラムすることが可能なＦＰＧＡ（Ｆｉｅｌｄ  Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙ）や、ＬＳＩ内部の回路セルの接続や設定を再構成可能なリコンフィギュラブル・プロセッサーを利用しても良い。
【０２１４】
さらには、半導体技術の進歩又は派生する別技術によりＬＳＩに置き換わる集積回路化の技術が登場すれば、当然、その技術を用いて機能ブロックの集積化を行ってもよい。バイオ技術の適応等が可能性としてありえる。
（１２）上記の各装置を構成する構成要素の一部または全部は、各装置に脱着可能なＩＣカードまたは単体のモジュールから構成されているとしてもよい。前記ＩＣカードまたは前記モジュールは、マイクロプロセッサ、ＲＯＭ、ＲＡＭなどから構成されるコンピュータシステムである。前記ＩＣカードまたは前記モジュールは、上記の超多機能ＬＳＩを含むとしてもよい。マイクロプロセッサが、コンピュータプログラムにしたがって動作することにより、前記ＩＣカードまたは前記モジュールは、その機能を達成する。このＩＣカードまたはこのモジュールは、耐タンパ性を有するとしてもよい。
【０２１５】
（１３）本発明は、上記に示す方法であるとしてもよい。また、これらの方法をコンピュータにより実現するコンピュータプログラムであるとしてもよいし、前記コンピュータプログラムからなるデジタル信号であるとしてもよい。
（１４）また、本発明は、前記コンピュータプログラムまたは前記デジタル信号をコンピュータ読み取り可能な記録媒体、例えば、フレキシブルディスク、ハードディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ、ＤＶＤ−ＲＯＭ、ＤＶＤ−ＲＡＭ、ＢＤ（Ｂｌｕ−ｒａｙ  Ｄｉｓｃ）、半導体メモリなどに記録したものとしてもよい。また、これらの記録媒体に記録されている前記デジタル信号であるとしてもよい。
【０２１６】
（１５）また、本発明は、前記コンピュータプログラムまたは前記デジタル信号を、電気通信回線、無線または有線通信回線、インターネットを代表とするネットワーク、データ放送等を経由して伝送するものとしてもよい。
（１６）また、本発明は、マイクロプロセッサとメモリを備えたコンピュータシステムであって、前記メモリは、上記コンピュータプログラムを記憶しており、前記マイクロプロセッサは、前記コンピュータプログラムにしたがって動作するとしてもよい。
【０２１７】
（１７）また、前記プログラムまたは前記デジタル信号を前記記録媒体に記録して移送することにより、または前記プログラムまたは前記デジタル信号を前記ネットワーク等を経由して移送することにより、独立した他のコンピュータシステムにより実施するとしてもよい。
（１８）本発明は、上記の実施の形態及び変形例の組合せであってもよい。
【産業上の利用可能性】
【０２１８】
これらの構成によると、乗算と２乗算の入力数が異なることによる攻撃を防ぐことができる。
本発明を構成する各装置は、情報を暗号化して復号化することにより第三者に知られないように情報を秘密に扱い、情報にデジタル署名を施し、署名検証を施すことにより情報の改ざんや他人によるなりすましなどを防止するなど、情報を安全にまた確実に扱う必要があるあらゆる産業において、経営的に、継続的及び反復的に使用することができる。また、本発明を構成する各装置は、電器機器製造産業において、経営的に、また継続的及び反復的に、製造し、販売することができる。
【図面の簡単な説明】
【０２１９】
【図１】実施の形態１における通常プログラム５００１から難読化プログラム５００２への変換を示す図である。
【図２】実施の形態１における乗算の難読化及び２乗算の難読化を示す図である。
【図３】実施の形態２における難読化システム１の構成を示すブロック図である。
【図４】難読化システム１による第１の難読化の方法の考え方を示す図である。
【図５】変換乗算剰余処理の構成を示す図である。図５（ａ）は、ｉ＝１の場合を示し、図５（ｂ）は、２≦ｉ≦ｋ−１の場合を示し、図５（ｃ）は、ｉ＝ｋの場合を示している。
【図６】図６（ａ）は、２≦ｉ≦ｋ−１の場合の入力値変換及び出力値変換が挿入された変換乗算剰余処理の構成を示し、図６（ｂ）は、２≦ｉ≦ｋ−１の場合の分割後の乗算剰余処理の構成を示す。
【図７】図７（ａ）は、ｉ＝ｋの場合の入力値変換が挿入された変換乗算剰余処理の構成を示し、図７（ｂ）は、ｉ＝ｋの場合の分割後の乗算剰余処理の構成を示す。
【図８】２≦ｉ≦ｋ−１の場合の桁毎に分割された変換乗算処理の構成を示す。図８（ａ）は、分割前の変換乗算処理を示し、図８（ｂ）は、分割後の変換乗算処理を示す。
【図９】ｉ＝ｋの場合の桁毎に分割された変換乗算処理の構成を示す。
【図１０】桁毎に分割される場合における各加算処理の構成を示す。
【図１１】分割された変換剰余処理の構成を示す。
【図１２】各桁に対してさらに分割された場合の乗算処理の構成を示す。
【図１３】共通化されるテーブルのパターンを示す。
【図１４】ＲＴ1 について分割された乗算処理１００２の構成を示す図である。
【図１５】ＲＴ1 について分割された乗算処理１００２の構成を示す図である。図面上において、入力値変換及び出力値変換を明らかにしている。
【図１６】ＲＴi （２≦ｉ≦ｋ−１）について分割された乗算処理１００４の構成を示す図である。
【図１７】ＲＴi （２≦ｉ≦ｋ−１）について分割された乗算処理１００４の構成を示す図である。図面上において、入力値変換及び出力値変換を明らかにしている。
【図１８】ＲＴk について分割された乗算処理１００９の構成を示す図である。
【図１９】ＲＴk について分割された乗算処理１００９の構成を示す図である。図面上において、入力値変換及び出力値変換を明らかにしている。
【図２０】分割された剰余処理１００５の構成を示す。図２１へ続く。
【図２１】分割された剰余処理１００５の構成を示す。図２２へ続く。
【図２２】分割された剰余処理１００５の構成を示す。図２３へ続く。
【図２３】分割された剰余処理１００５の構成を示す。図２２から続く。
【図２４】ＲＴi （２≦ｉ≦ｋ−１）について図１７に示すＲＭ1 の詳細を示す。
【図２５】ＲＴi （２≦ｉ≦ｋ−１）について図１７に示すＲＭ1 のテーブルの具体例を示す。
【図２６】図２６（ａ）、図２６（ｂ）、図２６（ｃ）及び図２６（ｄ）は、それぞれ、ＲＴi （２≦ｉ≦ｋ−１） について図１７に示すＲＭ1 における変換β、変換φ-1、変換ｇ及び変換γ3 の具体例としてのテーブルを示す。
【図２７】ＲＴk について図１９に示すＲＭ1 の詳細を示す。
【図２８】ＲＴk について図１９に示すＲＭ1 のテーブルの具体例を示す。
【図２９】図２９（ａ）、図２９（ｂ）、図２９（ｃ）及び図２９（ｄ）は、それぞれ、ＲＴk について図１９に示すＲＭ1 における変換β、変換φ-1、変換ｇ及び変換γ3 の具体例としてのテーブルを示す。
【図３０】ＲＴ1 について図１５に示すＲＡ1 の詳細を示す。
【図３１】ＲＴ1 について図１５に示すＲＡ1 のテーブルの具体例を示す。
【図３２】図３２（ａ）、図３２（ｂ）及び図３２（ｃ）は、それぞれ、ＲＴ1 について図１５に示すＲＡ1 における変換β、変換γ1 及び変換β-1の具体例としてのテーブルを示す。
【図３３】難読化装置１００の構成を示す図である。
【図３４】暗号処理装置３００の構成を示す図である。
【図３５】難読化装置１００による難読化処理時の動作を示すフローチャートである。
【図３６】暗号処理装置３００による復号化処理の動作を示すフローチャートである。
【図３７】暗号処理装置３００による署名生成処理の動作を示すフローチャートである。
【図３８】難読化装置１００によるテーブル化の動作を示すフローチャートである。
【図３９】従来の難読化方法の処理の手順を示す図である。
【図４０】従来の難読化方法のテーブル化の一例を示す図である。
【図４１】ＲＴ1 について図１５に示すＲＭ1 の詳細を示す。
【図４２】図４２（ａ）、図４２（ｂ）及び図４２（ｃ）は、それぞれ、ＲＴ1 について図１５に示すＲＭ1 における変換β、変換ｇ及び変換γ3 の具体例としてのテーブルを示す。
【図４３】ＲＴ1 について図１５に示すＲＭ1 のテーブルの具体例を示す。
【符号の説明】
【０２２０】
１  難読化システム
１００  難読化装置
１０１  入力部
１０２  乗算配置情報生成部
１０３  分割処理配置情報生成部
１０４  変換生成部
１０５  テーブル生成部
１０６  読出情報配置部
１０７  プログラム生成部
１０８  媒体記録部
２００  媒体
３００  暗号処理装置
３０１  入力部
３０２  出力部
３０３  データメモリ
３０４  プログラムメモリ
３０５  ＣＰＵ
３０６  媒体読込部
【手続補正３】
【補正対象書類名】図面
【補正対象項目名】全図
【補正方法】変更
【補正の内容】
【図１】
2007126049.tif 000046
【図２】
2007126049.tif 000047
【図３】
2007126049.tif 000048
【図４】
2007126049.tif 000049
【図５】
2007126049.tif 000050
【図６】
2007126049.tif 000051
【図７】
2007126049.tif 000052
【図８】
2007126049.tif 000053
【図９】
2007126049.tif 000054
【図１０】
2007126049.tif 000055
【図１１】
2007126049.tif 000056
【図１２】
2007126049.tif 000057
【図１３】
2007126049.tif 000058
【図１４】
2007126049.tif 000059
【図１５】
2007126049.tif 000060
【図１６】
2007126049.tif 000061
【図１７】
2007126049.tif 000062
【図１８】
2007126049.tif 000063
【図１９】
2007126049.tif 000064
【図２０】
2007126049.tif 000065
【図２１】
2007126049.tif 000066
【図２２】
2007126049.tif 000067
【図２３】
2007126049.tif 000068
【図２４】
2007126049.tif 000069
【図２５】
2007126049.tif 000070
【図２６】
2007126049.tif 000071
【図２７】
2007126049.tif 000072
【図２８】
2007126049.tif 000073
【図２９】
2007126049.tif 000074
【図３０】
2007126049.tif 000075
【図３１】
2007126049.tif 000076
【図３２】
2007126049.tif 000077
【図３３】
2007126049.tif 000078
【図３４】
2007126049.tif 000079
【図３５】
2007126049.tif 000080
【図３６】
2007126049.tif 000081
【図３７】
2007126049.tif 000082
【図３８】
2007126049.tif 000083
【図３９】
2007126049.tif 000084
【図４０】
2007126049.tif 000085
【図４１】
2007126049.tif 000086
【図４２】
2007126049.tif 000087
【図４３】
2007126049.tif 000088
【国際調査報告】
2007126049.tif 000089
2007126049.tif 000090
2007126049.tif 000091
2007126049.tif 000092