(57)【特許請求の範囲】
【請求項１】
電気通信データを暗号化及び復号化するためのコンピュータで実行される方法であって、前記電気通信データはビットストリームを有し、前記方法は、
ａ）コンピュータで長さｘバイトのストリーム暗号を生成することであって、コンピュータが、
ｉ）サブ鍵の個数を示す数ｎと、サブ鍵の繰り返しのない固有の長さｍｉバイト（ｉは１〜ｎの整数）をそれぞれが示すｎ個の固有の素数ｍｉを選択し、
ｉｉ）それぞれが繰り返しのない長さｍｉバイトを有するｎ個の固有の乱数を発生して該乱数に基づくｎ個の前記サブ鍵を生成し、
ｉｉｉ）ｎ＋１番目の乱数Ｒを発生し、
ｉｖ−１）ｐｉ＝Ｍｏｄｍｉ（Ｒ）とし、
ｉｖ−２）ｉ番目の乱数における位置がｐｉである各バイトに対して、前記ｎ個の乱数のそれぞれの各ｐｉ番目のバイトに排他的論理和関数又は加法若しくは減法である数学的関数を連続して適用して値を生成し、
ｖ）ｐｉの値をそれぞれ１だけインクリメントし、
ｖｉ）ｘバイトの前記ストリーム暗号が生成されるまで、ステップｉｖ−２）とｖ）を繰り返し、ステップｉｖ−２）で生成した前記各値をステップｉｖ−２）で生成した以前の値に連接して前記ストリーム暗号を生成することと、
ｂ）コンピュータが、前記電気通信データの連続したバイトと生成されたストリーム暗号の対応するバイトとに、排他的論理和関数又は他の数学的関数である暗号化のための関数を適用して該電気通信データを暗号化することと、
ｃ）コンピュータが、暗号化された前記電気通信データの連続したバイトと生成されたストリーム暗号の対応するバイトとに、前記暗号化のための関数の逆関数を適用して該電気通信データを復号化すること
を含む前記方法。
【請求項２】
各々の前記サブ鍵の前記選択された長さｍｉは１０を超える素数である、請求項１に記載の方法。
【請求項３】
前記ｎ個の乱数の前記各ｐｉ番目のバイトに連続して適用する前記関数は排他的論理和関数であり、コンピュータは、ｉを１としてｉ番目の乱数のｐｉ番目のバイトとｉ＋１番目乱数のｐｉ＋１番目のバイトの組に対して初めに、排他的論理和関数を適用して結果を得て、連続してｉを１だけインクリメントし、次の乱数のｐｉ＋１番目のバイトとｉ番目の乱数までの結果との組に排他的論理和関数を適用して新たな結果を得る、請求項１に記載の方法。
【請求項４】
さらに前記ストリーム暗号に非線形化関数を適用することを含む、請求項１に記載の方法。
【請求項５】
前記非線形化関数は換字式暗号法である、請求項４に記載の方法。
【請求項６】
コンピュータは、前記ｎ個の乱数の各々を、
ｉ）完全平方ではない、ｎ＋２番目の乱数を発生し、
ｉｉ）前記ｎ＋２番目の乱数の平方根を計算し、
ｉｉｉ）ｎ＋３番目の乱数を発生し、
ｉｖ）前記ｎ＋２番目の乱数の平方根の中での位置が前記ｎ＋３番目の乱数にしたがって計算される桁から始めて桁の有限列を前記ｎ＋２番目の乱数の平方根から連続して取得し、前記有限列の各々をバイトに変換し、
ｖ）前記ｎ個の乱数の前記各々の選択した長さｍｉに達するまで、各バイトを連続して連接すること
により、前記ｎ個の乱数の各々を生成する、請求項１に記載の方法。
【請求項７】
前記数の有限列は１０進法で少なくとも４桁の長さである、請求項６に記載の方法。
【請求項８】
法（ｍｏｄ）関数を適用することで前記有限列をバイトに変換する、請求項７に記載の方法。
【請求項９】
２５６を法とする（ｍｏｄ２５６）関数を適用することで前記有限列をバイトに変換する、請求項８に記載の方法。
【請求項１０】
ビットストリームを有する電気通信データを暗号化及び復号化するためのコンピュータプログラムであって、前記コンピュータプログラムは、
ｉ）コンピュータが、サブ鍵の個数を示す数ｎとサブ鍵の繰り返しのない固有の長さｍi（ｉは１〜ｎの整数）バイトをそれぞれが示すｎ個の固有の素数ｍiとに基づき、それぞれが繰り返しのない長さｍiバイトを有するｎ個の固有の乱数を発生して該乱数に基づくｎ個の前記サブ鍵を生成するステップと、
ｉｉ）コンピュータが、ｎ＋１番目の乱数Ｒを発生するステップと、
ｉｉｉ−１）コンピュータが、ｐｉ＝Ｍｏｄｍｉ（Ｒ）とし、
ｉｉｉ−２）コンピュータが、ｉ番目の乱数における位置がｐｉである各バイトに対して、前記ｎ個の乱数のそれぞれの各ｐｉ番目のバイトに排他的論理和関数又は加法若しくは減法である数学的関数を連続して適用して値を生成するステップと、
ｉｖ）コンピュータが、ｐｉの値をそれぞれ１だけインクリメントするステップと、
ｖ）コンピュータが、ｘバイトの前記ストリーム暗号が生成されるまで、ステップｉｉｉ−２）とｉｖ）を繰り返し、ステップｉｉｉ−２）で生成した前記各値をステップｉｉｉ−２）で生成した以前の値に連接して前記ストリーム暗号が生成するステップと、
ｖｉ）コンピュータが、前記電気通信データの連続したバイトと生成されたストリーム暗号の対応するバイトに、排他的論理和関数又は他の数学的関数である暗号化のための関数を適用して電気通信データを暗号化するステップと
をコンピュータに実行させるための前記コンピュータプログラム。
【請求項１１】
各々の前記サブ鍵の前記選択された長さｍｉは１０を超える素数である、請求項１０に記載のコンピュータプログラム。
【請求項１２】
前記ｎ個の乱数の前記各ｐｉ番目のバイトに連続して適用する前記関数は排他的論理和関数であり、コンピュータは、ｉを１としてｉ番目の乱数のｐｉ番目のバイトとｉ＋１番目乱数のｐｉ＋１番目のバイトの組に対して初めに、排他的論理和関数を適用して結果を得て、連続してｉを１だけインクリメントし、次の乱数のｐｉ＋１番目のバイトとｉ番目の乱数までの結果との組に排他的論理和関数を適用して新たな結果を得る、請求項１０に記載のコンピュータプログラム。
【請求項１３】
前記コンピュータプログラムは、コンピュータにさらに非線形化関数を前記ストリーム暗号に適用するステップを実行させる請求項１０に記載のコンピュータプログラム。
【請求項１４】
前記非線形化関数は換字式暗号法である、請求項１３に記載のコンピュータプログラム。
【請求項１５】
前記サブ鍵とするステップにおいて、
コンピュータが、
ｉ）完全平方ではない、ｎ＋２番目の乱数を発生し、
ｉｉ）前記ｎ＋２番目の乱数の平方根を計算し、
ｉｉｉ）ｎ＋３番目の乱数を発生し、
ｉｖ）前記ｎ＋２番目の乱数の平方根の中での位置が前記ｎ＋３番目の乱数にしたがって計算される桁から始めて桁の有限列を前記ｎ＋２番目の乱数の平方根から連続して取得し、前記有限列の各々を生成されたバイトに変換し、
ｖ）前記ｎ個の乱数の前記各々の選択した長さｍｉに達するまで、各生成されたバイトを連続して連接することにより、前記ｎ個の乱数の各々を生成するステップをコンピュータに実行させる、請求項１０に記載のコンピュータプログラム。
【請求項１６】
前記数の有限列は１０進数で少なくとも４桁の長さである、請求項１５に記載のコンピュータプログラム。
【請求項１７】
法（ｍｏｄ）関数を適用することで前記有限列をバイトに変換する、請求項１５に記載のコンピュータプログラム。
【請求項１８】
２５６を法とする（ｍｏｄ２５６）関数を適用することで前記有限列をバイトに変換する、請求項１７に記載のコンピュータプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本出願は、現在係属中であり、２００２年１１月２０日に出願された米国特許出願番号１０／２９９８４７の一部継続出願である。
本発明は、暗号化方法の分野に関する。より詳細には、極端に長いこともある電子通信を暗号化するためにストリーム暗号を生成する方法に関する。
【背景技術】
【０００２】
安全な電子通信を提供するさまざまな暗号化方法がよく知られている。対称鍵暗号方法においては、送信者と受信者が同一のコードまたは鍵を利用して通信文を暗号化し復号する。とても解読することや復号することのできない、完全に安全な唯一の暗号化は使い捨て乱数方式（Ｏｎｅ−Ｔｉｍｅ  Ｐａｄ：ＯＴＰ）である。ＯＴＰでは、平文通信文を含むビットストリームと、平文と同じ長さの秘密ランダムビットストリーム（鍵）を用いる。平文を鍵により暗号化するには、鍵と平文からのビットの各組を連続的に排他的論理和関数で処理し、暗号文ビットを得る。鍵が真にランダムであり、鍵が認定されていない第三者から秘密に保たれる限り、暗号文は復号できない。この方法の問題点は、鍵が少なくても通信文と同一の長さを持つ必要があることである。それよりも短い鍵が使用され繰り返されると、暗号は解読することが可能である。暗号化すべきデータが極端に長い場合もある。
【０００３】
したがって、可変長であり、膨大な量のデータの暗号を考慮した、ランダムな鍵、つまりＯＴＰの生成方法が要求されている。
【発明の開示】
【課題を解決するための手段】
【０００４】
本発明は、長さｘバイトのストリーム暗号の生成方法であって、
ｉ）繰り返しのない長さｍｎの固有のバイトをそれぞれが有するサブ鍵の数ｎを選択し、
ｉｉ）各サブ鍵に一つが対応し、それぞれが長さｍｎバイトのｎ個の乱数を発生し、
ｉｉｉ）ｎ＋１番目の乱数Ｒを発生し、
ｉｖ）ｐ＝Ｍｏｄｍｎ（Ｒ）と設定し、
ｖ）前記ｎ番目の乱数における位置がｐである各バイトに対して、ｎバイトすべてに関数を適用して値を生成し、
ｖｉ）前記値を前記ストリーム暗号の最後に連接し、
ｖｉｉ）ｐ＝ｐ＋１と設定し、
ｖｉｉｉ）前記ストリーム暗号がｘバイトの長さになるまで、ステップｖ）、ｖｉ）、ｖｉｉ）を繰り返すこと
を含む、前記方法を提供する。好ましくは、各サブ鍵の選択された長さｍは素数である。本方法は、さらにストリーム暗号に非線形化関数を適用するステップを含んでもよい。
本発明の特徴のひとつは、前記ｎ個の乱数の各々は
ｉ）完全平方ではない、ｎ＋２番目の乱数を発生し、
ｉｉ）前記ｎ＋２番目の乱数の平方根を計算し、
ｉｉｉ）ｎ＋３番目の乱数を発生し、
ｉｖ）前記ｎ＋２番目の乱数の中での位置か前記ｎ＋３番目の乱数にしたがって計算される数から始めて、数の有限列を連続して取得し、前記有限列の各々をバイトに変換し、
ｖ）前記ｎ個の乱数の前記各々の選択した長さｍｎに達するまで、各バイトを連続して連接することにより生成される。
【０００５】
さらに、本発明はコンピュータ・プログラム製品、前記方法を実行する物品、そして前記方法を実行するデータ処理システムを提供する。
【発明を実施するための最良の形態】
【０００６】
図２では、本発明による、暗号化鍵の生成方法をフローチャートの形で示している。特に、暗号化鍵、つまり、ここでスーパー鍵と呼ぶ、無限の長さを持ち、繰り返しのないストリーム暗号は、サブ鍵を組み合わせて形成する。用途に応じて、任意の数ｎ個のサブ鍵Ｋ１、Ｋ２、...、Ｋｎを指定することができる。サブ鍵の数が大きいほど、繰り返しのないスーパー鍵の長さは長くなる。各サブ鍵の長さは、素数長のバイトである（１０を超える素数が好ましい）。
【０００７】
プロセスの最初のステップは、展開するスーパー鍵、つまりストリーム暗号の大きさを決定することである。サブ鍵の数ｎと各サブ鍵の繰り返しのない長さｍｎをバイト単位で選択する。サブ鍵はそれぞれ繰り返しのない固有の長さをもっている。つまり、繰り返しのない長さが同一であるサブ鍵はふたつない。好ましくは、サブ鍵の繰り返しのない長さは素数長のバイトである。サブ鍵の長さは好ましくはバイト単位で、２、３、５、...、１０２１の範囲の素数である。この範囲には１７２の異なる素数がある。サブ鍵の数と素数での繰り返しのない長さを手入力することで選択してもよい。または、サブ鍵の数と素数での繰り返しのない長さを用途に組み込む、つまり、プログラムによりサブ鍵の数と素数での繰り返しのない長さをランダムに選択する。ｎ個のサブ鍵Ｋｎにおいて、スーパー鍵の繰り返しのない長さは、（Ｋ１の大きさ）ｘ（Ｋ２の大きさ）ｘ（Ｋ３の大きさ）ｘ...ｘ（Ｋｎの大きさ）となる。たとえば、次の素数での繰り返しのない長さを持つ１０個のサブ鍵を使用すると仮定する。
サブ鍵１＝１３バイト＝Ｋ１
サブ鍵２＝１７バイト＝Ｋ２
サブ鍵３＝１９バイト＝Ｋ３
サブ鍵４＝２３バイト＝Ｋ４
サブ鍵５＝２９バイト＝Ｋ５
サブ鍵６＝３１バイト＝Ｋ６
サブ鍵７＝３７バイト＝Ｋ７
サブ鍵８＝４１バイト＝Ｋ８
サブ鍵９＝４３バイト＝Ｋ９
サブ鍵１０＝４７バイト＝Ｋ１０
繰り返しのないスーパー鍵の長さは結果として、１３ｘ１７ｘ１９ｘ２３ｘ２９ｘ３１ｘ３７ｘ４１ｘ４３ｘ４７＝２６６１８６０５３０６８６１１バイトになる。このように、少ない個数のサブ鍵を用いて、小さい素数での繰り返しのない長さにより、非常に長い、繰り返しのないスーパー鍵が得られる。上記のスーパー鍵の大きさの全体の定義は３００バイト（繰り返しのないサブ鍵の長さの合計）とヘッダー（サブ鍵の数と長さ）に含まれる。このように、スーパー鍵の全体の定義は、スーパー鍵の大きさの一部である。
【０００８】
各サブ鍵の繰り返しのない長さは好ましくは素数長のバイトであるが、結果として得られる暗号のランダム状態を改善するには、その暗号が非常に大きい限りは、素数ではない長さを用いても本方法は機能する。
【０００９】
サブ鍵の数を選択するには、ランダムストリームにより生成される最初の二桁を取得し、５０を法として演算し（ＭＯＤｅｄ  ｂｙ  ５０、５０で割った剰余を求め）、５０を加算して、５０から９９までの間で鍵の個数を提供する。
【００１０】
マルチ鍵プロセスの各サブ鍵は次のように生成してもよい。まず初めに、完全平方ではない乱数を生成する。好ましくは非常にランダムなソースによってである。５００から７００桁の範囲の整数であることが好ましい。これは「第一の元値」Ｏとして作用する。選択値Ｏが完全平方数ではないことを確認する。完全平方数である場合は、この基準を満たす数が見つかるまでほかのランダム値を生成する。第二の元値は、コンピュータのｒａｎｄ関数の因子として使用される３２ビット値である。ほとんどのコンピュータのオペレーティングシステムに含まれる乱数発生器は疑似ランダムであり、非常に強固であるわけではない。しかし、これらの値は出発点として十分である。第二の乱数Ｐもコンピュータのｒａｎｄ関数により生成する。そして、１００を法として演算し出発点を設定する。第一の元値Ｏの平方根Ｑを計算し、無理数Ｑを得る（小数点以下無限に続き、繰り返しはない数）。結果として得られる、小数点以下の数字列は潜在的に長さが無限で非常にランダムである。コンピュータにより、小数点より前の数字を捨て、小数点以下のＰ桁まで数値Ｑを計算する。そして、コンピュータにより、小数点以下のＱのＰ桁めから始めて、一度に４桁を連続的に選択し、４桁の数値の２５６を法とする値（ＭＯＤ  ２５６  ｖａｌｕｅ、２５６で割った剰余値）を計算する。これにより８ビット値を得る。この値をサブ鍵の最初のバイトとする。一度に４桁としてこのプロセスを繰り返し、生成しているサブ鍵の素数での繰り返しのない長さに等しいランダムデータ列が完成するまで、次々と次の４桁の数値で継続する。すべてのサブ鍵に対する繰り返しのない長さが生成されるまで、このプロセスをすべてのサブ鍵に対して繰り返す。そして各サブ鍵を形成する。このように生成した繰り返しのないバイト列を取得し、他のサブ鍵との組合せでスーパー鍵を生成するために十分な長さのサブ鍵を形成するために必要なだけ、取得作業を繰り返すことで形成する。
【００１１】
サブ鍵の生成アルゴリズムは次のように記述することができる。
【表１】
0004608319.tif 000002
１．５００から７００桁の範囲の整数の十進数表記としてＳｅｅｄ１を扱う。
２．Ｘ：＝ｓｅｅｄ１とする。
３．Ｙ：＝√Ｘとする。これはＸの平方根を求めると得られる無理数である。
４．Ｙの十進数表記において小数点のあとの数字をＺ１、Ｚ２、Ｚ３、Ｚ４  ..  とする。各Ｚｉは０から９の範囲にある。
５．Ｃａｌｌ  ｓｒａｎｄ（ｓｅｅｄ２）／／最初だけ。
６．無理数の出発点ｓｔａｒｔを得るためにｒａｎｄ（）を呼び出す。
７．ｓｔａｒｔ：＝ｒａｎｄ（）ｍｏｄ１００とする。ｓｔａｒｔは０から９９の範囲内である。
８．ＺｓｔａｒｔまでＺ１とＺ２を捨てる。
９．ｔｍｐ：＝１０＊Ｚ（ｓｔａｒｔ＋１）＋Ｚ（ｓｔａｒｔ＋２）とする。使用した値は捨てる。
１０．ｎ：＝５０＋（ｔｍｐ    ｍｏｄ５０）とする。ｎは５０から９９の範囲内である。
１１．ｉ：＝  １、２、．．．、ｎについて、以下を行う。
１２．ｊ＝３＊（ｉ−１）とする。
１３．ｔｍｐをＺｓｔｒｅａｍの次のバイトとする。
１４．ｔｍｐ：＝１００＊Ｚｊ＋１＋１０＊Ｚｊ＋２＋Ｚｊ＋３とする。
１５．ｔ：＝１７２−（ｔｍｐ  ｍｏｄ１７２）とする。ｔは１、２、．．．、１７２の範囲内である。
１６．ｕを２、３、５、．．．、１０２１の列の中のｔ番目の素数とする。
１７．ｕがｌ１、ｌ２、．．．、ｌ｛ｉ−１｝のいずれかに等しい場合、ｔを（ｔ＋１）ｍｏｄ１７２に設定し、１６行めに進む。
１８．ｌｉをｕと設定する。
１９．次のＩについて、すべてのサブ鍵の大きさが設定されるまで、１１行めに進む。
２０．ｉ：＝１、２、．．．、ｎについて、以下を行う。
２１．ｊ：＝０、１、２、...、ｌｉについて以下を行う。
２２．ｋ：＝４＊ｊとする。
２３．ｔｍｐをＺｓｔｒｅａｍの次のバイトとする。
２４．ｔｍｐ：＝（１０００＊Ｚｋ＋１００Ｚｋ＋１＋１０＊Ｚｋ＋２＋Ｚｋ＋３）ｍｏｄ２５６とする。
２５．ｓｉｊ：＝ｔｍｐとする。
２６．次のｊ：次のサブ鍵バイト
２７．次のＩ：次のサブ鍵
２８．ｉ：＝０、１、２、．．．、２５５について以下を行う。
２９．ｊ：＝４＊ｉとする。
３０．ｔｍｐ：＝（１０００＊Ｚｊ＋１００＊Ｚｊ＋１＋１０＊Ｚｊ＋２＋Ｚｊ＋３）ｍｏｄ２５６とする。
３１．ｔｍｐがＳ［０］、Ｓ［１］、．．．、Ｓ［ｉ−１］のいずれかに等しい場合、（ｔｍｐ＋１）ｍｏｄ２５６に設定し、３１行めに進む。
３２．Ｓ［ｉ］：＝ｔｍｐに設定する。
３３．次のｉ
３４．ｏｆｆｓｅｔ：＝ＺｉＺｉ＋１．．．Ｚｉ＋９とする。
３５．ｎ、（ｌ１、ｌ２、．．．、ｌｎ）、（ｓ１、ｓ２、．．．、ｓｎ）、Ｓ［２５６］、ｏｆｆｓｅｔを戻す。
３６．鍵ファイルに保存し、ｓｅｅｄ１とｓｔａｒｔ値をＤＢに追加する。
３７．ｓｅｅｄ１をインクリメントし、２行めに進む。／／十分な鍵が生成されるまで繰り返す。
【００１２】
上記のようにすべてのサブ鍵を生成したら、必要な長さまでスーパー鍵（暗号）を生成する。この意味は、暗号化することになっている関連データを暗号化するためにスーパー鍵は生成され続け、すべてのデータが暗号化されるまで生成されるということである。まず、乱数Ｒ（「第三の元値」、つまり、数Ｑについての出発点Ｐに対照するように、スーパー鍵についての開始オフセット）を生成する。長さｍｎを持つｎ個のサブ鍵のいずれかひとつで始め、Ｒのｍｏｄｍｎを計算し、各サブ鍵の第Ｍｏｄｍｎ（Ｒ）番目のバイトとほかのサブ鍵のおのおのの対応する第Ｍｏｄｍｎ（Ｒ）番目のバイトとの排他的論理和を連続して取る。たとえば、Ｒが１００、最初のサブ鍵の長さが９７バイト、２番目のサブ鍵の長さが４３バイトだとすると、サブ鍵１の第３番目のバイトを選択し、サブ鍵２の第１４番目のバイトや、Ｒに基づいて同様に選択した、ほかの残ったサブ鍵の対応するバイトとの排他的論理和を取る。各サブ鍵からの選択したバイトのすべてに対して排他的論理和を取るまで、このプロセスを繰り返す。以下にさらに述べるように、結果として得られた値を、換字式暗号化またはほかの非線形化関数で処理しスーパー鍵ストリームを非線形化してもよい。結果として得られた二進数値を連接によりスーパー鍵に加える。サブ鍵１の次に続くバイトを、サブ鍵２などの次のバイトと排他的論理和を求める。各サブ鍵から選択したバイトすべてに対して排他的論理和が求められ非線形化されるまで、このプロセスを再度繰り返す。各関数の結果の二進数値は再度、連接によりスーパー鍵に加える。排他的論理和関数が好ましいが、他の関数も適用できることは明らかであろう。たとえば、数学的関数の加法、または減法を使用することができる。スーパー鍵の各バイトが生成されるにつれて、平文通信文の対応するバイトは、スーパー鍵の対応するバイトで排他的論理和関数またはほかの数学関数により暗号化される。平文通信文のすべてのバイトが暗号化されると、スーパー鍵の生成が終了する。暗号化された通信文は、その通信文とスーパー鍵に、暗号化関数の逆関数を適用することで復号可能である。
【００１３】
サブ鍵からのスーパー鍵の生成をさらに述べるために、Ｓ｛ｉ｝ｊで、ｉ番目のサブ鍵のｊ番目のバイトを表すことにする。ｌ｛ｉ｝でｉ番目のサブ鍵の長さを示す。たとえば、ｌ｛１｝は１３、ｌ｛２｝は１７などである。サブ鍵ｉから終わりのないバイト列を生成する。
【数１】
0004608319.tif 000003
上記列のｊ番目のバイトをＳ｛ｉ｝ｊで表す。ｊは０から無限大までの自然数だとすると、Ｓ｛ｉ｝ｊの下付文字でのｊの最小値はｌ｛ｉ｝を法とするＲ（Ｒｍｏｄｕｌｏｌ｛ｉ｝）であり、ここでＲは乱数である。すると、スーパー鍵のｊ番目のバイトは、それをＺｊと呼ぶと、次のように定義される。
【数２】
0004608319.tif 000004
【数３】
0004608319.tif 000005
ここで、ｌ｛ｉ｝を法とするＲ（Ｒｍｏｄｕｌｏｌ｛ｉ｝）は０、１、２、．．．、（ｌ｛ｉ｝−１）の範囲で整数を返す。スーパー鍵は０から
【数４】
0004608319.tif 000006
までの範囲でｊ値を持つ。
順番に、平文のバイトをＰ０、Ｐ１、Ｐ２、Ｐ３、．．．とし、暗号文のバイトをＣ０、Ｃ１、．．．とする。また、スーパー鍵（すでに上記のように計算されている）のバイトをｚ０、ｚ１、．．．で表す。暗号文をＣｉ：＝ＰｉｘｏｒＳ［ｚｉ］で定義する。暗号文Ｃは、バイトＣ０、Ｃ１、．．．を連接して形成し、Ｃは暗号化プロセスの結果として返ってくる。明らかに、復号はこの逆に機能する。
【００１４】
Ｌバイトの平文を暗号化するために、Ｌバイトのスーパー鍵を生成し、平文のバイト数を数えるために大きな数値カウンタＴを用いる。出力はＬバイトの暗号文である。暗号文を復号するために、同一の大きな数値カウンタＴを使用し、出力はＬバイトの平文である。
【００１５】
本方法を用いて暗号文の線形性を減少させるために、平文通信文を暗号化する前に、スーパー鍵にさらに処理を適用してもよい。好適な実施例では、換字式暗号法をスーパー鍵に適用し、結果として得られる記号列を使用して平文通信文を暗号化する。たとえば、１から２５６までランダムに並べられた、固有の値を持つ、２５６バイトのアレイを生成する。ｘを２５６バイトアレイの最初の値として、スーパー鍵のｘ＋１バイトめの値によりスーパー鍵の最初のバイトを置き換える。次に、ｙを２５６バイトアレイの２番目の値として、スーパー鍵のｙ＋２バイトめの値によりスーパー鍵の２番目のバイトを置き換える。これを続ける。サブ鍵からのバイトがアレイ中の以前の入力の繰り返しとならない限りアレイに加えられ、２５６バイトアレイはサブ鍵の一つから形成することができる。
【００１６】
換字式暗号法を暗号化された通信文（暗号文）に適用することで、暗号文の線形性を減少させることができるが、暗号化の前にスーパー鍵に換字式暗号法を適用するとより効果的である。換字式暗号法以外にも、ＳＡＮＤＩＡ研究所から入手できる可逆非線形関数（ＩＮＬＦ）ユーティリティなどの他のユーティリティを使用して線形性をなくすことも可能である。バールカンプ・マッセイ（Ｂｅｒｌｅｋａｍｐ−Ｍａｓｓｅｙ）攻撃に対する保護を行うためにこれらは役に立つ。
【００１７】
上述のように、好ましくは各サブ鍵を構成するランダムな繰り返しのない記号列が生成されるが、乱数発生器によって単に各サブ鍵の繰り返しのない記号列が生成されて各サブ鍵を形成するときにも、結果として得られるスーパー鍵が暗号化されるデータの大きさの少なくとも２倍以上であるように、スーパー鍵の結果として得られる全体長が十分に大きい限り、本方法は機能する。
【００１８】
上記の方法を利用して、個人のセキュリティシステムを作成することも可能である。そのシステムでは、鍵を利用して、ユーザが安全にしたいと考えている個人ファイルを暗号化する。この場合、鍵の配送方法は必要ない。各ファイルが暗号化されると、｛ＯＬＤＦＩＬＥＮＡＭＥ｝．｛ＯＦＦＳＥＴ｝．ｗｎという名称の新ファイルが作成される。機能性の点で同一ファイル形式を維持し、復号を簡易にすることを考慮して、ＯＬＤＦＩＬＥＮＡＭＥには拡張子が含まれる。各ファイルが暗号化されると、それはすぐに復号され、元のファイルと比較され、検査コピーと元のファイルが完全一掃削除プロセスにより削除される（ファイル全体に０が上書きされ、次に１が上書きされ、そして削除される。）
【００１９】
好ましい鍵ファイル形式は次のように定義される。
【表２】
0004608319.tif 000007
上記の鍵ファイル形式は標準である。唯一異なる値は、引用符号で囲まれた十進数の列に記憶されるオフセットである。例としては９８７６５４３２１がある。これは１０００桁までの範囲の値を考慮しているが、オフセットが適切に実現されれば、鍵ストリームが部分的に再使用されることはない。
【００２０】
本発明は、たとえば、ネットワーク１２上でコンピュータ１４と１６の間での通信を暗号化し復号する、コンピュータで実現する方法として上述している。コンピュータのハードウェア装置として、コンピュータのソフトウェアプログラムとして、または、それらの組合せとしても実施化してよい。本発明を実現するプログラムを実施化するコンピュータで読み取り可能な記憶媒体として本発明を実施化してもよい。そのような記憶媒体としては、磁気的または光学的、ハードディスクまたはフロッピィディスク、ＣＤ−ＲＯＭ、ファームウェア、またはほかの記憶媒体であってもよい。本発明は、コンピュータで読み取り可能な、変調キャリア信号上に実施化してもよい。
【００２１】
上記の開示に鑑みて当業者には明白であろうが、本発明を実施する場合に、本発明の趣旨または範囲から離れることなく、多くの変更と変形例が可能である。したがって、本発明の範囲は、以下に記載のクレームで定義される内容に従って解釈されるべきである。
【図面の簡単な説明】
【００２２】
【図１】本発明の方法を実行するコンピュータシステムの概略図である。
【図２】本発明の方法を示すフローチャートである。
【図１】
0004608319.tif 000008
【図２】
0004608319.tif 000009