(57)【要約】【課題】効率に優れたストリーム暗号方法を提供する。【解決手段】動態S-box(DM)は、256個のパイ・データ（ビット長：32ビット）で初期化される。動態S-boxの要素は、初期化の後に要素相互間で交換される。その交換の方法は暗号化のための秘密キーに依存する。第1の要素に使う第1の交換算法は、残りの255個の要素の交換に使用されていた交換算法とは異なる。動態S-box の中にある256個の要素の交換は、キースケジュールアルゴリズムによりすべて行われ、このアルゴリズムでは、動態S-box 中の256個の要素の交換が行われるだけでなく、インデックスポインターyと更新変数mix32も生成される。yは、S-boxにおける複数のデータを変数とする関数によって生成され、mix32は要素交換アルゴリズムの中で生成され、更新される。y及びmix32は、キーストリーム生成アルゴリズムおいてキーストリームを生成するために使用される。【選択図】      図６
2008256817.tif 000002
【特許請求の範囲】
【請求項１】
キーに基づいたキーストリームを生成し、該キーストリームと平文との排他的論理和演算により該平文を暗号化した暗号文を生成するキーストリーム暗号方法において、
円周率πを構成する無限数列における１又は複数の部分数列を選択してなる数列をパイ・データと称するとき、n個（nは2以上の整数）の要素でなる動態S-boxを該パイ・データで初期化する初期化プロセスと、
前記初期化ステップにより初期化された前記動態S-boxにおける要素を、キーに依存する交換アルゴリズムにより、相互に交換する要素交換プロセスと、
前記動態S-boxにおける複数の要素を変数とする関数によりインデックスポインターyを生成するインデックスポインターy生成プロセスと、
前記交換アルゴリズムにおいて更新変数mix32を生成する更新変数mix32生成プロセスと、
前記動態S-boxにおける１つの要素をインデックスポインターｘとして選択するインデックスポインターｘ選択プロセスと、
前記インデックスポインターy生成プロセスで生成したインデックスポインターy、前記更新変数mix32生成プロセスで生成した更新変数mix32及び前記インデックスポインターｘ選択プロセスで選択した前記インデックスポインターｘに基づき前記インデックスポインターy生成プロセスで生成したインデックスポインターyを更新するインデックスポインターy更新プロセスと、
前記インデックスポインターｘ選択プロセスで選択した前記インデックスポインターｘに基づき指定した前記動態S-boxにおける複数の要素を加工することにより、インデックスポインターｘを更新するインデックスポインターｘ更新プロセスと、
前記更新変数mix32生成プロセスで生成した更新変数mix32に基づき指定した前記動態S-boxにおける複数の要素を加工することにより、更新変数mix32を更新する更新変数mix32更新プロセスと、
前記インデックスポインターｘ更新プロセスで更新したインデックスポインターｘに基づき指定した前記動態S-boxにおける第１及び第２の要素並びに前記インデックスポインターy更新プロセスで更新したインデックスポインターyに基づき指定した前記動態S-boxにおける第３及び第４の要素を取得し、第１乃至第４の要素に基づいて指定した前記動態S-boxにおける第５及び第６の要素を夫々キーストリームの第１及び第２のワードとし、第１及び第２のワードを連接して２ワードのキーストリームを生成する
ことを特徴とするキーストリーム暗号方法。
【請求項２】
前記交換アルゴリズムは、交換アルゴリズム１及び交換アルゴリズム２でなり、
交換アルゴリズム１では、前記動態S-boxにおける第１番目の要素を他の要素と交換し、
交換アルゴリズム２では、前記動態S-boxにおける第２番目からn番目の要素を他の要素と交換する
ことを特徴とする請求項１に記載のキーストリーム暗号方法。
【請求項３】
前記第５の要素は前記第１及び第３の要素に基づいて指定し、
前記第６の要素は前記第２及び第４の要素に基づいて指定する
ことを特徴とする請求項１又は２に記載のキーストリーム暗号方法。
【請求項４】
初期化ベクトルIVを複数のデータに分割し
前記インデックスポインターｘ選択プロセスにおいて、インデックスポインターｘとして選択する動態S-boxにおける１つの要素は、前記初期化ベクトルIVを分割して得た前記複数のデータのうちの１つに基づき指定した動態S-boxにおける１つの要素であり、
前記インデックスポインターy生成プロセスにおいてインデックスポインターyを生成する前記関数は、前記初期化ベクトルIVを分割して得た前記複数のデータのうちの別の１つに基づき指定した動態S-boxにおける複数の要素を前記変数とする
ことを特徴とする請求項１乃至３に記載のキーストリーム暗号方法。
【請求項５】
請求項１乃至４に記載の方法により平文を暗号化して生成した暗号文に、暗号化したMAC(メッセージ認証コード)を付加することを特徴とする認証機能付きストリーム暗号方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、対称暗号であるストリーム暗号・復号方法、並びにパイ・データ及び動態S-boxに基づいて暗号化・復号化の両方を実現する暗号算法・復号化算法に関する。
【背景技術】
【０００２】
現在使用されている多くのストリーム暗号は、リニアー・フィードバック・シフト・レジスター（linear feedback shift registers , LFSRs）と呼ばれる方法に基づいている。LFSRsでは、ソフトウェアを利用した方法の効率は、ハードウェア利用した方法の効率より低い。ここで効率とは、処理速度の速さと所要メモリー空間の少なさをいう。LFSRsによるストリーム暗号は、比較的に長い期間に亘って市場に存在し、そしてそれらのストリーム暗号のメカニズムが徹底的に完全に分析された。そこで、LFSRsによるストリーム暗号には安全性に関する懸念が通常はある。勿論、LFSRs であっても、巨大なメモリー空間を占有することにより、安全性を向上することは可能ではあるが、このようは方策では処理速度が遅くなり、所要メモリー空間が増大するので、非効率な暗号システムとなる。LFSRsについては、フリー百科事典『ウィキペディア（Wikipedia）』の“Linear feedback shift register”なる項目（非特許文献１）に詳しい説明が掲載されている（URL「http://en.wikipedia.org/wiki/LFSR」）。
【０００３】
また、現用の対称暗号（ストリーム 暗号）は、同じキーは必ず同じキーストリームを生成する、という重大な問題を常に抱えている。つまり、従来のストリーム 暗号の中で同じキーを繰り返して使用することは、ワンタイムパッド (one time pad, OTP)を再度使用するのと同じく、暗号の安全性を損う。
【０００４】
また、Phelix1は、Ferguson, Whiting, Schneier, Kelsey, Lucks及び Kohnoによって非特許文献２に公表され、Helixによって提供されるMAC機能性で内蔵の高速のストリーム 暗号がある。彼らは、「Phelixは、ストリーム暗号およびMAC機能性の結合であって、認証付暗号機能(authenticated encryption functionality)を直接に提供する。」と述べられている。また、「キーストリームと平文を協働させることによって、Phelixは、費用の追加なしで認証機能を提供できる。」と述べられている。その内部を理解せず、Phelix1の表面を単に見るだけ限りの場合は、そのようなステートメントは有効である。しかし、実際は、Phelixの認証機能性は無料とは言えない。キーストリームに平文を加えるには実際に時間をかかるからである。したがって、Phelixストリーム暗号は、追加費用なしで認証機能性を提供することはできない。さらに、平文に依存するキーストリームは、セキュリティ攻撃に対しシステムを脆弱にし、それに第三者によるシステムの分析を容易にする。更に、Phelixは平文の認証を使用するので、送信中の保護を必要とするデータが実際の送信プロセスの中で変更されたかどうかは受信者が受信ファイルを解読した後という長いプロセスの後でしか知ることができない。したがって、Phelixの効率は当事者の主張より低い。
【０００５】
【非特許文献１】フリー百科事典『ウィキペディア（Wikipedia）』の“Linear feedback shift register”なる項目（URL「http://en.wikipedia.org/wiki/LFSR」）。
【非特許文献２】Niels Ferguson, Doug Whiting, Bruce Schneier, John Kelsey, Stefan Lucks, Tadayoshi Kohno, Helix: fast encryption and authentication in a single cryptographic primitive, in [7] (2003), 330{346. URL: http://www.macfergus.com/helix/.
【発明の開示】
【発明が解決しようとする課題】
【０００６】
前述のように、従来から多く使用されているLFSRsによるストリーム暗号は、ソフトウェアを利用した方法の効率がハードウェア利用した方法の効率より低く、比較的に長い期間に亘って市場に存在し、メカニズムが徹底的に完全に分析されたので、安全性に関する懸念が避けがたいし、安全性を向上するために大きなメモリー空間を使用すると、非効率な暗号システムとなる。
【０００７】
また、現用の対称暗号（ストリーム 暗号）は、同じキーは必ず同じキーストリームを生成するので、ストリーム 暗号の中で同じキーを繰り返して使用することは、ワンタイムパッド (one time pad, OTP)を再度使用するのと同じく、暗号の安全性が毀損される。
【０００８】
非特許文献２に記載のPhelixは、ストリーム暗号およびMAC機能性の結合により認証付暗号機能を提供すると公表されている。キーストリームを平文に依存するPhelixは、セキュリティ攻撃に対しシステムを脆弱にし、第三者によるシステムの分析を容易にするとともに、平文の認証を使用するので、送信中の保護を必要とするデータが実際の送信プロセスの中で変更されたかどうかは受信者が受信ファイルを解読した後という長いプロセスの後でしか知ることができず、効率において劣っている。
【０００９】
そこで、本発明の目的は、効率に優れたストリーム暗号方法を提供することにある。別の本発明の目的は、同じキーを使用しても異なるキーストリームを生成するストリーム暗号方法の提供にある。更に別の本発明の目的は、セキュリティ攻撃に対しシステムを脆弱にすることがなく、第三者によるシステムの分析を容易にせず、また、送信中の保護を必要とするデータが実際の送信プロセスの中で変更されたかどうかが、受信者が受信ファイルを解読した後という長いプロセスを要することなく、確認できる認証付ストリーム暗号方法を提供することにある。
【課題を解決するための手段】
【００１０】
前述の課題を解決するために本発明は次の手段を提供する。
【００１１】
（１）キーに基づいたキーストリームを生成し、該キーストリームと平文との排他的論理和演算により該平文を暗号化した暗号文を生成するキーストリーム暗号方法において、
円周率πを構成する無限数列における１又は複数の部分数列を選択してなる数列をパイ・データと称するとき、有限個の要素でなる動態S-boxを該パイ・データで初期化する初期化プロセスと、
前記初期化ステップにより初期化された前記動態S-boxにおける要素を、キーに依存する交換アルゴリズムにより、相互に交換する要素交換プロセスと、
前記動態S-boxにおける複数の要素を変数とする関数によりインデックスポインターyを生成するインデックスポインターy生成プロセスと、
前記交換アルゴリズムにおいて更新変数mix32を生成する更新変数mix32生成プロセスと、
前記動態S-boxにおける１つの要素をインデックスポインターｘとして選択するインデックスポインターｘ選択プロセスと、
前記インデックスポインターy生成プロセスで生成したインデックスポインターy、前記更新変数mix32生成プロセスで生成した更新変数mix32及び前記インデックスポインターｘ選択プロセスで選択した前記インデックスポインターｘに基づき前記インデックスポインターy生成プロセスで生成したインデックスポインターyを更新するインデックスポインターy更新プロセスと、
前記インデックスポインターｘ選択プロセスで選択した前記インデックスポインターｘに基づき指定した前記動態S-boxにおける複数の要素を加工することにより、インデックスポインターｘを更新するインデックスポインターｘ更新プロセスと、
前記更新変数mix32生成プロセスで生成した更新変数mix32に基づき指定した前記動態S-boxにおける複数の要素を加工することにより、更新変数mix32を更新する更新変数mix32更新プロセスと、
前記インデックスポインターｘ更新プロセスで更新したインデックスポインターｘに基づき指定した前記動態S-boxにおける第１及び第２の要素並びに前記インデックスポインターy更新プロセスで更新したインデックスポインターyに基づき指定した前記動態S-boxにおける第３及び第４の要素を取得し、第１乃至第４の要素に基づいて指定した前記動態S-boxにおける第５及び第６の要素を夫々キーストリームの第１及び第２のワードとし、第１及び第２のワードを連接して２ワードのキーストリームを生成する
ことを特徴とするキーストリーム暗号方法。
【００１２】
（２）前記交換アルゴリズムは、交換アルゴリズム１及び交換アルゴリズム２でなり、
交換アルゴリズム１では、前記動態S-boxにおける第１番目の要素を他の要素と交換し、
交換アルゴリズム２では、前記動態S-boxにおける第２番目からn番目の要素を他の要素と交換する
ことを特徴とする前記（１）に記載のキーストリーム暗号方法。
【００１３】
（３）前記第５の要素は前記第１及び第３の要素に基づいて指定し、
前記第６の要素は前記第２及び第４の要素に基づいて指定する
ことを特徴とする前記（１）又は（２）に記載のキーストリーム暗号方法。
【００１４】
（４）初期化ベクトルIVを複数のデータに分割し
前記インデックスポインターｘ選択プロセスにおいて、インデックスポインターｘとして選択する動態S-boxにおける１つの要素は、前記初期化ベクトルIVを分割して得た前記複数のデータのうちの１つに基づき指定した動態S-boxにおける１つの要素であり、
前記インデックスポインターy生成プロセスにおいてインデックスポインターyを生成する前記関数は、前記初期化ベクトルIVを分割して得た前記複数のデータのうちの別の１つに基づき指定した動態S-boxにおける複数の要素を前記変数とする
ことを特徴とする前記（１）乃至（３）に記載のキーストリーム暗号方法。
【００１５】
（５）請求項１乃至４に記載の方法により平文を暗号化して生成した暗号文に、暗号化したMAC(メッセージ認証コード)を付加することを特徴とする認証機能付きストリーム暗号方法。
【発明の効果】
【００１６】
本発明によれば、効率に優れたストリーム暗号・復号方法を提供できる。また、本発明によれば、同じキーを使用しても異なるキーストリームを生成するストリーム暗号・復号方法を提供できる。更に本発明によれば、セキュリティ攻撃に対しシステムを脆弱にすることがなく、第三者によるシステムの分析を容易にせず、また、送信中の保護を必要とするデータが実際の送信プロセスの中で変更されたかどうかが、受信者が受信ファイルを解読した後という長いプロセスを要することなく、確認できる認証付ストリーム暗号・復号を提供できる。
【発明を実施するための最良の形態】
【００１７】
次に本発明の実施の形態を挙げ、図面を参照し、本発明を一層具体的に説明する。
【００１８】
[概要]
本願発明は、ストリーム暗号に関し、特にパイ・データ及び動態S-boxに基づいて暗号化及および復号化の両方を実現する暗号算法および復号化算法に関する。パイ・データ(Pi data)は、円周率πの値であり、π = 3.14159 26535 89793 23846 26433 83279 50288・・・・・・・・・・のように無限に続く値である。S-boxは、サブスティテューションボックス(substitution box)又はSボックスとも称され、mビットの入力をnビットに変換する関数であって、m×nのルックアップテーブルによって実装できる。動態S-boxは、英文でDynamic S-boxと表記される。以下では、円周率パイの英文表記がpiであることに因み、本願発明を「PI」と略記し、表記の簡素化を図るものとする。
【００１９】
以下、本願発明「PI」について、3つのユニークな実施の形態を挙げ、説明する。第1の実施の形態は基本的な実施の形態で、第2の実施の形態は基本的な実施の形態に初期化ベクトル(Initialization Vectors, IV）を加えた実施の形態で、第３の実施の形態は基本的な実施の形態にIV及び認証を加えた実施の形態である。以下においては、主として第1の実施の形態に注目して本願発明を説明する。第2および第3の実施の形態については、第1の実施の形態とこれらの2つの実施の形態間の違いについて説明する。
【００２０】
まず本願発明の第１の実施の形態について説明する。理解を容易にするために、以下では、データ長等についての具体的な数値や処理の手順を例示し、本第１の実施の形態の説明を進める。これらの具体的数値や手順は、あくまで例示であり、本願発明の範囲を限定するものでないことは勿論である。
発明「PI」の第１の実施の形態で使用するキーは、8ビットの倍数の可変長さキーであり、そのキーのデータ長(Lバイト)は8から2048ビットの範囲である。動態S-boxは、まず256個のパイ・データで初期化される。256個の各パイ・データのビット長は３２ビットである。そこで、動態S-boxの初期化に使われるパイ・データは、無限数であるπの一部分、即ちπを構成する無限の数の内から選んだ256*32ビット(bits)分のデータである。動態S-boxの中の256個の要素は、初期化の後に要素相互間で交換される。その交換の方法は秘密キーに依存する。
【００２１】
256個の要素の交換プロセスの中で、第1の要素に使う第1の交換算法（方法）は、残りの255個の要素の交換に使用されていた交換算法（方法）とは異なる。動態S-box の中にある256個の要素の交換は、キースケジュールアルゴリズム(Key Schedule Algorithm)によりすべて行われる。キースケジュールアルゴリズムでは、動態S-box 中の256個の要素の交換が行われるだけでなく、インデックスポインターy（index pointer y）と更新変数mix32も生成される。インデックスポインターyは、S-boxにおける複数のデータを変数とする関数によって生成され、更新変数mix32は要素交換アルゴリズム(element swap algorithm)の中で生成され、更新される。インデックスポインターy及び更新変数mix32は、キーストリーム生成アルゴリズムおいてキーストリームを生成するために使用される。
【００２２】
キーストリーム生成アルゴリズムでは、動態S-box更新アルゴリズム(dynamic S-box updating algorithm)は、インデックスポインターｘとンデックスポインターｙと更新変数mix32に基づき、動態S-boxの中にあるすべての要素を一つずつ更新する。キーストリーム生成アルゴリズムは、２ワード(8バイト)のキーストリームの生成という処理を繰り返し行い、各処理毎に異なるインデックスポインターxとインデックスポインターyと更新変数mix32を使用する。即ち、キーストリーム生成アルゴリズムでは、インデックスポインターxとインデックスポインターyと更新変数mix32は、２ワード(8バイト)のキーストリームの生成という１ループのキーストリーム生成において一度だけ使用され、２ワード(8バイト)のキーストリームの生成毎に更新される。そのループを繰り返して２ワード(8バイト)ずつ生成することにより、暗号化対象の平文又は複合化対象の暗号文の長さだけのキーストリームが生成される。それら各ループ毎にインデックスポインターxとインデックスポインターyと更新変数mix32は更新される。
【００２３】
その後、暗号化では、暗号化用の平文とキーストリームの間で排他的論理和演算（exclusive OR operation）が実行され、暗号文が生成される。他方、復号化では、復号化用の暗号文とキーストリームの間で排他的論理和演算が実行され、平文が生成される。
【００２４】
[改良]
本発明「PI」は改善されたストリーム暗号である。この発明は、過去のストリーム暗号とは相違し、要素交換のために二つの異なるアルゴリズム(different algorithms)を使用する。この発明において、動態S-boxの初期の値(initial values)としてパイ・データが使用される。LSBS(Least significant bits) 依存左回転(LSBS-dependent left rotations)は変数の更新のために使用される。要素交換アルゴリズム(swapping elements algorithms )は、キースケジュールアルゴリズム(key schedule algorithm)中の動態S-boxのために使用される。要素更新アルゴリズム(updating elements algorithms)は、キーストリーム生成アルゴリズム中の動態S-box のために使用される。本発明では、動態S-boxとインデックスポインターx(index pointer x)とインデックスポインターy(index pointer y)とを結合して、軽いメモリ・スペース(light memory space)特性と、高いセキュリティとを特色とした巨大な内部状態(a huge internal state)のあるストリーム暗号が作成される。この発明の動態S-boxにおける要素の更新(updating elements)は、キーストリーム生成アルゴリズム(Keystream Generation Algorithm)による高い乱数度(randomness)の特性を備えたキーストリームの生成を可能にしている。
【００２５】
[1] 第１の実施の形態による暗号化プロセス
1) 暗号化プロセスの流れ図
図１は、本発明の第１の実施の形態による暗号化プロセスを示す流れ図であり、図２はこの第１の実施の形態による復号化プロセスを示す流れ図である。図１において、１は動態S-box （図では、DMと簡略表記されている。）の初期化、２はキー入力、３は動態S-boxにおける要素交換、４は要素交換３より得られた動態S-boxの最終配列(final permutation)の一時記憶、５はインデックスポンターｙ及び更新変数Mix32の取得、６はキーストリーム生成、７は平文入力、８は暗号化、９は暗号出力、1000はパイ・データ、2000は秘密キー、101は初期化された動態S-box 、102は秘密キー、103は要素交換された動態S-box、104は要素交換３より得られた動態S-boxの最終配列、105はインデックスポンターｙ及び更新変数Mix32、106はキーストリーム、107は平文、108は暗号文である。また、図２において、507は暗号文入力、509は平文出力、5007は暗号文、5008は平文である。平文入力７に替えて暗号文入力507を行うだけで、暗号文の復号化処理が平文の暗号化処理と同じプロセスで行われることは周知であるから、以下では必要の都度に図１を参照して、本発明の第１の実施の形態を説明する。
【００２６】
2) キースケジュールアルゴリズムとキー生成アルゴリズム
図１における符号１−５で示すプロセスはキースケジュールアルゴリズムにより実行され、符号６−８で示すプロセスはキー生成アルゴリズムにより実行される。
【００２７】
3) 動態S-box、インデックスポインターy、更新変数mix32等の変数
キースケジュールアルゴリズムは、256*32ビットサイズの動態S-boxと、32ビットサイズのインデックスポインターyと、更新変数mix32と、変数index1と、変数index2と、１つのカウンタ（counter）とを使用する。
【００２８】
4)動態S-boxの初期化
動態S-box (variable array)は、各々32のビット長を持つ256ワードのパイ・データで初期化される。256ワードのパイ・データは、無限数πの内の一部のデータであり、πを構成する一連の数字における連続する部分を抽出したものでも、或いはπを構成する一連の数字における飛び飛びの部分を選択したものでも差し支えない。
【００２９】
32ビットサイズのインデックスポインターyと32ビットサイズの更新変数mix32もキースケジュールアルゴリズムの中で初期化され更新される。キースケジュールアルゴリズムへの入力は、256ワードのパイ・データ(256-words pi data)とユーザから供給されたLバイト(1≦L≦256)のキーである。キースケジュールアルゴリズム(Key Schedule Algorithm)の出力は、256のパイ・データの配列 (a permutation of 256 pi data)とインデックスポインターyと更新変数mix32である。キーの長さは、ユーザから提供される秘密のキー(private key) のバイトの数であり、1から256までの範囲である。安全性を考慮し、キーの長さは少なくとも8バイト又はそれ以上が推薦される。
【００３０】
[2] キーに基づく動態S-boxの要素交換
キースケジュールアルゴリズム(Key Schedule Algorithm)は、ユーザが作成したキーデータ(key data)を入力として受け入れる。入力キーのバイト長はL-バイト(1≦L≦256)である。動態S-boxでは、初期化プロセスの後に、オリジナルのパイ・データの交換(permutation of original pi data)が始まり、動態S-boxは連続的な交換プロセスに入る。この交換プロセスにより、動態S-boxにおける256の要素の配列は未知のキーに依存した配列(KEY-dependent permutation)となる。即ち、動態S-boxへのただ一つの作用(action)は、パイ・データ中の二つの値(value)を秘密のキーに基づいて交換することである。交換アルゴリズム(swapping algorithm)の節(section)は、異なる2つのアルゴリズムから成っている。動態S-boxでは、1つのアルゴリズム(algorithm)は第1の要素を交換するために使用され、もう一つのアルゴリズム(algorithm)は残りの255の要素を255回交換するために使用される。総計256回の要素交換は、動態S-boxの中の各要素を少なくとも一度交換し、高いセキュリティを保証する。
【００３１】
[3] 交換アルゴリズム（Swapping Algorithms）
1) 交換アルゴリズム1
交換アルゴリズム1(Swapping Algorithms１)は、次の式(1)で示される。また、図３は、交換アルゴリズム1によるプロセスを示す図である。
index2= (KEY[0]+KEY[KEYLENGTH-1]+KEYLENGTH)mod256   (1)
swap (DM[0], DM[index2])
上に示す方程式(1)は、動態S-boxにおける第1要素の交換を最初に行うときだけに利用される。この式(1)で示すように、その第1要素の交換プロセスは、キーの最初のバイト(first-byte key)とキーの最後のバイト (last-byte key)とキーの長さをともに加え、それらの加法よる和のmodulo 256によることで、和の剰余を得て、剰余を変数index2とする。動態S-boxの中では、第1の要素がアドレスポインターindex2 (index2<256)に指定された別の要素に交換される。このindex2は、第1のバイトのキー(first-byte key)、最後のバイトのキー(last-byte key)とキーの長さ(KEYLENGTH)によって決まる値である。
【００３２】
2) 交換アルゴリズム2
交換アルゴリズム2(Swapping Algorithm 2)は、次の式(2)で示される。また、図４は、交換アルゴリズム２によるプロセスを示す図である。
index1 =1         (2)
for counter from 1 to 255 
if (LSB(index2)= 1) then  index2 = index2 +1
index2 = ((index2 + KEY[ index1] + DM[counter] ) mod 232 
swap(DM[counter], DM[fix(index2)]) 
LSBS= mix32 mod 32
mix32 = ROTL32(mix32, LSBS ) 
mix32 = (mix32 + index2) mod 232 
index1 = (index1 + 1) mod KEYLEGNTH 
LSB(x)がxの最下位ビット(least significant bit)であると定義され、LSBSがLSBS= mix32 mod 32 (更新変数mix32のleast significant bits ) であると定義され、またfix (x)は交換アルゴリズム2（Swapping Algorithm 2 )中のfix(x) = x ∩255 (xのleast significant byte)であると定義される。ROTLは循環左シフト(circular left shift) であり、ROTL32 (mix32, LSBS)に関しては後に詳しく説明される。上に述べた交換アルゴリズム2（swapping algorithm 2）は、更新変数mix32（updating variable mix32）のアルゴリズム（algorithm）を含んでいる。更新変数mix32アルゴリズムも後に式(3)により詳しく説明される。交換アルゴリズム2（swapping algorithm 2）は、動態S-boxの中の残りの255の要素交換（rest 255 elements swappings）を受け持ち、それら255の要素の全ての交換を行う。交換アルゴリズム2は、動態S-boxの中で第2の要素から要素交換（element exchanges）を始める。第2の要素は、上記式(2)に示された交換アルゴリズム2に示すように、index2のleast significant byteに表示された値に基づき、動態S-boxの中の別の要素と交換される。他の254の要素交換（elements swapping ）のプロセスも第2の要素のスワッププロセス（second element swapping process）と同様である。スワップアルゴリズム２による255の要素の全てを交換するプロセスは、図4に示されている。
if (LSB(index2)= 1) then index2 = index2 +1
index2 = (index2 + KEY[ index1] + DM[ counter] ) mod 232           (2.1)
上記式(2.1)は、前記式(2)における一部の方程式を示す。index2が、32-ビット長word（32-bit length word）のキーの関数であることが、式(2.1)で表されている。
【００３３】
[4] キーストリーム生成アルゴリズム
キーストリーム生成アルゴリズムでは、更新変数mix32がインデックスポインターy（index-pointer y）の値を更新するために使用される。更新変数mix32は、0x54655307の値で初期化され、次に、キースケジュールアルゴリズム(Key Schedule Algorithm)の中のLSBS 依存左回転(LSBS-depend left rotation)を中心に255回更新される。更新変数mix32の初期値としては、0x54655307以外の値でも差し支えないが、安全性確保のために、乱数が選ばれる。更新変数mix32は、LSBS 依存左回転により、mix32のleast significant bitsによって与えられた量だけ左回転される。１ワード(word)が32ビットでなるとき、そのleast significant bitsは(32-1)又はそれ以下のビット数である。交換アルゴリズム1（swapping Algorithm 1）における更新変数mix32は、mix32= (mix32+index2) mod 232として生成される。更新変数mix32は、キースケジュールアルゴリズム(Key Schedule Algorithm)の中で255回更新される更新変数なので、その内容を知られることはない。
【００３４】
LSBS 依存回転(LSBS-dependent rotations)の意味を明確にするために、一般的な回転の意味を次のａ項およびｂ項で一層具体的に説明する。
【００３５】
ａ) xが32ビットのワード（32-bit word）、そしてnが0 < n < 32の範囲である整数の場合の左回転(rotate left, circular left shift)の演算( operation) ROTL32(x, n) は
ROTL32(x, n) = (x≪ n) ∪(x≫(32-n))
として定義される。したがって、ROTL32(x、n)は、循環右シフト(circular right shift) ROTR32(x, 32-n)と同意義であり、ｎビット位置の左向き循環回転(circular rotations to the left for n-bit positions)を意味する。
【００３６】
ｂ) xが32ビットのword（32-bit word）、そしてnが0 < n < 32の範囲である整数の場合の右回転(rotate to the right, circular right shift)の演算ROTR32(x, n)は
ROTR32(x, n) = (x≫ n) ∪(x≪(32-n))
として定義される。したがって、ROTR32(x、n)は、循環左シフト(circular left shift) ROTL32(x, 32-n)と同意義であり、ｎビット位置の右向き循環回転(circular rotations to the right for n-bit positions)を意味する。上に説明され記述されたように、「>>」は右シフト演算(right-shift operation)を意味する。そして、x>>nは、ワード(word) xの最右端のnビット（the rightmost n bits of the word x）を廃棄し、次にｎ個のゼロを左側に付加すること（padding the result with n zeroes on the left）により得られる。「<<」は左シフト演算(left-shift operation)を意味する。そして、x << nは、ワード(word) xの最左端のnビット（the left-most n bits of the word x）を廃棄し、次にｎ個のゼロを右側に付加すること（padding the result with n zeroes on the right）により得られる。ここまでの[3] 及び[4]の欄に記述したプロセスは、256回繰り返される。この256回の処理の後に、動態S-boxの中の各要素は、少なくとも一度交換される。かくして、ユーザによって提供される秘密キー（secrete key）に基づいた、動態S-boxの中のすべての要素の並べ換え（permutation）は、ここに最終的に得られる。
【００３７】
[5] インデックスポインターy初期値生成プロセス
図5は、インデックスポインターy初期値生成プロセスを示す図である。 前期[4]欄で述べたプロセスを終えた後に、図5のインデックスポインターy初期値生成プロセスにおいて、キースケジュールアルゴリズムに予め設定されている所定値の353422072が図5における入力のyとして与えられる。インデックスポインターy初期値生成プロセスでは、その所定のy＝353422072に基づく次式により、インデックスポインターyが、
y=VM2(353422072)
として与えられる。所定値yとしては、353422072以外の値でも差し支えないが、安全性確保のために、乱数が選ばれる。この方程式中のVM2はインデックスポインターyを生成する関数である。VM2は、最下位バイト(least significant byte)からスタートして32ビットワードの353422072を4バイト（four bytes）に分ける分割の処理を行い、この分割で得られた4バイトの値（four bytes values）を夫々アドレスとして扱い、動態S-boxにおけるこれら４つのアドレスから32ビットのワード（four 32-bit words）を夫々取得し、ここまでのプロセスの後に、4つの32ビットのワード（four 32-bit words）について3つの排他的論理和演算を実行し、インデックスポインターyを生成する。この方程式y= VM2 (353422072) におけるVM2は次の式(3)ように定義される。
VM2(x) = DM[fix(x)] XOR DM[fix(x>>8)] XOR DM[fix(x>>16)] XOR[fix(x>>24)]     (3)
前記[4]の欄で説明した更新変数mix32と同様に、インデックスポインターyも決して知られることのない値である。何故ならば、動態S-boxの並べ換え（permutation）は、個人の秘密キーに基づいた256の要素交換をすべて完成した後にしか知られないからです。
【００３８】
この図５の出力のインデックスポインターyは、暗号化対象の平文の全文を暗号化するために１回でだけ生成され、図６に示すキーストリーム生成アルゴリズムの入力として利用される。
【００３９】
他方、図６のキーストリーム生成アルゴリズムでは、図５のプロセスで生成されたインデックスポインターyを最初の入力とし、後述する式(4)によりそのインデックスポインターyを更新し、２ワード(8バイト)のキーストリームの生成という１ループのキーストリーム生成プロセスにおいて更新されたインデックスポインターyを一度だけ使用し、続く２ワード(8バイト)のキーストリームの生成という１ループのキーストリーム生成プロセス毎にインデックスポインターyを更新する。キーストリーム生成アルゴリズムにおけるインデックスポインターyの更新については後ろの欄[8]において詳しく説明する。
【００４０】
[6]キーストリーム生成アルゴリズム
図6は、キーストリーム生成アルゴリズムを示す図である。 RC4と異なり、本発明「PI」は、図6に示すように、キーストリーム生成アルゴリズム中のキーストリーム生成のプロセス（processes of key keystream generation）の間中には動態S-boxにおけるどの値も交換しない。代わりに、本発明「PI」では、動態S-boxにおけるすべての要素の中から不規則に選んだ(randomly chosen)要素の値を加えることにより得られた加算値を使用して、動態S-boxの中の当初の値を更新し（update）又は取り替える（replace）。したがって、動態S-boxの中の要素範囲は最大限度に拡張される。
【００４１】
図6のキーストリーム生成アルゴリズムは、２ワード(8バイト)のキーストリームの生成という１ループのキーストリーム生成プロセスを実行するためのアルゴリズムを示す。そのループを繰り返して２ワード(8バイト)ずつキーストリームを生成することにより、暗号化対象の平文または複合化対象の暗号文の全体の長さだけのキーストリームが生成される。平文全体の長さだけのキーストリームとその平文との排他的論理和演算により、平文全体の暗号化が達成される。暗号文全体の長さだけのキーストリームとその暗号文全体との排他的論理和演算により、暗号文全体の復号化が達成される。
【００４２】
[7] インデックスポインターx
インデックスポインターx は、図6にx=DM(i)と記載されている、キーストリーム生成アルゴリズムにおいて生成される。ここでインデックス変数iの範囲は0〜255である。この方程式によるxも、決して知られることのないインデックスポインターである。何故ならば、動態S-boxの要素の配列（permutations of dynamic S-box's elements）は、前記[1] −[5]の欄で説明したキースケジュールアルゴリズム(Key Schedule Algorithm)によって変更されている（rearranged）からである。インデックスポインターxも、２ワード(8バイト)のキーストリームの生成という１ループのキーストリーム生成プロセスにおいて一度だけ使用され、その１ループのキーストリーム生成プロセス毎に更新され、当該ループのキーストリーム生成プロセスにおける次のステップで別のインデックスポインターyを更新するために使用される。
【００４３】
[8] インデックスポインターyの更新
インデックスポインターyを更新する過程は、次の式(4)で示される。
y=DM[i] = (DM[fix(x)]+y+mix32) mod 232                  (4)
方程式(4)の演算は、インデックスポインターxの最下位バイト(Least significant byte)をアドレスとして指定した動態S-boxの要素DM[fix(x)]とインデックスポインターyと更新変数mix32との加算をし、その加算の結果（added result）のmodulo 232により、新しいインデックスポインターyを得る。式(4)の演算で得られたインデックスポインターyは、次のステップでキーストリームを生成するために使用される。その間に、動態S-boxの中のi番目(ith)の要素の値DM[i]は、新しく生成されたインデックスポインターyと取り替えられる。このプロセスで、DM[fix(x)]と yとmix32という3つの値すべては、決して知られることのない値であり、また２ワード(8バイト)のキーストリームの生成という１ループのキーストリーム生成処理において一度だけ使用され、２ワード(8バイト)のキーストリームの生成毎に更新される。
【００４４】
[9] インデックスポインターxの再更新
前記[8]欄で記述したように、式(4)におけるインデックスポインターxは一度だけ使用される。したがって、インデックスポインターxは、キーストリーム生成アルゴリズムにおける次のステップのキーストリームを生成するために、更新を要する。インデックスポインターxを更新する過程は、下の式(5)の中に示されます。
x=VM3(x)                     (5)
VM3(x)の定義：
VM3(x) = (DM[fix(x) XOR fix(x>>16)]) XOR (DM[fix(x>>8) XOR fix(x>>24)])
このVM3は、再更新されたインデックスポインターxを得る関数である。VM3では、最下位バイト(least significant byte)からスタートしてインデックスポインターxを4バイトに分割し、各バイトを最下位バイトから順にそれぞれ第１バイト(by1)、第２バイト(by2)、第3バイト(by3)及び第4バイト(by4)と命名することにすると、by1とby3の間の排他的論理和演算の結果およびby2とby4の間の排他的論理和演算の結果をそれぞれ動態S-boxのアドレスとし、動態S-boxにおける両アドレスの各データ（32ビットの1ワード）を取得し、取得した２つのワードの間の排他的論理和演算を行い、この排他的論理和演算の結果をもって再更新インデックスポインターxとする。再更新インデックスポインターxは、次のステップでキーストリーム生成に使用される。
【００４５】
[10] キーストリームの生成
2ワード（１ワード：32ビット）のキーストリームは、キーストリーム生成アルゴリズムによって生成される。その生成プロセスは、下記式(6.1)及び(6.2)で示される。
K1= (FVMA(x) + FVMA(y)) mod 232                                       (6.1)
K2= (FVMB(x) + FVMB(y)) mod 232                                       (6.2)
KS[0]=DM[fix(K1) ]                                                      (6.3)
KS[1]=DM[fix(K2) ]                                                      (6.4)
関数FVMA の定義：
FVMA(x) = DM[fix(x) XOR fix(x >> 24)] 
関数FVMB の定義：
FVMB(x) = DM[fix(x >> 8) XOR fix(x >> 16)]
上に記述されるように、インデックスポインターx及びインデックスポインターy は、関数FVMA，FVMBにより、4バイトにそれぞれ分割される。FVMA(x)と呼ばれる32ビット wordの値（32-bit word value）を得るために、インデックスポインターxの第1バイトとインデックスポインターxの第4バイトの間の排他的論理和演算の結果は、動態S-boxのアドレスとして扱われる。同様に、FVMA(y)と呼ばれる別の32ビット wordの値（32-bit word value）を得るために、インデックスポインターyの第1バイトとインデックスポインターy第4バイトの間の排他的論理和演算の結果は、動態S-boxのアドレスとして扱われる。次に、FVMA(x)とFVMA(y)とは加算され、その加算の結果（added result）は式(6.1)に (FVMA(x) + FVMA(y)) modulo 232と示されているように、modulo mod 232され、K1が生成される。
【００４６】
関数FVMBについては、FVMB(x)と呼ばれる32ビット word値（32-bit word value）を得るために、インデックスポインターxの第2バイトとインデックスポインターxの第3バイトの間の排他的論理和演算の結果が、動態S-boxのアドレスとして扱われる。同様に、FVMB(y)と呼ばれる別の32ビット word値（32-bit word value）を得るために、インデックスポインターyの第2バイトとインデックスポインターyの第3バイトの間の排他的論理和演算の結果は、動態S-boxのアドレスとして扱われる。次に、FVMB(x)とFVMB(y)とは加算され、式(6.2)に (FVMB(x) + FVMB(y)]) modulo 232と示されるように、modulo mod 232され、K2が生成される。
【００４７】
そして最後に、K1の最下位バイトが動態S-boxのアドレスとして扱われ、動態S-boxにおけるそのアドレスの値がキーストリームの第１のワードKS(0)として読み出される。同様に、K2の最下位バイトが動態S-boxのアドレスとして扱われ、動態S-boxにおけるそのアドレスの値がキーストリームの第２のワードKS(1)として読み出される。かくして、第１及び第２ワードで構成された２ワード(8バイト)のキーストリームが生成された。図６のキーストリーム生成アルゴリズムは、キーストリーム生成プロセスの１ループを示し、この１ループにより２ワード(8バイト)のキーストリームが生成されることを以上に説明した。
【００４８】
[11] 更新変数mix32
更新変数mix32は一度だけ使用することができるので、使用された直後に更新されなければならない。更新変数mix32を更新する方法は方程式(7)の中で説明される。
LSBS = mix32mod 32                                       (7)
temp = ROTL32(mix32 ,LSBS) 
mix32 = (temp + VM3(mix32)) mod 232
式(7)におけるROTL32(mix32、LSBS)は、更新変数mix32 のLSBS 依存左回転(LSBS-depend left rotation)である。それは更新変数mix32の最下位バイト(least significant bites (LSBS)) の値だけの左回転シフト(left rotated shift)である。したがって、任意の32ビット wordのための回転シフト（rotation shift）数は、(32-1)より少ないか又は同等である。関数VM3は、前記式(5)におけるものと同じ関数である。式(7)及び上述のことから分かるように、更新変数mix32の内容が知られることはない。
【００４９】
[12] キーストリーム生成の繰返し
要求された長さのキーストリームを得るために、[7]欄から[11]欄までの範囲のプロセスを必要は回数だけ繰り返す。要求された長さのキーストリームとは、暗号化対象の平文の長さを少なくとも有するキーストリームである。[7]欄から[11]欄までのプロセスが256回繰り返された後には、動態S-boxの中のすべての要素は完全に更新されている。上に記述された各プロセスにおいて、インデックスポインターxとインデックスポインターyと更新変数mix32が、一度使用された直後にそれら自身の更新アルゴリズムによって更新される。
【００５０】
図２は復号化のプロセスを示す図である。暗号化のプロセスを示す図１との対比で分かるように、図２の復号化のプロセスは暗号化のプロセスと実質的に全く同じである。暗号化プロセスにおける平文に替えて復号化のプロセスでは暗号文が入力され、他方暗号化プロセスにおける暗号文に替えて復号化のプロセスでは平文が入力される。したがって、前記[1]欄から[12]欄のここまでに記述された暗号化アルゴリズム(Encryption Algorithm)によって生成された暗号文を解読する復号化アルゴリズム(Decryption Algorithm)の構成(configuration)は、前記[1]欄から[12]欄のここまでに記述された暗号化アルゴリズムの構成と同じである。ある秘密キーを使用してその暗号化アルゴリズムで生成された暗号文は、その暗号化アルゴリズム同じ構成の復号化アルゴリズムに同じ秘密キーを適用して、解読される。
【００５１】
以上の[1]欄から[12]欄の記載により、本発明「PI」の基本的な実施の形態である第１の実施の形態を説明した。
【００５２】
図８は、全ての値が”0”である平文のダンプリストを示すテーブルである。図９は、暗号化キーを”Key”とし、本発明「PI」の第１の実施の形態（初期化ベクトルIV無し）により図８の平文を暗号化して得た暗号文のダンプリストを示すテーブルである。また図１０は、  暗号化キーを”Secret”とし、本発明「PI」の第１の実施の形態（初期化ベクトルIV無し）により図８の平文を暗号化して得た暗号文のダンプリストを示すテーブルである。図９及び図１０を参照して明らかなように、全てのデータが完全に同じである図８の平文であっても、本発明「PI」の第１の実施の形態により暗号化すれば、完全に乱数化された暗号文を得ることができる。
【００５３】
[13] 第２の実施の形態
現用の対称暗号（ストリーム 暗号）は、同じキーは必ず同じキーストリームを生成する、という重大な問題を常に抱えている。つまり、ストリーム 暗号の中で同じキーを繰り返して使用することは、ワンタイムパッド (one time pad, OTP)を再度使用するのと同じく、暗号の安全性を損う。
【００５４】
そのような問題を解決するために、初期化ベクトル(Initialization Vectors, IV）の概念（concept of initialization vectors）は不可欠である。本発明「PI」の第２の実施の形態は、基本的な実施の形態である前述の第１の実施の形態に初期化ベクトルの概念を加えることにより、そのような重大な問題を解決できるようにしたものである。初期化ベクトル(IV)は、暗号の出力中の乱数性を増加させるために使用される乱数の値である。IVは不規則で(random)でユニークな値であるので、第２の実施の形態では、暗号化毎に同じキーが使用されたとしても、ストリーム 暗号の出力は暗号化の都度に相違する。キーの変更が高価なプロセスである場合、そのような初期化ベクトルの概念の適用は非常に有用である。初期化ベクトルIVを備えた本発明「PI」の第２の実施の形態は、基本的実施の形態(prototype)である第１の実施の形態の変形である。第２の実施の形態はただIV(初期化ベクトル) の入力部を持っているのに対し、第１の実施の形態はIV入力部を持たない点で両者は相違する。すなわち、第２の実施の形態は平文と個人のキーとIVという3つのデータの入力部を持っているのに対し、第１の実施の形態は平文と個人のキーという２つのデータの入力部だけを備えている。
【００５５】
両実施の形態の違いについて、さらに以下で説明する。
1)この発明の第2の実施の形態は基本的な実施の形態である第１の実施の形態にIVを増したものである。
【００５６】
第2の実施の形態におけるIVのサイズは128ビット(16バイト)である。その128ビット(16バイト)は、IVの第1のバイトで始まる4つのワード (4*32)に分割される。キースケジュールアルゴリズム(Key Schedule Algorithm)では、第1のワード(word)は更新変数mix32の初期の値として扱われる。第2のワード(word)は、インデックスポインターxの初期の値として扱われる。第3のワード(word)はインデックスポインターyの初期の値として扱われる。第4のワード(word)は変数index2の初期の値として扱われる。上に記述されたすべての４つのワード(words)は、キースケジュールアルゴリズム(Key Schedule Algorithm)において初期値として使用されるだけである。上に言及されたように、動態S-boxの中の要素交換が完成した後、インデックスポインターxとyは以下に記述された関数に基づいて、生成されます。
x = VM2(IV2)             (8)
y = VM2(IV3)
IV2はIVの第2のwordであると定義され、IV3はIVの第3のwordであると定義される。関数VM2の定義は、前記[5]欄に記述したVM2定義と同じである。このようにして、キーストリーム生成アルゴリズム用のインデックスポインターx及びyが得られる。インデックスポインターx及びyは一度だけ使用され、それらの値が知られることはない。
【００５７】
2)本発明「PI」の 第２の実施の形態と第1の実施の形態とを比べると、キーストリーム生成アルゴリズムにおけるインデックスポインターxの生成に関し、次の相違がある。
x= x + DM(i)-------- 第２の実施の形態 （初期化ベクトルIV付）               (9)
x = DM(i)-------------第１の実施の形態 （初期化ベクトルIV無し）
以上に第１及び第２の実施の形態間の相違を説明した。図１１は、暗号化キーを” Key”とし、本発明「PI」の第２の実施の形態（初期化ベクトルIV付き）により図８の平文を暗号化して得た暗号文のダンプリストを示すテーブルである。また図１２は、暗号化キーを” Secret”とし、本発明「PI」の第２の実施の形態（初期化ベクトルIV付き）により図８の平文を暗号化して得た暗号文のダンプリストを示すテーブルである。図１１及び図１２を参照して明らかなように、全てのデータが完全に同じである図８の平文であっても、本発明「PI」の第２の実施の形態により暗号化すれば、完全に乱数化された暗号文を得ることができる。
【００５８】
[14] 第3の実施の形態
本発明「PI」の第3の実施の形態は、基本的な実施の形態である第１の実施の形態に、認証と初期化ベクトルIVを追加したものである。データ送信プロセスの間にデータを安全に送信すること、そして送信者が送信したデータと受信者が受信したデータとが同一であることが、最も一般的な実際生活のセキュリティ問題である。近代社会では、私たちの周りの多くの部分がセキュリティ保護を要求する。例えば、インターネットは、暗号化および認証の両方を要求する例の1つである。初期化ベクトルIVおよび認証の両方の機能を備える本発明「PI」の第3の実施の形態は、インターネットおよび携帯電話のような電子式送信装置における暗号化および認証の必要条件を満たすことを目的している。
【００５９】
この本第3の実施の形態は、暗号化および認証の両方の有効な組み合わせをインプリメントする柔軟な組み合わせ方式（combination methodology）を提供する。この第3の実施の形態の「PI」発明は、ストリーム 暗号 Phelixの中で利用された平文の認証ではなく、暗号文の認証を使用する。基本的な実施の形態に初期化ベクトルIVを加えた第2の実施の形態は、平文を暗号化するために使われ、そして暗号文のMAC(message authentication code, メッセージ認証コード)はHMAC algorithmのようなMAC algorithmによって生成される。その後、暗号文およびMACの両方は受信者へ送られる。受信者は、送信者が使用したものと同じアルゴリズムの使用により、最初に暗号文をチェックする。MACが異なる場合、暗号文は解読する必要なしで削除されます。そのような容易で明瞭で、簡潔な方法の使用によって、上に記述された問題は容易に回避することができる。MAC(メッセージ認証コード)は、データの安全性(integrity)およびメッセージの信頼性(authenticity)の両方を同時に検証する（verify）ために使用される。SHAファミリーのような反復する暗号ハッシュ関数(cryptographic hash function)はMACの計算の中で使用される。MACの暗号強度は、根本的なハッシュ関数の暗号強度、キーのサイズと質、およびハッシュ関数出力のビット長さのサイズに依存する。
【００６０】
以上に実施の形態を挙げ、具体的に説明したように、LFSRs方法を使わないで、パイ・データと動態S-boxを利用する本願発明は、安全性に関する懸念を回避することができると同時に、ワード(word)とバイトの操作(byte manipulations) だけを使用することにより、ソフトウェア及びハードウェア双方の実現をはるかに容易にする。前記第１の実施の形態で使用されるメモリ空間は、主として動態S-box 用のDM[0]からDM[255]まで及ぶ256のwords(256*32ビット(bits))である。その最大256バイトのメモリ空間はKEY[0] からKEY[255]までの秘密キーと、整数インデックスポインターxと、整数インデックスポインターyと、更新変数mix32と、少数の整数変数とに使用される。１ワードに関するモジュロ256 (modulus 256 on a word) は”bitwise and” with 255 を使って行なうことができ、またバイトの加算値(bytes addition)に関するモジュロ256(modulus 256 on bytes addition)はバイトの加算値のオーバーフロー(overflow)を無視するというバイトの単純な加法によって行なうことができる。
【００６１】
本発明では、動態S-box並びにインデックスポインターx及びyを組み合わせることによって、実際の動態S-boxを得ることができる。動態S-boxには、0 から 232 -1までの範囲の232個の 32ビットの要素があると見え、また、すべての要素の配列（permutations）はいつも変わっている。本発明「PI」は、ソフトウェアで、若しくはハードウェアで、又は両方の組み合わせで、インプリメントされる（implemented）ことが可能である。ここに記述された暗号化および復号化アルゴリズムは、例示であり、本発明は、前述の特定の実施例、又は実施例の組み合わせに制限されない。例えば、動態S-boxの具体例で挙げた32ビットwordsは32*256ビットのサイズに相当するが、本発明「PI」では、必要に応じて、64* 256 bitsのサイズに相当するように、動態S-boxを64ビットwordsに拡張することは容易にできる。言いかえれば、この発明は、64ビットのシステム・アーキテクチャーによって提示された能力(performance)の有利性を完全に利用することができるのであって、動態S-boxの64*256ビットのサイズに対応する64ビットwordのサイズで構成できる。更に言えば、より大きな内部状態を備えた64ビットワードでのこの発明の実施は、高いセキュリティを保証し、処理速度をはるかに高速にし、またより多くの他の長所を提供する。私たちは、『別々に記述されたアルゴリズムに基づくことだけによって、本発明のストリーム暗号「PI」は、RC4と同等の軽さを持つだけでなく、RC4より少なくとも2又は3倍速い暗号である。』と宣言できる。
【００６２】
本願発明は、具体的に詳しく説明した前述の実施の形態に制限されるものではなく、特許請求の範囲に記載した範囲において各種の変形が可能であることを、ここに改めて確認する。
【図面の簡単な説明】
【００６３】
【図１】本発明の第１の実施の形態による暗号化プロセスを示す流れ図である。
【図２】第１の実施の形態による復号化プロセスを示す流れ図である。
【図３】交換アルゴリズム1による交換プロセスを示す図である。
【図４】交換アルゴリズム２による交換プロセスを示す図である。
【図５】インデックスポインターy初期値生成プロセスを示す図である。
【図６】キーストリーム生成アルゴリズムを示す図である。
【図７】図１乃至図６における記号を説明する図である。
【図８】全ての値が”0”である平文のダンプリストを示すテーブルである。
【図９】暗号化キーを”Key”とし、本発明「PI」の第１の実施の形態（初期化ベクトルIV無し）により図８の平文を暗号化して得た暗号文のダンプリストを示すテーブルである。
【図１０】暗号化キーを”Secret”とし、本発明「PI」の第１の実施の形態（初期化ベクトルIV無し）により図８の平文を暗号化して得た暗号文のダンプリストを示すテーブルである。
【図１１】暗号化キーを” Key”とし、本発明「PI」の第２の実施の形態（初期化ベクトルIV付き）により図８の平文を暗号化して得た暗号文のダンプリストを示すテーブルである。
【図１２】暗号化キーを” Secret”とし、本発明「PI」の第２の実施の形態（初期化ベクトルIV付き）により図８の平文を暗号化して得た暗号文のダンプリストを示すテーブルである。
【符号の説明】
【００６４】
１    動態S-box（図では、DMと簡略表記）
２    キー入力
３    動態S-boxにおける要素交換
４    要素交換３より得られた動態S-boxの最終配列(final permutation)の一時記憶
５    インデックスポインターｙ及び更新変数Mix32の取得
６    キーストリーム生成
７    平文入力
８    暗号化
９    暗号出力
101    初期化された動態S-box
102    秘密キー
103    要素交換された動態S-box
104    要素交換３より得られた動態S-boxの最終配列
105    インデックスポインターｙ及び更新変数Mix32
106    キーストリーム
107    平文
108    暗号文
507    暗号文入力
509    平文出力
1000   パイ・データ
1000   秘密キー
5007   暗号文
5008   平文
【図１】
2008256817.tif 000003
【図２】
2008256817.tif 000004
【図３】
2008256817.tif 000005
【図４】
2008256817.tif 000006
【図５】
2008256817.tif 000007
【図６】
2008256817.tif 000008
【図７】
2008256817.tif 000009
【図８】
2008256817.tif 000010
【図９】
2008256817.tif 000011
【図１０】
2008256817.tif 000012
【図１１】
2008256817.tif 000013
【図１２】
2008256817.tif 000014