(57)【特許請求の範囲】
【請求項１】
暗号化の対象となる数値Ａの入力を受け付ける受付手段と、
任意の値よりなるランダムキーを決定するランダムキー決定手段と、
入力された第１および第２の数値に所定の関数処理を施して数値を出力する関数処理手段と、
所定回数だけ前記関数処理手段に数値を入力する関数入力手段であって、初回の入力の際には、前記第１の数値として前記数値Ａと、前記第２の数値として前記ランダムキーを構成する少なくとも一部の数字とを入力し、以降の回の入力の際には、前記第１の数値として前記関数処理手段にて前回出力された数値と、前記第２の数値として前記ランダムキーを構成する少なくとも一部の数字とを入力する関数入力手段と、
前記関数処理手段にて数値を出力した出力回数をカウントするカウント手段と、
前記関数入力手段にて入力した第１の数値に付いている符号が所定の符号である場合に、前記カウント手段にてカウントした出力回数を記憶させる記憶手段と、
前記関数処理手段にて最終回に出力された数値に基づいて第１の暗号を作成する第１の暗号作成手段と、
前記記憶手段にて記憶させた出力回数に基づいて第２の暗号を作成する第２の暗号作成手段と、
前記ランダムキーに基づいて第３の暗号を作成する第３の暗号作成手段とを備えた、暗号化装置。
【請求項２】
前記受付手段は外キーの入力をさらに受け付け、
前記外キーと、暗号化装置内に記憶された内内キーとに基づいて内キーを作成する内キー作成手段をさらに備え、
前記第３の暗号作成手段は、前記外キーと前記内キーとにさらに基づいて第３の暗号を作成する、請求項１に記載の暗号化装置。
【請求項３】
前記関数処理手段は、前記第１の数値である数値Ｄと、前記第２の数値である数値Ｘとが入力された場合に、関数Ｆ（ｘ）に前記数値Ｄを入力して得られた数値に対して、関数Ｇ（ｘ）に前記数値Ｘを入力して得られた数値を作用させることで得られた数値を出力する、請求項１または２に記載の暗号化装置。
【請求項４】
前記関数入力手段にて一の回に入力する前記第２の数値と、前記関数入力手段にて他の回に入力する前記第２の数値とは互いに異なる、請求項１〜３のいずれかに記載の暗号化装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、暗号化装置に関し、より特定的には、安全性の高い暗号化装置に関する。
【背景技術】
【０００２】
銀行の口座番号や、クレジットカードのカード番号、または各種暗証番号などの数値データは、特別の処理が施されていない限り、それらの数値データを入手した者は誰でも使用することができる。そのため、これらの数値データを取り扱う際には、不正使用を防ぐため、暗号化処理を行う必要がある。特に近年、インターネット上で機密性の高いこれらの数値データをやり取りする機会が増加しており、暗号化技術および暗号解読技術（復号化技術）の重要性は増加している。
【０００３】
従来の暗号化技術および暗号解読技術では、ある数値Ａ１を暗号化する場合、暗号化プログラムに従って数値Ａ１を演算することにより、１つの暗号化した数値Ａ２が出力されていた。また数値Ａ２を解読する場合、暗号解読プログラムに従って数値Ａ２を演算することにより、数値Ａ１が出力されていた。
【０００４】
なお、出願人の記憶する範囲において、出願前までに先行技術文献情報として開示すべき情報を出願人は有していない。
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、上記従来の暗号化技術および暗号解読技術では、１つの数値Ａ１には１つの決まった数値Ａ２が対応するため、数値Ａ１と数値Ａ２との関係から暗号化方法および暗号解読方法が解明されやすく、安全性が低かった。また、暗号化方法および暗号解読方法が解明されると、その暗号化方法および暗号解読方法を使用することはもはやできなかった。
【０００６】
本発明は、上記課題を解決するものであり、その目的は、安全性の高い暗号化装置を提供することである。
【課題を解決するための手段】
【０００７】
本発明の一の局面に従う暗号化装置は、暗号化の対象となる数値Ａの入力を受け付ける受付手段と、任意の値よりなるランダムキーを決定するランダムキー決定手段と、入力された第１および第２の数値に所定の関数処理を施して数値を出力する関数処理手段と、所定回数だけ関数処理手段に数値を入力する関数入力手段であって、初回の入力の際には、第１の数値として数値Ａと、第２の数値としてランダムキーを構成する少なくとも一部の数字とを入力し、以降の回の入力の際には、第１の数値として関数処理手段にて前回出力された数値と、第２の数値としてランダムキーを構成する少なくとも一部の数字とを入力する関数入力手段と、関数処理手段にて数値を出力した出力回数をカウントするカウント手段と、関数入力手段にて入力した第１の数値に付いている符号が所定の符号である場合に、カウント手段にてカウントした出力回数を記憶させる記憶手段と、関数処理手段にて最終回に出力された数値に基づいて第１の暗号を作成する第１の暗号作成手段と、記憶手段にて記憶させた出力回数に基づいて第２の暗号を作成する第２の暗号作成手段と、ランダムキーに基づいて第３の暗号を作成する第３の暗号作成手段とを備える。
【０００８】
上記暗号化装置において好ましくは、受付手段は外キーの入力をさらに受け付け、外キーと、暗号化装置内に記憶された内内キーとに基づいて内キーを作成する内キー作成手段をさらに備え、第３の暗号作成手段は、外キーと内キーとにさらに基づいて第３の暗号を作成する。
【０００９】
上記暗号化装置において好ましくは、関数処理手段は、第１の数値である数値Ｄと、第２の数値である数値Ｘとが入力された場合に、関数Ｆ（ｘ）に数値Ｄを入力して得られた数値に対して、関数Ｇ（ｘ）に数値Ｘを入力して得られた数値を作用させることで得られた数値を出力する。
【００１０】
上記暗号化装置において好ましくは、関数入力手段にて一の回に入力する第２の数値と、関数入力手段にて他の回に入力する第２の数値とは互いに異なる。
【発明の効果】
【００１４】
本発明によれば、安全性の高い暗号化装置を提供することができる。
【図面の簡単な説明】
【００１５】
【図１】本発明の一実施の形態における暗号化および暗号解読装置の構成を模式的に示すブロック図である。
【図２】本発明の一実施の形態における暗号化処理を概略的に示す図である。
【図３】暗号化処理の際のプロトコルキー、暗号＃１、および暗号＃２の作成方法を概略的に示す図である。
【図４】本発明の一実施の形態における暗号解読処理を概略的に示す図である。
【図５】暗号解読処理の際の数値Ａの解読方法を概略的に示す図である。
【図６】計算機のＣＰＵが実行する暗号化処理のフローチャートである。
【図７】図６の各ステップにおいて得られる数値を模式的に示す図である。
【図８】図６のステップＳ９の詳細を示すサブルーチンである。
【図９】暗号ループ１号および解読ループ１号として用いられる表の一例を示す図である。
【図１０】図６のステップＳ１１の詳細を示すサブルーチンである。
【図１１】図１０における数値Ｄの変化の一例を示す図である。
【図１２】計算機のＣＰＵが実行する暗号解読処理のフローチャートである。
【図１３】図１２のステップＳ２１５の詳細を示すサブルーチンである。
【発明を実施するための形態】
【００１６】
以下、本発明の実施の形態について、図面を用いて説明する。
【００１７】
［暗号化および暗号解読装置の構成］
図１は、本発明の一実施の形態における暗号化および暗号解読装置の構成を模式的に示すブロック図である。なお、本実施の形態においては、暗号化および暗号解読装置が計算機である場合に付いて示すが、暗号化および暗号解読装置は関数電卓やＰＣ（Ｐｅｒｓｏｎａｌ  Ｃｏｍｐｕｔｅｒ）などであってもよい。
【００１８】
図１を参照して、本実施の形態における暗号化および暗号解読装置としての計算機１０は、ＣＰＵ１と、ＲＡＭ２と、ＲＯＭ３と、ＨＤＤ４と、モニタなどの表示部５と、キーボードやマウスなどの操作部６とを含む。
【００１９】
ＣＰＵ１は、所定の処理を行なうことにより、ＲＡＭ２、ＲＯＭ３のデータの読み込みや、ＲＡＭ２、ＲＯＭ３へのデータの書き込みを行なう。
【００２０】
ＲＡＭ２は、ＣＰＵ１のメインメモリである。ＲＡＭ２は、ＣＰＵ１が制御プログラムを実行するときに必要なデータを記憶するためなどに用いられる。
【００２１】
ＲＯＭ３は、たとえばフラッシュＲＯＭである。ＲＯＭ３には、暗号化プログラムや暗号解読プログラムなどの計算機１０の動作を行なうための各種プログラムと、各種固定データとが格納されている。ＲＯＭ３は、書換え不可能なものであってもよい。
【００２２】
ＨＤＤ４は、各種データを記憶する記憶装置である。
【００２３】
表示部５は、ユーザが視認可能な表示画面を表示する。
【００２４】
操作部６はユーザからの各種入力を受け付ける。特に操作部６は、暗号化処理および暗号解読処理の実行や、暗号化処理および暗号解読処理に用いられる数値の入力などをユーザから受け付ける。
【００２５】
［暗号化処理および暗号解読処理の概要］
図２は、本発明の一実施の形態における暗号化処理を概略的に示す図である。
【００２６】
図２を参照して、本実施の形態における暗号化処理においては、計算機１０は、ユーザから暗号化の対象となる数値（以降、「数値Ａ」と記す）と、外キーとの入力を受け付ける。そしてＣＰＵ１は、入力された数値Ａおよび外キーに基づいて演算を行い、プロトコルキーと、暗号＃１と、暗号＃２とを出力する。この暗号化処理には、外キーおよび数値Ａの他、ランダムキーと内内キーとが用いられる。
【００２７】
外キーは、暗号化処理および暗号解読処理の際にユーザによって入力されるキーである。
【００２８】
ランダムキーは、暗号化処理を実行する度に計算機１０によって決定される、任意の数字よりなるキーである。
【００２９】
内内キーは、暗号化プログラムおよび暗号解読プログラム内（ＲＯＭ３内）に定数として設定されているキーである。なお、内内キーの代わりに内内キーの土台が暗号化プログラム内に設定されており、暗号化処理および暗号解読処理の際に外キーと内内キーの土台とに基づいて内内キーが演算されてもよい。
【００３０】
図３は、暗号化処理の際のプロトコルキー、暗号＃１、および暗号＃２の作成方法を概略的に示す図である。（ａ）はプロトコルキーの作成方法を示す図であり、（ｂ）は暗号＃１および暗号＃２の作成方法を示す図である。
【００３１】
図３（ａ）を参照して、計算機１０のＣＰＵ１は、外キーと内内キーとに基づいて内キーを作成し、続いてＣＰＵ１は、作成した内キーと、外キーと、ランダムキーとに基づいてプロトコルキーを作成する。プロトコルキーは暗号解読処理の際に用いられる情報（ランダムキーなどの情報）を示すキーである。
【００３２】
図３（ｂ）を参照して、ＣＰＵ１は、数値Ａとランダムキーとに基づいて前暗号＃１（以降、暗号＃１の土台と称することがある）および前暗号＃２（以降、暗号＃２の土台と称することがある）を演算し、続いてＣＰＵ１は、作成した前暗号＃１および＃２と、内キーとに基づいて暗号＃１および＃２を演算する。暗号＃１および＃２とは数値Ａを暗号化したキーである。
【００３３】
図４は、本発明の一実施の形態における暗号解読処理を概略的に示す図である。
【００３４】
図４を参照して、本実施の形態における暗号解読処理において、計算機１０は、プロトコルキーと、暗号＃１および＃２と、外キーとの入力を受け付ける。そしてＣＰＵ１は、入力されたプロトコルキー、暗号＃１および＃２、および外キーに基づいて演算を行い、数値Ａを出力する。この暗号化処理には内内キーがさらに用いられる。
【００３５】
図５は、暗号解読処理の際の数値Ａの解読方法を概略的に示す図である。（ａ）はランダムキーの解読方法を示す図であり、（ｂ）は解読したランダムキーを用いた数値Ａの解読方法を示す図である。
【００３６】
図５（ａ）を参照して、計算機１０のＣＰＵ１は、外キーと内内キーとに基づいて内キーを解読し、続いてＣＰＵ１は、作成した内キーと、外キーと、プロトコルキーとに基づいてランダムキーを解読する。図５（ｂ）を参照して、続いてＣＰＵ１は、暗号＃１および＃２と、内キーとに基づいて前暗号＃１および＃２を解読し、解読した前暗号＃１および＃２と、解読したランダムキーとに基づいて数値Ａを解読する。
【００３７】
［暗号化処理］
図６は、計算機のＣＰＵが実行する暗号化処理のフローチャートである。本実施の形態においては、数値Ａ、外キー、内内キー、および内キー（以下、処理に用いられる数値と記す場合がある）の各々は、特に断りがない限り、小数第１位から小数第１０位まで１０桁の数値として取り扱われる。具体的には、たとえば処理に用いられる数値が１０桁の９の数字のみからなる場合には、「０．９９９９９９９９９９」という数値として取り扱われる。なお、処理に用いられる数値の桁数および小数点の位置は任意であり、処理に用いられる数値は整数として（つまり「９９９９９９９９９９」という数値として）取り扱われてもよい。各処理で実行される演算においては、端数に対して四捨五入、切捨て、または切上げなどの処理が適宜なされてもよい。
【００３８】
図６を参照して、始めに計算機１０のＣＰＵ１は、１０桁の外キーと、暗号化の対象となる１０桁の数値Ａとの入力を促すメッセージを表示部５の画面に表示させ、操作部６を通じて外キーおよび数値Ａの入力をユーザから受け付ける（Ｓ１）。次にＣＰＵ１は、しるしをつける個数Ｚを決定する（Ｓ３）。個数Ｚは、後述する暗号ループ２号（図１０）において用いられる数値である。個数Ｚとしてはたとえば２〜１５の中から任意の値が決定される。決定された個数Ｚの値はたとえばＲＡＭ２などに記憶される。
【００３９】
次にＣＰＵ１は、１０桁のランダムキーの土台を決定する（Ｓ５）。ランダムキーの土台の値としては、たとえば０．００００００００００〜０．９９９９９９９９９９の中から任意の値が決定され、暗号化処理の実行の度に異なる値が決定される。続いてＣＰＵ１は、外キーと、暗号化プログラム内に予め登録（設定）されている１０桁の内内キーの土台とに基づいて、１０桁の内内キーを作成する（Ｓ７）。なお、内内キーの土台の代わりに内内キーが暗号化プログラム内に設定されている場合には、ステップＳ７の処理は省略される。
【００４０】
次にＣＰＵ１は、後述する暗号ループ１号（図９）を用いて、外キーと内内キーとに基づいて１０桁の内キーを作成する（Ｓ９）。続いてＣＰＵ１は、後述する暗号ループ２号（図１０）を用いて、数値Ａとランダムキーの土台とに基づいて、暗号＃１および＃２の土台と、正式なランダムキーとを作成する（Ｓ１１）。
【００４１】
その後ＣＰＵ１は、正式なランダムキーと、外キーと、内キーとに基づいてプロトコルキーを作成し（Ｓ１３）、暗号＃１の土台に基づいて暗号＃１を作成し（Ｓ１５）、暗号＃２の土台と内キーとに基づいて暗号＃２を作成し（Ｓ１７）、処理を終了する。
【００４２】
なお、ステップＳ７、Ｓ９、Ｓ１１、Ｓ１３、Ｓ１５、およびＳ１７の処理としては、四則演算、平方根、対数、累乗など各種の演算を単独でまたは組み合わせたものを採用することができる。
【００４３】
図７は、図６の各ステップにおいて得られる数値を模式的に示す図である。なお、図７に示された数値には、その一部がアスタリスクを用いて省略されているものがある。
【００４４】
図７を参照して、内内キーおよび内キーは、外キーおよび数値Ａに基づいて生成されるものであるため、ランダムキーに依存せず、外キーおよび数値Ａの組合せが同じであれば常に同じ数値となる。一方、暗号として出力されるプロトコルキー、暗号＃１および暗号＃２の各々は、外キーおよび数値Ａに加えてランダムキーの土台（またはランダムキー）を用いて生成されるため、暗号化処理を実行する度に異なる数値となる。
【００４５】
図８は、図６のステップＳ９の詳細を示すサブルーチンである。
【００４６】
図８を参照して、図６のステップＳ９においてＣＰＵ１は、１０桁の外キーを１０個の数字に分け（Ｓ３１）、１０桁の内内キーを１０個の数字に分ける（Ｓ３３）。次にＣＰＵ１は、外キーの１０個の数字の各々と、内内キーの１０個の数字の各々とに基づいて、演算の基となる１０個の数値を作成する（Ｓ３５）。続いてＣＰＵ１は、ステップＳ３５にて得られた１０個の数値を、暗号ループ１号を用いて相互に演算することにより、１０桁の数字よりなる内キーの土台を作成する（Ｓ３７）。そしてＣＰＵ１は、ステップＳ３７にて得られた内キーの土台に基づいて、１０桁の内キーを作成し（Ｓ３９）、リターンする。
【００４７】
図９は、暗号ループ１号および解読ループ１号として用いられる表の一例を示す図である。暗号ループ１号および解読ループ１号では同じ処理が行われる。なお図９の表においては、Ｍ５１〜Ｍ５５の欄にのみ数値が示されているが、実際にはＭ０１〜Ｍ５５の全ての欄に数値が記入される。
【００４８】
図９を参照して、たとえば外キーが「０．９９８８７７６６５５」であり、かつ内内キーが「０．６５＊＊＊＊＊＊５４」（一部省略）である場合、ＣＰＵ１は、外キーにおける最上桁の数字「９」と、内キーにおける最上桁の数字「６」とを所定の演算方法にて演算することによって、演算の基となる１０個の数値のうち１つ目の数字を作成し、その数字を表中Ｍ０１の欄に記入する。次にＣＰＵ１は、外キーにおける上から２番目の桁の数字「９」と、内キーにおける上から２番目の桁の数字「５」とを所定の演算方法にて演算することによって、演算の基となる１０個の数値のうち２つ目の数値を作成し、その数値を表中Ｍ０２の欄に記入する。同様の方法でＣＰＵ１は、外キーの各桁の数字と内キーの各桁の数字とを用いて残り８個の数値を作成し、それぞれの数値を表中Ｍ０３〜Ｍ１０の各々の欄に記入する。
【００４９】
次に暗号ループ１号を用いた演算が開始される。ＣＰＵ１は、Ｍ１１の欄の表中左上にあるＭ０１の欄の数値と、Ｍ１１の欄の表中左下にあるＭ０２の欄の数値とを所定の演算方法（たとえば２つの数値の差を求める方法）にて演算し、演算結果の数値をＭ１１の欄に記入する。同様の方法でＣＰＵ１は、Ｍ１２〜Ｍ１９の各欄に関して、各欄から見て表中左上の数値と表中左下の数値とを演算し、演算結果の数値をＭ１２〜Ｍ１９の各欄に記入する。これにより、暗号ループ１号を用いた１回の演算が終了する。
【００５０】
続いてＣＰＵ１は、Ｍ１１〜Ｍ１９の欄の演算方法と同様の方法で、Ｍ１１〜Ｍ１９の各欄の数値を用いてＭ２０〜Ｍ２７の各欄に数値を記入し、Ｍ２０〜Ｍ２７の各欄の数値を用いてＭ２８〜Ｍ３４の各欄に数値を記入し、Ｍ２８〜Ｍ３４の各欄の数値を用いてＭ３５〜Ｍ４０の各欄に数値を記入し、Ｍ３５〜Ｍ４０の各欄の数値を用いてＭ４１〜Ｍ４５の各欄を記入する。続いてＣＰＵ１は、Ｍ４１〜Ｍ４５の各欄の数値を用いてＭ４６〜Ｍ４９の各欄を記入し、Ｍ４６〜Ｍ４９の各欄の数値を用いてＭ５０〜Ｍ５２の各欄を記入し、Ｍ５０〜Ｍ５２の各欄の数値を用いてＭ５３およびＭ５４の各欄を記入し、Ｍ５３およびＭ５４の各欄の数値を用いてＭ５５の欄を記入する。このようにして暗号ループ１号を用いた演算を、記入する欄が１つになるまで繰り返す結果、図９に示すＭ０１〜Ｍ５５の各欄に数値が記入される。
【００５１】
次にＣＰＵ１は、図９の表において、最後に得られた５つの数値であるＭ５１〜Ｍ５５の各々の欄の数値から下２桁の数字を抜き出し、抜き出した計１０個の数字を組み合わせたものを内キーの土台とする。たとえばＭ５１〜Ｍ５５の各々の欄の数値が、「Ｍ５５：−８８０２」、「Ｍ５４：４８５３」、「Ｍ５３：−３９４９」、「Ｍ５２：−２４２７」、および「Ｍ５１：２４２６」であった場合、それぞれ「０２」、「５３」、「４９」、「２７」、「２６」という数値が抜き出され、「０．０２５３４９２７２６」という内キーの土台が形成される。
【００５２】
なお、図９に示す暗号ループ１号を用いた内キーの土台の作成方法はあくまでも一例であり、内キーの土台および内キーは別の方法で作成されてもよい。また図９においては、Ｍ５２〜Ｍ５５の欄の数字に基づいて内キーの土台が作成される場合に付いて示したが、内キーの土台は図９における別の欄の数字に基づいて作成されてもよい。
【００５３】
図１０は、図６のステップＳ１１の詳細を示すサブルーチンである。
【００５４】
図１０を参照して、図６のステップＳ１１においてＣＰＵ１は、暗号ループ２号の現在の実行回数を示す回数Ｒの値と、しるしを付けた個数Ｔの値との各々を０に設定する。そしてＣＰＵ１は、ステップＳ５にて得られた１０桁のランダムキーの土台を、１０の位から小数第８位までの数値（つまり、「ａｂ．ｃｄｅｆｇｈｉｊ」（ａ〜ｊは数字）という形の数値）に変形し、これを現在のランダムキーとして設定する（Ｓ４１）。
【００５５】
次に暗号ループ２号を用いた演算が開始される。暗号ループ２号は、入力された数値に所定の関数処理を施して数値を出力するものである。ＣＰＵ１は、暗号化の対象となる１０桁の数値Ａを、暗号ループ２号において演算の基となる数値Ｄとして設定し（Ｓ４３）、現在のランダムキーの中から整数部分を構成する数値Ｘを選ぶ（Ｓ４５）。数値Ｄおよび数値Ｘは、暗号ループ２号に入力される２つの数値となる。
【００５６】
続いてＣＰＵ１は、現在のランダムキーにおいて、数値Ｘとして使用した２つの数字を現在のランダムキーの末桁に移動し、かつ小数第１位および第２位であった数字が整数部分を構成する数値となるよう（整数部分以外の各桁の数字が２桁繰り上がるよう）、ランダムキーを更新する（Ｓ４７）。たとえば、数値Ｘを選択する前のランダムキーが「ａｂ．ｃｄｅｆｇｈｉｊ」であった場合には、更新後のランダムキーは「ｃｄ．ｅｆｇｈｉｊａｂ」となる。これにより、次回ステップＳ４５において選ばれる数値Ｘは、今回選ばれた数値Ｘとは別の数値となる。つまり、「ａｂ」→「ｃｄ」→「ｅｆ」→「ｇｈ」→「ｉｊ」→「ａｂ」→・・・という順で数値Ｘが選ばれる。なお、ステップＳ４５およびＳ４７においては、ランダムキーを更新せずにランダムキーから同じ数字を選択し続けてもよいし、２桁以上の数値を選択してもよい。
【００５７】
なお、ステップＳ４７を省略して（ランダムキーを更新せずに）、ランダムキーから特定の同じ数値（たとえば「ａｂ」）を選択し続けてもよいし、数値Ｘとして１つあるいは３つ以上の数字よりなる数値を選択してもよい。
【００５８】
続いてＣＰＵ１は、数値Ｄが負数であるか否かを判別する（Ｓ４９）。ステップＳ４９において数値Ｄが正数であると判別した場合には（Ｓ４９でＮＯ）、ＣＰＵ１は、数値Ｄの対数値を求め（Ｓ７１）、ステップＳ４５にて選ばれた数値Ｘを関数Ｇ（ｘ）に入力して得られる数値Ｇ（Ｘ）を、この対数値に対して作用させる（Ｓ７３）。なお、関数Ｇ（ｘ）は四則演算、平方根、自然対数、累乗などどのような演算を含んでいてもよく、数値Ｇ（Ｘ）の作用のさせ方も、たとえば対数値と数値Ｇ（Ｘ）との四則演算を行うなど、どのようなものであってもよい。
【００５９】
次にＣＰＵ１は、ステップＳ７３において得られた演算結果（対数値に数値Ｇ（Ｘ）を作用させることによって得られた数値）が数値Ｄとなるように、数値Ｄを更新し（Ｓ７５）、現在のループの回数Ｒに１を加える（Ｓ７７）。これにより、暗号ループ２号を用いた１回の演算が終了する。更新後の数値Ｄは、暗号ループ２号から出力された数値であり、暗号ループ２号を用いた次回の演算において入力される数値となる。その後ＣＰＵ１はステップＳ４５の処理へ進み、暗号ループ２号を用いた演算を繰り返す。
【００６０】
ステップＳ４９において数値Ｄが負数であると判別した場合には（Ｓ４９でＹＥＳ）、ＣＰＵ１は、数値Ｄからマイナスを取って正数とし（Ｓ５１）、正数にした数値Ｄの対数値を求め（Ｓ５３）、ステップＳ５５の処理へ進む。
【００６１】
ここで、上記のステップＳ７１の処理、ならびにステップＳ５１およびＳ５３の処理は、関数Ｆ（ｘ）＝｜ｌｏｇｘ｜に数値Ｄを入力して数値Ｆ（Ｄ）を得る処理である。「ｌｏｇｘ」の底はどのような数字でもよく、「ｌｏｇｘ」はたとえば自然対数や常用対数であってもよい。また、関数Ｆ（ｘ）はどのような関数であってもよい。
【００６２】
続いてＣＰＵ１は、ステップＳ４５にて選ばれた数値Ｘを関数Ｇ（ｘ）に入力して得られた数値Ｇ（Ｘ）を、この対数値に対して作用させる（Ｓ５５）。次にＣＰＵ１は、ステップＳ５５において得られた演算結果（対数値に数値Ｇ（Ｘ）を作用させることによって得られた数値）が数値Ｄとなるように、数値Ｄを更新し（Ｓ５７）、現在のループの回数Ｒにしるしを付け（つまり、現在のループの回数Ｒを記憶させ）（Ｓ５９）、現在のループの回数Ｒ、および現在のしるしを付けた個数Ｔに１を加える（Ｓ６１）。更新後の数値Ｄは、暗号ループ２号から出力された数値であり、暗号ループ２号を用いた次回の演算が行われる場合には、暗号ループ２号を用いた次回の演算において入力される数値となる。
【００６３】
次にＣＰＵ１は、しるしを付けた個数Ｔが個数Ｚに達したか否かを判別する（Ｓ６３）。これにより、暗号ループ２号を用いた１回の演算が終了する。ステップＳ６３において、しるしを付けた個数Ｔが個数Ｚに未だ達していないと判別した場合（Ｓ６３でＮＯ）、ＣＰＵ１はステップＳ４５の処理へ進み、暗号ループ２号を用いた演算を繰り返す。
【００６４】
ステップＳ６３において、しるしを付けた個数Ｔが個数Ｚに達したと判別した場合（Ｓ６３でＹＥＳ）、ＣＰＵ１は、最後に得られた数値Ｄ（最終回に暗号ループ２号から出力された数値Ｄ）を暗号＃１の土台とし（Ｓ９１）、しるしを付けたＺ個のループの回数Ｒと、内キーとに基づいて、暗号＃２の土台を作成する（Ｓ９３）。続いてＣＰＵ１は、現在のランダムキーを正式なランダムキーとし（Ｓ９５）、処理を終了する。なお、上述の暗号ループ２号においては、数値Ｄが負数である場合にしるしを付ける代わりに、数値Ｄが正数である場合に現在のループの回数Ｒにしるしを付けてもよい。
【００６５】
図１１は、図１０における数値Ｄの変化の一例を示す図である。なお、図１１では、しるしをつける個数Ｚが５である場合の数値Ｄの変化を示しており、図１１に示された数値Ｄには、その一部がアスタリスクを用いて省略されているものがある。
【００６６】
図１１を参照して、暗号ループ２号の現在の実行回数である回数Ｒが０である場合には、正数である「０．４４３３２２１１００」という数値Ｄが暗号ループ２号に入力され、「−０．８０＊＊＊＊＊＊＊＊」に更新された数値Ｄが暗号ループ２号から出力される。回数Ｒが１である場合には、負数である「−０．８０＊＊＊＊＊＊＊＊」という数値Ｄが入力され、「−０．２１＊＊＊＊＊＊＊＊」に更新された数値Ｄが出力される。この場合、回数Ｒ＝１にしるしが付けられ、個数Ｔが１とされる。回数Ｒが２である場合には、負数である「−０．２１＊＊＊＊＊＊＊＊」という数値Ｄが入力され、「−１．４４＊＊＊＊＊＊＊＊」に更新された数値Ｄが出力される。この場合、回数Ｒ＝２にしるしが付けられ、個数Ｔが２とされる。その後、暗号ループ２号の処理が繰り返され、回数Ｒが６である場合には、負数である「−０．０１＊＊＊＊＊＊＊＊」という数値Ｄが入力され、「−４．３１７９０５５２１４１」に更新された数値Ｄが出力される。この場合、回数Ｒ＝６にしるしが付けられ、個数Ｔが５とされる。その結果個数Ｔが個数Ｚに達すると、最終回に出力された数値Ｄである「−４．３１７９０５５２１４１」が暗号＃１の土台とされ、しるしが付けられた回数Ｒである「１」、「２」、「３」、「５」、および「６」という数値に基づいて、暗号＃２の土台が作成される。
【００６７】
［暗号解読処理］
図１２は、計算機のＣＰＵが実行する暗号解読処理のフローチャートである。
【００６８】
図１２を参照して、始めに計算機１０のＣＰＵ１は、暗号＃１、暗号＃２、およびプロトコルキーの入力を促すメッセージを表示部５の画面に表示させ、暗号＃１、暗号＃２、およびプロトコルキーの入力をユーザから受け付ける（Ｓ２０１）。次にＣＰＵ１は、外キーの入力を促すメッセージを表示部５の画面に表示させ、外キーの入力をユーザから受け付ける（Ｓ２０３）。続いてＣＰＵ１は、暗号化処理におけるステップＳ７（図６）と同様の方法で、外キーと、暗号化プログラム内に事前に登録（設定）されている１０桁の内内キーの土台とに基づいて、１０桁の内内キーを作成する（Ｓ２０５）。なお、内内キーが暗号解読プログラム内に設定されている場合には、ステップＳ２０５の処理は省略される。
【００６９】
次にＣＰＵ１は、暗号化処理におけるステップＳ９（図６）と同様の方法で、解読ループ１号を用いて、外キーと内内キーとに基づいて１０桁の内キーを作成する（Ｓ２０７）。
【００７０】
続いてＣＰＵ１は、プロトコルキーと、外キーと、内キーとに基づいてランダムキーを作成し（Ｓ２０９）、暗号＃１に基づいて暗号＃１の土台を作成し（Ｓ２１１）、暗号＃２と内キーとに基づいて暗号＃２の土台を作成する（Ｓ２１３）。ステップＳ２０９、Ｓ２１１およびＳ２１３の各々においては、暗号化処理におけるステップＳ１３、Ｓ１５およびＳ１７の各々において実行される演算とは逆の演算が行われる。たとえばステップＳ１５において暗号＃１の土台に関数Ｈ（ｘ）を作用させることで暗号＃１を作成した場合には、ステップＳ２１１においては暗号＃１に逆関数Ｈ-1（ｘ）を作用させることで暗号＃１の土台が作成される。
【００７１】
その後ＣＰＵ１は、後述する解読ループ２号（図１３）を用いて、暗号＃１および＃２の土台と、正式なランダムキーとに基づいて、暗号化の対象となった数値Ａを作成し（Ｓ２１５）、処理を終了する。
【００７２】
図１３は、図１２のステップＳ２１５の詳細を示すサブルーチンである。
【００７３】
図１３を参照して、図１２のステップＳ２１５においてＣＰＵ１は、暗号＃２の土台と内キーとに基づいて、しるしを付けたＺ個のループの回数Ｒを抽出する（Ｓ２２１）。ステップＳ２２１においては、図１０のステップＳ９３において実行される演算とは逆の演算が行われる。
【００７４】
続いてＣＰＵ１は、ステップＳ２２１で抽出されたＺ個のループの回数Ｒに基づいて決定され、たとえば最も大きい回数Ｒに回数Ｕを設定する（Ｓ２２３）。回数Ｕは、解読ループ２号における現在の実行回数を示すものである。たとえばステップＳ２２１において「１」、「２」、「３」、「５」、および「６」という回数Ｒの値が抽出された場合には、これらの回数Ｒのうち最も大きい回数であえる「６」に回数Ｕが設定される。
【００７５】
次に解読ループ２号を用いた演算が開始される。解読ループ２号は、入力された数値に所定の逆関数処理を施して数値を出力するものである。ＣＰＵ１は、暗号＃１の土台を、解読ループ２号において演算の基となる数値Ｅとして設定する（Ｓ２２５）。続いてＣＰＵ１は、現在のランダムキーにおいて、ランダムキーの末桁の２つの数字が整数部分を構成し、かつ整数部分であった２つの数字が小数第１位および第２位である数値となるよう（末２桁以外の各桁の数字が２桁繰り下がるよう）、ランダムキーを更新する（Ｓ２２７）。たとえば、現在のランダムキーが「ａｂ．ｃｄｅｆｇｈｉｊ」であった場合には、更新後のランダムキーは「ｉｊ．ａｂｃｄｅｆｇｈ」となる。続いてＣＰＵ１は、現在のランダムキー（つまり更新後のランダムキー）の中から、整数部分を構成する数値Ｘを選ぶ（Ｓ２２９）。数値Ｅおよび数値Ｘは、解読ループ２号に入力される２つの数値となる。
【００７６】
次にＣＰＵ１は、現在のループの回数Ｕにしるしが付けられているか否かを判別する（Ｓ２３１）。たとえばステップＳ２２１において「１」、「２」、「３」、「５」、および「６」という回数Ｒの値が抽出された場合において、現在のループの回数Ｕが「６」であるときは、現在のループの回数Ｕにしるしが付けられていると判別される。
【００７７】
ステップＳ２３１において、現在のループの回数Ｕにしるしが付けられていると判別した場合（Ｓ２３１でＹＥＳ）、ステップＳ２２９にて選ばれた数値Ｘを逆関数Ｇ-1（ｘ）に入力して得られる数値Ｇ-1（Ｘ）を、数値Ｅに対して作用させる（Ｓ２３３）。逆関数Ｇ-1（ｘ）は、図１０のステップＳ５５およびＳ７３にて使用された関数Ｇ（ｘ）の逆関数である。続いてＣＰＵ１は、ステップＳ２３３において得られた演算結果（数値Ｅに数値Ｇ-1（Ｘ）を作用させることによって得られた数値）を指数部分とし、かつステップＳ５３およびＳ７３において使用された対数の底を整数部分とする数値を求める（Ｓ２３５）。
【００７８】
次にＣＰＵ１は、ステップＳ２３５にて得られた数値にマイナスを付けてこの数値を負数にし（Ｓ２３７）、ステップＳ２３７において得られた数値が数値Ｅとなるように、数値Ｅを更新する（Ｓ２３９）。更新後の数値Ｅは、解読ループ２号を用いた次回の演算が行われる場合には、解読ループ２号を用いた次回の演算において入力される数値となる。その後ＣＰＵ１は、現在のループの回数Ｕから１を引き（Ｓ２４１）、ステップＳ２６１の処理へ進む。
【００７９】
ステップＳ２３１において、現在のループの回数Ｕにしるしが付けられていないと判別した場合（Ｓ２３１でＮＯ）、ステップＳ２２９にて選ばれた数値Ｘを逆関数Ｇ-1（ｘ）に入力して得られる数値Ｇ-1（Ｘ）を、数値Ｅに対して作用させる（Ｓ２５１）。続いてＣＰＵ１は、ステップＳ２５１において得られた演算結果（数値Ｅに数値Ｇ-1（Ｘ）を作用させることによって得られた数値）を指数部分とし、かつステップＳ５３およびＳ７３において使用された対数の底を整数部分とする数値を求める（Ｓ２５３）。
【００８０】
次にＣＰＵ１は、ステップＳ２５３にて得られた数値が数値Ｅとなるように、数値Ｅを更新する（Ｓ２５５）。更新後の数値Ｅは、解読ループ２号を用いた次回の演算が行われる場合には、解読ループ２号を用いた次回の演算において入力される数値となる。その後ＣＰＵ１は、現在のループの回数Ｕから１を引き（Ｓ２５７）、ステップＳ２６１の処理へ進む。
【００８１】
ステップＳ２６１においてＣＰＵ１は、現在のループの回数Ｕが０になったか否かを判別する（Ｓ２６１）。これにより、解読ループ２号を用いた１回の演算が終了する。ステップＳ２６１において、現在のループ回数が未だ０になっていないと判別した場合（Ｓ２６１でＮＯ）、ＣＰＵ１はステップＳ２２７の処理へ進み、解読ループ２号を用いた演算を繰り返す。現在のループ回数が０になったと判別した場合（Ｓ２６１でＹＥＳ）、ＣＰＵ１は、最後に得られた数値Ｄ（最終回に解読ループ２号から出力された数値Ｄ）を数値Ａとして決定し（Ｓ２６３）、処理を終了する。
【００８２】
［実施の形態の効果］
本実施の形態によれば、暗号化処理にランダムキーを用いることで、暗号化の対象となる１つの数値から互いに異なる第１の暗号（暗号＃１）、第２の暗号（暗号＃２）、および第３の暗号（プロトコルキー）が出力される。また、暗号化の対象となる数値が同じであっても、暗号化処理を施す度に、毎回異なった第１〜第３の暗号の組が出力される。これにより、暗号化方法および暗号解読方法が解明されにくくなり、安全性を向上することができる。
【００８３】
また、入力された外キーと、暗号化装置内に記憶された内内キーとに基づいて内キーを作成し、外キーと内キーとにさらに基づいて第３の暗号を作成することにより、万が一第１〜第３の暗号が第三者に盗まれた場合であっても、その第三者による解読を防ぐことができる。すなわち、第１〜第３の暗号とともに外キーおよび内内キーを入手しなければ、第三者は暗号を解読することができない。加えて、万が一暗号化プログラムまたは暗号解読プログラムが露見しても、内内キーを変更することで、暗号化プログラムまたは暗号解読プログラムを再び安全に使用することができる。
【００８４】
［その他］
上述の実施の形態においては、暗号化処理および暗号解読処理の両方を行う暗号化および暗号解読装置について示したが、本発明の装置は、暗号化処理および暗号解読処理のうちいずれか一方のみの処理を行うものであってもよい。
【００８５】
上述の実施の形態における暗号化処理および暗号解読処理においては、外キー、内内キー、および内キーが用いられなくてもよく、暗号化処理および暗号解読処理は、暗号化の対象となる数値Ａの入力を受け付け、第１〜第３の暗号を出力するもの、または第１〜第３の暗号の入力を受け付け、暗号化の対象となる数値Ａを出力するものであればよい。
【００８６】
上述の実施の形態における暗号化装置および暗号解読装置は、たとえば以下の形態などで利用可能である。ＰＣと計算機との通信の際には、ＰＣは、ＰＣが搭載する暗号化装置を用いてデータの暗号化処理を行い、暗号化したデータを計算機へ送信する。計算機は、計算機が搭載する暗号解読装置を用いて、受信したデータの暗号解読処理を行い、元のデータを得る。また、買い手であるユーザがインターネットショッピングにおいて商品を購入する場合において、買い手側ＰＣからインターネットを通じて売り手側ＰＣへクレジットカードに関する情報を送信するときに、買い手側ＰＣは、買い手側ＰＣが搭載する暗号化装置を用いてクレジットカードに関する情報の暗号化処理を行い、暗号化した情報を売り手側ＰＣへ送信する。売り手側ＰＣは、売り手側ＰＣが搭載する暗号解読装置を用いて、受信した情報の暗号解読処理を行い、元のクレジットカードに関する情報を得る。
【００８７】
上述の実施の形態における処理は、ソフトウェアにより行なっても、ハードウェア回路を用いて行なってもよい。また、上述の実施の形態における処理を実行するプログラムを提供することもできるし、そのプログラムをＣＤ−ＲＯＭ、フレキシブルディスク、ハードディスク、ＲＯＭ、ＲＡＭ、メモリカードなどの記録媒体に記録してユーザに提供することにしてもよい。プログラムは、ＣＰＵなどのコンピュータにより実行される。また、プログラムはインターネットなどの通信回線を介して、装置にダウンロードするようにしてもよい。
【００８８】
上述の実施の形態は、すべての点で例示であって制限的なものではないと考えられるべきである。本発明の範囲は上記した説明ではなくて特許請求の範囲によって示され、特許請求の範囲と均等の意味および範囲内でのすべての変更が含まれることが意図される。
【符号の説明】
【００８９】
１  ＣＰＵ
２  ＲＡＭ
３  ＲＯＭ
４  ＨＤＤ
５  表示部
６  操作部
１０  計算機
【要約】
【課題】安全性の高い暗号化装置、暗号解読装置、暗号化プログラム、および暗号解読プログラムを提供する。
【解決手段】暗号化装置は、入力された数値Ｄおよび数値Ｘに所定の関数処理を施して数値を出力する（Ｓ４９〜Ｓ６３）。暗号化装置は、所定回数だけ数値を入力し、初回の入力の際には、暗号化の対象となる数値Ａと、ランダムキーを構成する少なくとも一部の数字Ｘとを入力し（Ｓ４３およびＳ４５）、以降の回の入力の際には、前回出力された数値Ｄと、数値Ｘとを入力する（Ｓ４５、Ｓ５７、およびＳ７５）。暗号化装置は、関数に入力した数値Ｄが負数の場合に、現在のループの回数Ｒにしるしを付ける（Ｓ５９）。暗号化装置は、最終回に出力された数値Ｄに基づいて暗号＃１を作成し（Ｓ９１）、記憶させた回数Ｒに基づいて暗号＃２を作成し（Ｓ９３）、ランダムキーに基づいてプロトコルキーを作成する。
【選択図】図１０【図１】
0004796658.tif 000002
【図２】
0004796658.tif 000003
【図３】
0004796658.tif 000004
【図４】
0004796658.tif 000005
【図５】
0004796658.tif 000006
【図６】
0004796658.tif 000007
【図７】
0004796658.tif 000008
【図８】
0004796658.tif 000009
【図９】
0004796658.tif 000010
【図１０】
0004796658.tif 000011
【図１１】
0004796658.tif 000012
【図１２】
0004796658.tif 000013
【図１３】
0004796658.tif 000014