(57)【特許請求の範囲】
【請求項１】
動態Ｓ−ｂｏｘ（Ｄｙｎａｍｉｃ  Ｓ−ｂｏｘ）・動態フリップ（Ｄｙｎａｍｉｃ  ｆｌｉｐ）・動態シフト（Ｄｙｎａｍｉｃ  ｓｈｉｆｔ）・動態更新（Ｄｙｎａｍｉｃ  ｕｐｄａｔｅ）・動態循環シフト（Ｄｙｎａｍｉｃ  ｃｉｒｃｕｌａｒ  ｓｈｉｆｔ）といった全て動態的な概念を一貫に利用してキーに基づいたキーストリームを生成し、該キーストリームと平文とを排他的論理和演算により該平文を暗号化した暗号文を生成するキーストリーム暗号方法において、
円周率πを構成する無限数列における１又は複数の部分数列を選択してなる数列をパイ・データと称するとき、ｎ個（ｎは２以上の整数）の要素でなる動態Ｓ−ｂｏｘ（Ｄｙｎａｍｉｃ  Ｓ−ｂｏｘ）を該パイ・データで初期化する初期化プロセスと、
前記初期化ステップにより初期化された前記動態Ｓ−ｂｏｘにおける要素を、キーに依存する交換アルゴリズムにより、相互に交換する要素交換プロセスと、
動態循環シフト（Ｄｙｎａｍｉｃ  ｃｉｒｃｕｌａｒ  ｓｈｉｆｔ）と前記動態Ｓ−ｂｏｘにおける複数の要素よりインデックスポインターｙを生成するインデックスポインターｙ生成プロセスと、
動態循環シフトと前記動態Ｓ−ｂｏｘにおける複数の要素より更新変数Ｍｉｘ３２を生成する更新変数Ｍｉｘ３２生成プロセスと、
キーストリーム生成する前の準備として、キーストリームを生成せずにキーストリームアルゴリズムを２５６回実行するプロセスと、
前記動態Ｓ−ｂｏｘにおける１つの要素をインデックスポインターｘとして選択するインデックスポインターｘの選択プロセスと、
前記インデックスポインターｙ生成プロセスで生成したインデックスポインターｙ、前記更新変数Ｍｉｘ３２生成プロセスで生成した更新変数Ｍｉｘ３２及び前記インデックスポインターｘ選択プロセスで選択した前記インデックスポインターｘに基づき前記インデックスポインターｙ生成プロセスで生成したインデックスポインターｙを更新するインデックスポインターｙ更新プロセスと、
前記インデックスポインターｘの選択プロセスで選択した前記インデックスポインターｘを動態的にフリップ（Ｄｙｎａｍｉｃ  ｆｌｉｐ）することにより、インデックスポインターｘを動態的にフリップするインデックスポインターｘの動態フリッププロセスと、
前記インデックスポインターｙの更新プロセスで更新した前記インデックスポインターｙを動態的にフリップ（Ｄｙｎａｍｉｃ  ｆｌｉｐ）することにより、インデックスポインターｙを動態的にフリップするインデックスポインターｙの動態フリッププロセスと、
前記更新変数Ｍｉｘ３２の生成プロセスで生成した更新変数Ｍｉｘ３２に基づき動態循環シフト及び動態Ｓ−ｂｏｘにおける要素を加工することにより、更新変数Ｍｉｘ３２を更新する更新変数Ｍｉｘ３２更新プロセスと、
前記更新変数Ｍｉｘ３２更新プロセスで更新される前の更新変数ｍｉｘ３２の最上位バイト（Ｍｏｓｔ  Ｓｉｇｎｉｆｉｃａｎｔ  ｂｙｔｅ）が指定したアドレスの内容が前記更新変数Ｍｉｘ３２更新プロセスで更新した更新変数Ｍｉｘ３２の内容によって動態更新（Ｄｙｎａｍｉｃ  ｕｐｄａｔｅ）される更新変数Ｍｉｘ３２の動態更新プロセスと、
前記のインデックスポインターｘの動態フリッププロセスでフリップされた後のインデックスポインターｘと前記のインデックスポインターｙの動態フリッププロセスでフリップされた後のインデックスポインターｙに基づき排他的論理和演算をすることにより得た結果が指定した前記動態Ｓ−ｂｏｘのアドレスにある内容を取り出し、臨時変数Ｋ１とＫ２を生成する臨時変数生成プロセスにおいて、前記の動態的にフリップされた後のインデックスポインターｘとインデックスポインターｙの中から夫々任意の１バイトを選択し、２つのバイトを排他的論理和演算（ＸＯＲ）行った結果が動態Ｓ−ｂｏｘのアドレスとして、そのアドレスの内容を取り出し、臨時変数Ｋ１を生成する臨時変数生成プロセス及び前記の動態的にフリップされた後のインデックスポインターｘとインデックスポインターｙの中から先ほどに使われた１バイトと異なった１バイトを夫々からもう一度任意的に選び、２つのバイトを排他的論理和演算（ＸＯＲ）行った結果が動態Ｓ−ｂｏｘのもう１つのアドレスとして、そのアドレスの内容を取り出し、もう１つの臨時変数Ｋ２を生成する臨時変数生成プロセスと、
前記の臨時変数Ｋ１と臨時変数Ｋ２生成プロセスで生成された臨時変数Ｋ１と臨時変数Ｋ２に基づいて、動態シフト（Ｄｙｎａｍｉｃ  ｓｈｉｆｔ）とモジュロ算法（ｍｏｄｕｌｏ）の加工により夫々の臨時変数Ｋ１と臨時変数Ｋ２から任意的な８ビットが動態的に選択され、夫々は動態Ｓ−ｂｏｘのアドレスとし、夫々のアドレスにある内容を第１及び第２ワードとし、第１及び第２のワードを連接して２ワードのキーストリームを生成する
ことを特徴とするキーストリーム暗号方法。
【請求項２】
前記交換アルゴリズムは、２つの交換アルゴリズムから成り立ち、
交換アルゴリズム１では、前記動態Ｓ−ｂｏｘにおける第１番目の要素を他の要素と交換し、
交換アルゴリズム２では、前記動態Ｓ−ｂｏｘにおける残りの２５５個の要素を他の要素と交換する
ことを特徴とする請求項１に記載のキーストリーム暗号方法。
【請求項３】
初期化ベクトルＩＶ（１２８ビット）を複数のデータに分割し、更新変数Ｍｉｘ３２、インデックスポインターｘ、インデックスポインターｙ、そしてＩｎｄｅｘ２を夫々最初の初期化の初期値として扱う
ことを特徴とする請求項１乃至２に記載のキーストリーム暗号方法。
【請求項４】
請求項１乃至３に記載の方法により平文を暗号化して生成した暗号文に、暗号文のＭＡＣ（メッセージ認証コード）を付加することを特徴とする認証機能付きストリーム暗号方法。
【発明の詳細な説明】
【技術分野】
【０００１】  本発明は、動態概念「動態Ｓ−ｂｏｘ（Ｄｙｎａｍｉｃ  Ｓ−ｂｏｘ）・動態フリップ（Ｄｙｎａｍｉｃ  ｆｌｉｐ）・動態シフト（Ｄｙｎａｍｉｃ  ｓｈｉｆｔ）・動態更新（Ｄｙｎａｍｉｃ  ｕｐｄａｔｅ）・動態循環シフト（Ｄｙｎａｍｉｃ  ｃｉｒｃｕｌａｒ  ｓｈｉｆｔ）」を一貫に利用した対称暗号であるストリーム暗号・復号方法、及びにパイ・データ及び以上に書いてある全ての動態概念に基づいた暗号化・複合化の両方を実現する暗号算法・復号化算法に関する。
【背景技術】
【０００２】  現在使用されている多くのストリーム暗号は、リニアー・フィードバック・シフト・レジスター（ｌｉｎｅａｒ  ｆｅｅｄｂａｃｋ  ｓｈｉｆｔ  ｒｅｇｉｓｔｅｒｓ，ＬＦＳＲｓ）と呼ばれる方法に基づいている。ＬＦＳＲｓでは、ソフトウェアを利用した方法の効率は、ハードウェア利用した方法の効率より低い。ここで効率とは、処理速度の速さの少なさをいう。ＬＦＳＲｓによるストリーム暗号は、比較的に長い期間に亘って市場に存在し、そしてそれらのストリーム暗号のメカニズムが徹底的に完全に分析された。そこで、ＬＦＳＲｓによるストリーム暗号には安全性に関する懸念が通常はある。勿論、ＬＦＳＲｓであっても、巨大なメモリー空間を占有することにより、安全性を向上することは可能ではあるが、このようは方策では処理速度が遅くなり、所要メモリー空間が増大するので、非効率な暗号システムとなる。ＬＦＳＲｓについては、フリー百科事典『ウィキペディア（Ｗｉｋｉｐｅｄｉａ）」の“Ｌｉｎｅａｒ  ｆｅｅｄｂａｃｋ  ｓｈｉｆｔ  ｒｅｇｉｓｔｅｒ”なる項目（非特許文献１）に詳しい説明が掲載されている（ＵＲＬ「ｈｔｔｐ：／／ｅｎ．ｗｉｋｉｐｅｄｉａ．ｏｒｇ／ｗｉｋｉ／ＬＦＳＲ」）。【０００３】  また、現在に使われているＩＶ無しの対称暗号（ストリーム暗号）は、同じキーは必ず同じキーストリームを生成する、という重大な問題を常に抱えている。つまり、従来のストリーム暗号の中で同じキーを繰り返して使用することは、ワンタイムパット（ｏｎｅ  ｔｉｍｅ  ｐａｄ，ＯＴＰ）を再度使用するのと同じく、暗号の安全性を損なう。それとともに、現在の対称暗号が使用する暗号化技術と方法は古くて、第三者に分析・追跡されやすく、安全性能が心配される。【０００４】  また、Ｐｈｅｌｉｘｌは、Ｆｅｒｇｕｓｏｎ，Ｗｈｉｔｉｎｇ，Ｓｃｈｎｅｉｅｒ，Ｋｅｌｓｅｙ，Ｌｕｃｋｓ及びＫｏｈｎｏによって非特許文献２に公表され、Ｈｅｌｉｘによって提供されるＭＡＣ機能性で内蔵の高速のストリーム暗号がある。彼らは、「Ｐｈｅｌｉｘは、ストリーム暗号及びＭＡＣ機能性の結合であって、認証付暗号機能（ａｕｔｈｅｎｔｉｃａｔｅｄ  ｅｎｃｒｙｐｔｉｏｎ  ｆｕｎｃｔｉｏｎａｌｉｔｙ）を直接に提供する。」と述べられている。また、「キーストリームと平文を協働されることによって、Ｐｈｅｌｉｘは、コストの追加なしで認証機能を提供できる。」と述べられている。その内部を理解せず、Ｐｈｅｌｉｘ１の表面を単に見るだけ限りの場合は、そのようなステートメントは有効である。しかし、実際は、Ｐｈｅｌｉｘの認証機能性は代価無しとは言えない。キーストリームに平文を加えるには実際に時間をかかるからである。したがって、Ｐｈｅｌｉｘストリーム暗号は、追加コスト無しで認証機能性を提供することはできない。さらに、平文に依存するキーストリームは、セキュリティ攻撃に対しシステムを脆弱にし、それに第三者によるシステムの分析を容易にする。更に、Ｐｈｅｌｉｘは平文の認証を使用するので、送信中の保護を必要とするデータが実際の送信プロセスの中で変更されたかどうかは受信者が受信ファイルを解読した後という長いプロセスの後でしか知ることができない。したがって、Ｐｈｅｌｉｘの効率���当事者の主張より低い。【０００５】
【非特許文献１】フリー百科事典『ウィキペディア（Ｗｉｋｉｐｅｄｉａ）』の″Ｌｉｎｅａｒ  ｆｅｅｄ  ｂａｃｋ  ｓｈｉｆｔ  ｒｅｇｉｓｔｅｒ″なる項目（ＵＲＬ  「ｈｔｔｐ：／／ｅｎ．ｗｉｋｉｐｅｄｉａ．ｏｒｇ／ｗｉｋｉ／ＬＦＳＲ」）。
【非特許文献２】Ｎｉｅｌｓ  Ｆｅｒｇｕｓｏｎ，Ｄｏｕｇ  Ｗｈｉｔｉｎｇ，Ｂｒｕｃｅ  Ｓｃｈｎｅｉｅｒ，Ｊｏｈｎ  Ｋｅｌｓｅｙ，Ｓｔｅｆａｎ  Ｌｕｃｋｓ，Ｔａｄａｙｏｓｈｉ  Ｋｏｈｎｏ，Ｈｅｌｉｘ：ｆａｓｔ  ｅｎｃｒｙｐｔｉｏｎ  ａｎｄ  ａｎｔｈｅｎｔｉｆｉｃａｔｉｏｎ  ｉｎ  ａ  ｓｉｎｇｌｅ  ｃｒｙｐｔｏｇｒａｐｈｉｃ  ｐｒｉｍｉｔｉｖｅ，ｉｎ［７］（２００３），３３０｛３４６．ＵＲＬ：ｈｔｔｐ：／／ｗｗｗ．ｍａｃｆｅｒｇｕｓ．ｃｏｍ／ｈｅｌｉｘ／．｝
【発明の開示】
【発明が解決しようとする課題】
【０００６】  前述のように、従来から多く使用されているＬＦＳＲｓによるストリーム暗号は、ソフトウェアを利用した方法の効率がハードウェア利用した方法の効率より低く、比較的に長い期間に亘って市場に存在し、メカニズムが徹底的に完全に分析されたので、安全性に関する懸念が避けがたいし、安全性を向上するために大きなメモリー空間を使用すると、非効率な暗号システムとなる。【０００７】  また、現在のＩＶ無しの対称暗号（ストリーム暗号）は、同じキーは必ず同じキーストリームを生成するので、ストリーム暗号の中で同じキーを繰り返して使用することは、ワンタイムパット（ｏｎｅ  ｔｉｍｅ  ｐａｄ，ＯＴＰ）を再度使用するのと同じく、暗号の安全性が損なわれる。【０００８】  非特許文献２に記載のＰｈｅｌｉｘは、ストリーム暗号及びＭＡＣ機能性の結合により認証付暗号機能を提供すると公表されている。キーストリームを平文に依存するＰｈｅｌｉｘは、セキュリティ攻撃に対しシステムを脆弱にし、第三者によるシステムの分析を容易にするとともに、平文の認証を使用するので、送信中の保護を必要とするデータが実際の送信プロセスの中で変更されたかどうかは受信者が受信ファイルを解読した後という長いプロセスの後でしか知ることができず、効率において劣っている。【０００９】  そこで、本発明の目的は、新しい動態概念「動態Ｓ−ｂｏｘ（Ｄｙｎａｍｉｃ  Ｓ−ｂｏｘ）・動態フリップ（Ｄｙｎａｍｉｃ  ｆｌｉｐ）・動態シフト（Ｄｙｎａｍｉｃ  ｓｈｉｆｔ）・動態更新（Ｄｙｎａｍｉｃ  ｕｐｄａｔｅ）・動態循環シフト（Ｄｙｎａｍｉｃ  ｃｉｒｃｕｌａｒ  ｓｈｉｆｔ）」のアイディアを提案し、そしてそれらの動態概念を一貫に利用して、超軽量・超高処理速度・可変長のキーの長さ・多様なシステム環境や機器に対応・すべてのデータに対応・ハードウェア・ソフトウェアに対応性と強適応性・効率に優れた特徴を持つストリーム暗号方法を提供することと共にユーザーを情報の犯罪や漏洩などの被害から守ることにある。別の本発明の目的は、同じキーを使用しても異なるキーストリームを生成するストリーム暗号方法の提供にある。更に別の本発明は、セキュリティ攻撃に対しシステムを脆弱にすることがなく、第三者によるシステムの分析を容易にせず、また、送信中の保護を必要とするデータが実際の送信プロセスの中で変更されたかどうかが、受信者が受信ファイルを解読した後という長いプロセスを要することなく、確認できる認証付ストリーム暗号方法を提供することにある。
【課題を解決するための手段】  前述の課題を解決するために本発明は次の手段を提供する。【００１０】  （１）Ｐｉ＋＋暗号シリーズの中心概念、つまり動態Ｓ−ｂｏｘ（Ｄｙｎａａｍｉｃ  Ｓ−ｂｏｘ）・動態フリップ（Ｄｙｎａｍｉｃ  ｆｌｉｐ）・動態シフト（Ｄｙｎａｍｉｃ  ｓｈｉｆｔ）・動態更新（Ｄｙｎａｍｉｃ  ｕｐｄａｔｅ）・動態循環シフト（Ｄｙｎａｍｉｃ  ｃｉｒｃｕｌａｒ  ｓｈｉｆｔ）といった全て動態的な概念を一貫に利用して、キーに基づいたキーストリームを生成し、該キーストリームと平文との排他的論理和演算により該平文を暗号化した暗号文を生成するキーストリーム暗号方法の暗号化と復号化プロセスにおいて、
円周率π＝３．１４１５９  ２６５３５  ８９７９３  ２３８４６  ２６４３３  ８３２７９  ５０２８８…の小数点の後の中から任意の位置にある連続する３２ｂｉｔｓの数をパイ・データの１つのワード（ｗｏｒｄ）とし、その後の２５５個の数字も切れなく続けてπから取り出す。合計で、２５６個３２ｂｉｔｓのワードを生成し、それらのワードをパイ・データと称する時、２５６個の要素でなる動態Ｓ−ｂｏｘを該パイ・データで初期化する初期化プロセスと、
前記初期化ステップにより初期化された前記動態Ｓ−ｂｏｘにおける要素を、キーに依存する交換アルゴリズムにより、相互に交換する要素交換プロセスと、
動態循環シフト（Ｄｙｎａｍｉｃ  ｃｉｒｃｕｌａｒ  ｓｈｉｆｔ）と前記動態Ｓ−ｂｏｘにおける複数の要素よりインデックスポインターｙを生成するインデックスポインターｙ生成プロセスと、
動態循環シフトと前記動態Ｓ−ｂｏｘにおける複数の要素より更新変数Ｍｉｘ３２を生成する更新変数Ｍｉｘ３２生成プロセスと、
キーストリーム生成する前の準備として、キーストリームを生成せずにキーストリームアルゴリズムを２５６回実行するプロセスと、
前記動態Ｓ−ｂｏｘにおける１つの要素をインデックスポインターｘとして選択するインデックスポインターｘ選択プロセスと、
前記インデクスポインターｙ生成プロセスで生成したインデックスポインターｙ、前記更新変数Ｍｉｘ３２生成プロセスで生成した更新変数Ｍｉｘ３２及び前記インデックスポインターｘ選択プロセスで選択した前記インデックスポインターｘに基づき前記インデックスポインターｙ生成プロセスで生成したインデックスポインターｙを更新するインデックスポインターｙ更新プロセスと、
前記インデックスポインターｘ選択プロセスで選択した前記インデックスポインターｘの中から動態的に任意な１ビットを選択し、インデックスポインターｘをフリップ（ｆｌｉｐ）するインデックスポインターｘの動態フリッププロセスと、
前記インデックスポインターｙ更新プロセスで更新した前記インデクスポインターｙの中から動態的に任意な１ビットを選択し、インデックスポインターｙをフリップ（ｆｌｉｐ）するインデックスポインターｙの動態フリッププロセスと、
前記更新変数Ｍｉｘ３２生成プロセスで生成した更新変数Ｍｉｘ３２の更新は、更新変数Ｍｉｘ３２のＮＳＢ（Ｍｏｓｔ  ｓｉｇｎｉｆｉｃａｎｔ  ｂｉｔｓ）に依頼してＭＳＢ−ｄｅｐｅｎｄｅｎｔ循環シフト（循環シフトする範囲は０−３１）した結果が、循環シフトする前の更新変数Ｍｉｘ３２のＬＳＢ（Ｌｅａｓｔ  ｓｉｇｎｉｆｉｃａｎｔ  ｂｉｔｓ）が指した動態Ｓ−ｂｏｘにある内容と排他的論理和演算（ＸＯＲ）することにより、新たな更新したＭｉｘ３２を得る更新変数Ｍｉｘ３２の更新プロセスと、
動態Ｓ−ｂｏｘの動態更新において、前記の更新変数Ｍｉｘ３２の更新プロセスで得られた更新変数Ｍｉｘ３２が循環シフトする前の更新変数Ｍｉｘ３２の値のＭＳＢ（Ｍｏｓｔ  ｓｉｇｎｉｆｉｃａｎｔ  ｂｉｔｓ）を動態Ｓ−ｂｏｘのアドレスとして、前記の更新変数Ｍｉｘ３２の更新プロセスにより得られた更新変数Ｍｉｘ３２の値をそのアドレスの内容を更新する動態Ｓ−ｂｏｘの動態更新プロセスと、
前記インデックスポインターｘの動態フリッププロセスで得たインデックスポインターｘの１バイトを選び、それを前記のインデックスポインターｙの動態フリッププロセスで得たインデックスポインターｙの１バイトとの排他的論理和演算により得た結果を動態Ｓ−ｂｏｘのアドレスとして、そのアドレスの内容を取り出し臨時変数Ｋ１を生成する臨時変数Ｋ１生成プロセスと、
前記のインデックスポインターｘの動態フリッププロセスで得たインデックスポインターｘのもう一つの１バイト（先ほどに使われた１バイトと異なった１バイト）を選ぶ、それを前記のインデックスポインターｙの動態フリッププロセスで得たインデックスポインターｙのもう１つの１バイト（先ほどに使われた１バイトと異なった１バイト）との排他的論理和演算により得た結果を動態Ｓ−ｂｏｘのアドレスとして、そのアドレスの内容を取り出し先ほどに生成された臨時変数Ｋ１と異なった臨時変数Ｋ２を生成する臨時変数Ｋ２生成プロセスと、
前記の臨時変数生成プロセスで生成された臨時変数Ｋ１の中から、動態的に任意な８ビットを選択し、その結果を動態Ｓ−ｂｏｘのアドレスとして、そのアドレスの内容を取り出し、１つのワート（３２ビットサイズ）のキーストリームを生成するプロセスと、
前記の臨時変数生成プロセスで生成されたＫ２は、前記の臨時変数生成プロセスで生成された臨時変数Ｋ１の中から動態的に選ばれた任意な８ビットと異なった任意な８ビットを動態的に選択し、その選択したものを動態Ｓ−ｂｏｘのアドレスとして、そのアドレスの内容を取り出し、前記に生成された１つのワードのキーストリームと異なったもう１つのワード（３２ビットサイズ）のキーストリームを生成する
ことを特徴とするキーストリーム暗号方法。【００１１】  （２）前記交換アルゴリズムは、交換アルゴリズム１及び交換アルゴリズム２でなり、
交換アルゴリズム１では、前記動態Ｓ−ｂｏｘにおける第１番目の要素を他の要素と交換し、
交換アルゴリズム２では、前記動態Ｓ−ｂｏｘにおける第２番目から最後のｎ番目の要素を他の要素と交換する
ことを特徴とする前記（１）に記載のキーストリーム暗号方法。【００１２】  （３）初期化ベクルトＩＶを複数のデータに分割りし
初期化ベクルトＩＶ（１２８ビット）を複数のデータに分割し、更新変数Ｍｉｘ３２と、インデックスポインターｘと、インデックスポインターｙと、Ｉｎｄｅｘ２を夫々最初の初期化の初期値として扱う
ことを特徴とする前記（１）乃至（２）に記載のキーストリーム暗号方法。【００１３】  （４）請求項１乃至３に記載の方法により平文を暗号化して生成した暗号文に、暗号化したＭＡＣ（メッセージ認証コード）を付加することを特徴とする認証機能付きストリーム暗号方法。
【発明の効果】
【００１４】  本発明によれば、超軽量・超高処理速度・可変長のキーの長さ・多様なシステム環境や機器に対応・すべてのデータに対応・ハードウェア・ソフトウェアに対応性と強適応性の特徴を持つ「高安全性」・「高速性」・「汎用性」、そして効率に優れたストリーム暗号・復号方法を提供できる。また、本発明によれば、同じキーを使用しても異なるキーストリーム生成するストリーム暗号・復号方法を提供できる。更に本発明によれば、セキュリティ攻撃に対しシステムを脆弱にすることなく、第三者によるシステムの分析を容易にせず、また、送信中の保護を必要とするデータが実際の送信プロセスの中で変更されたかどうかが、受信者が受信ファイルを解読した後という長いプロセスを要することなく、確認できる認証付ストリーム暗号・復号を提供できる。
【発明の実施するための最良の形態】
【００１５】  次に本発明の実施の形態を挙げ、図面を参照し、本発明を一層具体的に説明する。
【００１６】［概要］
本願発明は、Ｐｉ＋＋ストリーム暗号に関し、動態概念、つまり動態Ｓ−ｂｏｘ（Ｄｙｎａｍｉｃ  Ｓ−ｂｏｘ）・動態フリップ（Ｄｙｎａｍｉｃ  ｆｌｉｐ）・動態シフト（Ｄｙｎａｍｉｃ  ｓｈｉｆｔ）・動態更新（Ｄｙｎａｍｉｃ  ｕｐｄａｔｅ）・動態循環シフト（Ｄｙｎａｍｉｃ  ｃｉｒｃｕｌａｒ  ｓｈｉｆｔ）といった全て動態的な概念を一貫に利用した暗号化及び復号化の両方を実現する暗号算法及び復号化算法に関する。パイ・データ（Ｐｉ  ｄａｔａ）は、円周率πの値であり、π＝３．１４１５９  ２６５３５  ８９７９３  ２３８４６  ２６４３３  ８３２７９  ５０２８８…のように無限に続く値である。Ｓ−ｂｏｘは、サブスティテュードボックス（ｓｕｂｓｔｉｔｕｔｅ  ｂｏｘ）又はＳボックスとも称され、ｍビットの入力をｎビットに変換する関数であって、ｍ×ｎのルックアップテーブルによって実装できる。動態Ｓ−ｂｏｘは、英文でＤｙｎａｍｉｃ  Ｓ−ｂｏｘと表記され、内容と配列は動態的に変わることによって、より高い安全性かつ高速度な暗号性能を提供することを指す。以下では、円周率パイの英文表記がＰｉであることに因み、本願発明を「Ｐｉ＋＋」と略記し、表記の簡素化を図るものとする。
【００１７】    以下、本願発明「Ｐｉ＋＋」について、３つのユニックな実施の形態を挙げ、説明する。第１の実施の形態は基本的な実施の形態で、第２の実施の形態は基本的な実施の形態に初期化ベクルト（Ｉｎｉｔｉａｌｉｚａｔｉｏｎ  Ｖｅｃｔｏｒｓ，ＩＶ）を加えた実施の形態で、第３の実施の形態は基本的な実施の形態にＩＶ及び認証を加えた実施の形態である。以下においては、主として第１の実施の形態に注目して本願発明を説明する。第２及び第３の実施の形態については、第１の実施の形態とこれらの２つの実施の形態間の違いについて説明する。
【００１８】  まず本願発明の第１の実施の形態について説明する。理解を容易にするために、以下では、データ長等についての具体的な数値や処理の手順を例示し、本発明の第１の実施の形態の説明を進める。これらの具体的数値や手順は、あくまで例示であり、本願発明の範囲を限定するものでないことは勿論である。
発明「Ｐｉ＋＋」の第１の実施の形態で使用するキーは、８ビットの倍数の可変長さキーであり、そのキーのデータ長（Ｌバイト）は１６から２０４８ビットの範囲である。動態Ｓ−ｂｏｘは、まず２５６個のパイ・データで初期化される。２５６個の各パイ・データのビット長は３２ビットである。そこで、動態Ｓ−ｂｏｘの初期化に使われるパイ・データは、無限数であるπの一部分、即ちπを構成する無限の数の内から選んだ２５６×３２ビット（ｂｉｔｓ）分のデータである。動態Ｓ−ｂｏｘの中の２５６個の要素は、初期化の後に要素相互間で交換される。その交換の方法は秘密キーに依存する。
【００１９】  ２５６個の要素の交換プロセスの中で、第１の要素に使う第１の交換算法（方法）は、残りの２５５個の要素の交換に使用されていた交換算法（方法）とは異なる。動態Ｓ−ｂｏｘの中にある２５６個の要素の交換は、キースケジュールアルゴリズム（Ｋｅｙ  Ｓｃｈｅｄｕｌｅ  Ａｌｇｏｒｉｔｈｍ）により全て行われる。キースケジュールアルゴリズムでは、動態Ｓ−ｂｏｘ中の２５６個の要素の交換が行われるだけでなく、インデックスポインターｙ（Ｉｎｄｅｘ  ｐｏｉｎｔｅｒ  ｙ）と更新変数Ｍｉｘ３２も生成される。インデックスポインターｙは、動態循環シフトと動態Ｓ−ｂｏｘにおける複数の要素によって生成され、更新変数Ｍｉｘ３２は動態循環シフトと動態Ｓ−ｂｏｘにおける複数の要素によって生成される。インデックスポインターｙ及び更新変数Ｍｉｘ３２は、キーストリーム生成アルゴリズムにおいてキーストリームを生成するために使用される。
【００２０】  キーストリーム生成する前の準備において、Ｐｉ＋＋暗号のキースケジュールアルゴリズムが実行し終わった後、キーストリームを生成せずにキーストリームアルゴリズムを２５６回実行する。これによって、動態Ｓ−ｂｏｘにある各要素は少なくとも一回更新された。インデクスポインターｙも更新変数Ｍｉｘ３２も２５６回に更新され、決して知られることのない値に変更された。
【００２１】  キーストリーム生成アルゴリズムでは、動態Ｓ−ｂｏｘ更新アルゴリズム（Ｄｙｎａｍｉｃ  Ｓ−ｂｏｘ  ｕｐｄａｔｉｎｇ  ａｌｇｏｒｉｔｈｍ）は、インデックスポインターｘとインデックスポインターｙと更新変数Ｍｉｘ３２に基づき、動態Ｓ−ｂｏｘの中にある全ての要素を一つずつ更新するとともに、動態Ｓ−ｂｏｘにある要素は動態的に選択され、最新化（ｕｐｄａｔｅ）される。キーストリーム生成アルゴリズムは、２ワード（８バイト）のキーストリームの生成という処理を繰り返し行い、各処理毎に異なるインデックスポインターｘとインデックスポインターｙと更新変数Ｍｉｘ３２を使用する。即ち、キーストリーム生成アルゴリズムでは、インデックスポインターｘとインデックスポインターｙと更新変数Ｍｉｘ３２は、２ワード（８バイト）のキーストリームの生成という１ループのキーストリーム生成において一度だけ使用され、２ワード（８バイト）のキーストリームの生成毎に更新される。そのループを繰り返して２ワード（８バイト）のキーストリームずつ生成することにより、暗号化対象の平文又は復号化対象の暗号文の長さだけのキーストリームが生成される。それら各ループ毎にインデックスポインターｘとインデックスポインターｙと更新変数Ｍｉｘ３２は更新される。
【００２２】  その後、暗号化では、暗号化用の平文とキーストリームの間で排他的論理和演算（ｅｘｃｌｕｓｉｖｅ  ＯＲ  ｏｐｅｒａｔｉｏｎ）が実行され、暗号文が生成される。他方、復号化では、復号化用の暗号文とキーストリームの間で排他的論理和運算が実行され、平文が生成される。
【００２３】［改良］
本発明「Ｐｉ＋＋」は改良されたストリーム暗号である。この発明は、過去のストリーム暗号とは相違し、動態概念、つまり動態Ｓ−ｂｏｘ（Ｄｙｎａｍｉｃ  Ｓ−ｂｏｘ）・動態フリップ（Ｄｙｎａｍｉｃ  ｆｌｉｐ）・動態シフト（Ｄｙｎａｍｉｃ  ｓｈｉｆｔ）・動態更新（Ｄｙｎａｍｉｃ  ｕｐｄａｔｅ）・動態循環シフト（Ｄｙｎａｍｉｃ  ｃｉｒｃｕｌａｒ  ｓｈｉｆｔ）といった全て動態的な概念を一貫に利用した暗号化・復号化プロセスを使用する。そして、要素交換のために、本発明は二つの異なる交換アルゴリズムを使用する。この発明において、動態Ｓ−ｂｏｘの初期の値を初期値（ｉｎｉｔｉａｌ  ｖａｌｕｅｓ）としてパイ・データが使用される。動態循環シフト（Ｄｙｎａｍｉｃ  ｃｉｒｃｕｌａｒ  ｓｈｉｆｔ）は変数の更新のために使用される。要素交換アルゴリズム（Ｓｗａｐｐｉｎｇ  ｅｌｅｍｅｎｔｓ  ａｌｇｏｒｉｔｈｍｓ）は、キースケジュールアルゴリズム（Ｋｅｙ  ｓｃｈｅｄｕｌｅ  ａｌｇｏｒｉｔｈｍ）の中の動態Ｓ−ｂｏｘの要素の交換のために使用される。要素更新アルゴリズム（Ｕｐｄａｔｉｎｇ  ｅｌｅｍｅｎｔｓ  ａｌｇｏｒｉｔｈｍｓ）は、キーストリーム生成アルゴリズム中の動態Ｓ−ｂｏｘのために使用される。動態フリップはキーストリーム生成アルゴリズムの中で使用される。動態シフトはキーストリーム生成アルゴリズムの中で使用される。本発明では、動態Ｓ−ｂｏｘと動態フリップ（Ｄｙｎａｍｉｃ  ｆｌｉｐ）と、動態シフト（Ｄｙｎａｍｉｃ  ｓｈｉｆｔ）と、動態更新（Ｄｙｎａｍｉｃ  ｕｐｄａｔｅ）と、動態循環シフト（Ｄｙｎａｍｉｃ  ｃｉｒｃｕｌａｒ  ｓｈｉｆｔ）と、インデックスポインターｘ（Ｉｎｄｅｘ  ｐｏｉｎｔｅｒ  ｘ）と、インデックスポインターｙ（Ｉｎｄｅｘ  ｐｏｉｎｔｅｒ  ｙ）とを結合して、高速性と、安全性と、汎用性と、軽いメモリ・スペース（ｌｉｇｈｔ  ｍｅｍｏｒｙ  ｓｐａｃｅ）特性と、高いセキュリティとを特色とした巨大な内部状態（ａ  ｈｕｇｅ  ｉｎｔｅｒｎａｌ  ｓｔａｔｅ）のあるストリーム暗号が作成される。この発明のキーストリーム生成アルゴリズム（Ｋｅｙｓｔｒｅａｍ  Ｇｅｎｅｒａｔｉｏｎ  Ａｌｇｏｒｉｔｈｍ）は、動態Ｓ−ｂｏｘにおける要素の更新等により、高い乱数度（ｒａｎｄｏｍｎｅｓｓ）の特性を備えたキーストリームの生成を可能にしている。
【００２４】［１］第１の実施の形態による暗号化プロセス
１）暗号化プロセスの流れ図
図１は、本発明の第１の実施の形態による暗号化プロセスを示す流れ図であり、図２はこの第１の実施の形態により復号化プロセスを示す流れ図である。図１において、１は動態Ｓ−ｂｏｘ（図では、ＤＭと簡略表記されている。）の初期化、２はキー入力、３は動態Ｓ−ｂｏｘにおける要素交換、４は要素交換３より得られた動態Ｓ−ｂｏｘの最終排列（ｆｉｎａｌ  ｐｅｒｍｕｔａｔｉｏｎ）の一時記憶、５はインデックスポインターｙ及び更新変数Ｍｉｘ３２の取得、６はキーストリーム生成前の準備、７はキーストリーム生成、８は平文入力、９は暗号化、１０は暗号文出力、１０００はパイ・データ、２０００は秘密キー、１０１は初期化された動態Ｓ−ｂｏｘ、１０２は秘密キー、１０３は要素交換された動態Ｓ−ｂｏｘ、１０４は要素交換３より得られた動態Ｓ−ｂｏｘの最終配列（Ｆｉｎａｌ  ｐｅｒｍｕｔａｔｉｏｎ  ｏｆ  Ｄｙｎａｍｉｃ  Ｓ−ｂｏｘ）、１０５はインデックスポインターｙ及び更新変数Ｍｉｘ３２、１０６は更新した動態Ｓ−ｂｏｘ及びインデックスポインターｙと更新変数Ｍｉｘ３２、１０７はキーストリーム、１０８は平文、１０９は暗号文である。また、図２において、５０７は暗号文入力、５０８は復号化、５０９は平文出力、５００７は暗号文、５００８は平文である。平文入力８に替えて暗号文入力５０７を行うだけで、暗号文の復号化処理が平文の暗号化処理と同じプロセスで行われることは周知であるから、以下では必要の都度に図１を参照して、本発明の第１の実施の形態を説明する。
【００２５】  ２）キースケジュールアルゴリズムとキーストリーム生成アルゴリズム
図１における符号１−６で示すプロセスはキースケジュールアルゴリズムにより実行され、符号７−９で示すプロセスはキーストリーム生成アルゴリズムにより実行される。
【００２６】  ３）動態Ｓ−ｂｏｘ、インデックスポインターｙ、更新変数Ｍｉｘ３２等の変数
キースケジュールアルゴリズムは、２５６×３２ビットサイズの動態Ｓ−ｂｏｘと、３２ビットサイズのインデックスポインターｙと、３２ビットサイズの更新変数Ｍｉｘ３２と、３２ビットサイズの変数Ｉｎｄｅｘ１と、３２ビットサイズの変数Ｉｎｄｅｘ２と、１つのカウンタ（ｃｏｕｎｔｅｒ）とを使用する。
【００２７】  ４）動態Ｓ−ｂｏｘの初期化
動態Ｓ−ｂｏｘ（Ｄｙｎａｍｉｃ  Ｓ−ｂｏｘ）は、各々３２のビット長を持つ２５６ワードのパイ・データで初期化される。２５６ワードのパイ・データは、無限数πの内の一部のデータであり、πを構成する一連の数字における連続する部分を抽出したものである。
【００２８】  ３２ビットサイズのインデックスポインターｙと３２ビットサイズの更新変数Ｍｉｘ３２もキースケジュールアルゴリズムの中で初期化され更新される。キースケジュールアルゴリズムへの入力は、２５６ワードのパイ・データ（２５６−ｗｏｒｄｓ  ｐｉ  ｄａｔａ）とユーザーから供給されたＬバイト（２≦Ｌ≦２５６のキーである。キースケジュールアルゴリズム（Ｋｅｙ  Ｓｃｈｅｄｕｌｅ  Ａｌｇｏｒｉｔｈｍ）の出力は、２５６のパイ・データの配列（ａ  ｐｅｒｍｕｔａｔｉｏｎ  ｏｆ  ２５６  ｐｉ  ｄａｔａ）とインデックスポインターｙと更新変数Ｍｉｘ３２である。キーの長さは、ユーザーから提供される秘密のキー（ｐｒｉｖａｔｅ  ｋｅｙ）のバイトの数であり、２から２５６までの範囲である。安全性を考慮し、キーの長さは少なくとも８バイト又はそれ以上が推薦される。
【００２９】［２］キーに基づく動態Ｓ−ｂｏｘの要素交換
キースケジュールアルゴリズム（Ｋｅｙ  Ｓｃｈｅｄｕｌｅ  Ａｌｇｏｒｉｔｈｍ）は、ユーザーが作成したキーデータ（ｋｅｙ  ｄａｔａ）を入力として受け入れる。入力キーのバイト長はＬ−バイト（２≦Ｌ≦２５６である。動態Ｓ−ｂｏｘでは、初期化プロセスの後に、オリジナルのパイ・データの交換（ｐｅｒｍｕｔａｔｉｏｎ  ｏｆ  ｏｒｉｇｉｎａｌ  ｐｉ  ｄａｔａ）が始まり、動態Ｓ−ｂｏｘは連続的な交換プロセスに入る。この交換プロセスにより、動態Ｓ−ｂｏｘにおける２５６の要素の配列は未知のキーに依存して新しい配列（ＫＥＹ−ｄｅｐｅｎｄｅｎｔ  ｐｅｒｍｕｔａｔｉｏｎ）となる。即ち、動態Ｓ−ｂｏｘへのただ一つの作用（ａｃｔｉｏｎ）は、パイ・データ中の二つの値（ｖａｌｕｅ）を秘密のキーに基づいて交換することである。交換アゴリズム（ｓｗａｐｐｉｎｇ  ａｌｇｏｒｉｔｈｍ）の節（ｓｅｃｔｉｏｎ）は、異なる２つのアルゴリズムから成っている。動態Ｓ−ｂｏｘでは、１つのアルゴリズム（ａｌｇｏｒｉｔｈｍ）は第１の要素を交換するために使用され、もう一つのアルゴリズム（ａｌｇｏｒｉｔｈｍ）は残りの２５５の要素を２５５回交換するために使用される。総計２５６回の要素交換は、動態Ｓ−ｂｏｘの中の各要素を少なくとも一度交換し、高いセキュリティを保証する。
【００３０】［３］交換アルゴリズム（Ｓｗａｐｐｉｎｇ  Ａｌｇｏｒｉｔｈｍｓ）
１）交換アルゴリズム１
交換アルゴリズム１（Ｓｗａｐｐｉｎｇ  Ａｌｇｏｒｉｔｈｍｓ  １）は、次の式（１）で示される。また、図３は、交換アルゴリズム１によるプロセスを示す図である。
Ｓｗａｐ（ＤＭ［０］，ＤＭ［ＫＥＹ［０］］）      （１）
Ｉｎｄｅｘ２＝ＫＥＹ［０］×ＫＥＹＬＥＮＧＴＨ
Ｍｉｘ３２＝Ｍｉｘ３２＋Ｉｎｄｅｘ２
上に示す方程式（１）は、動態Ｓ−ｂｏｘにおける第１要素の交換を最初に行う時だけに利用される。この式（１）で示すように、その第１要素の交換プロセスは、キーの最初のバイト（ｆｉｒｓｔ−ｂｙｔｅ  ｋｅｙ）が指した動態Ｓ−ｂｏｘのアドレスの値と動態Ｓ−ｂｏｘの最初の要素とを交換する。Ｉｎｄｅｘ２の値はキーの最初のバイトとキーの長さによって決められる。更新変数のＭｉｘ３２は、０×５４６５５３０７の値で初期化され、続いて、Ｍｉｘ３２はＩｎｄｅｘ２を加えること（Ｍｉｘ３２＋Ｉｎｄｅｘ２）により、更新される。
【００３１】２）交換アルゴリズム２
交換アルゴリズム２（Ｓｗａｐｐｉｎｇ  Ａｌｇｏｒｉｔｈｍ  ２）は、次の式（２）で示される。また、図４は、交換アルゴリズム２によるプロセスを示す図である。
Ｉｎｄｅｘ１＝１      （２）
ｆｏｒ  ｃｏｕｎｔｅｒ  ｆｒｏｍ  １  ｔｏ  ２５５
ＬＳＢＳ＝Ｉｎｄｅｘ２  ｍｏｄ  ３２
Ｉｎｄｅｘ２＝ＲＯＴＬ３２（Ｉｎｄｅｘ２，ＬＳＢＳ）ＸＯＲ  ＫＥＹ［Ｉｎｄｅｘ１］ＸＯＲ  ＤＭ［ｆｉｘ（Ｉｎｄｅｘ２）］
ｔｅｍｐ＝ｆｉｘ（Ｉｎｄｅｘ２）
ｉｆ（ｃｏｕｎｔｅｒ＝ｔｅｍｐ）ｓｗａｐ（ＤＭ［ｃｏｕｎｔｅｒ］，ＤＭ［ｆｉｘ（Ｉｎｄｅｘ２＞＞２４）］）      （２．１）
ｅｌｓｅ  ｓｗａｐ（ＤＭ［ｃｏｕｎｔｅｒ］，ＤＭ［ｔｅｍｐ］）
Ｉｎｄｅｘ１＝（Ｉｎｄｅｘ１＋１）ｍｏｄ  ＫＥＹＬＥＮＧＴＨ
ＬＳＢＳがＬＳＢＳ＝Ｉｎｄｅｘ２  ｍｏｄ３２（Ｉｎｄｅｘ２のｌｅａｓｔ  ｓｉｇｎｉｆｉｃａｎｔ  ｂｉｔｓ）であるど定義され、また、ｆｉｘ（ｘ）は、交換アルゴリズム２（Ｓｗａｐｐｉｎｇ  ａｌｇｏｒｉｔｈｍｓ  ２）だけではなく、Ｐｉ＋＋シリーズの全てのプロセスの中でｆｉｘ（ｘ）＝ｘ∩２５５（ｘのｌｅａｓｔ  ｓｉｇｎｉｆｉｃａｎｔ  ｂｙｔｅ）であると定義される。ＲＯＴＬは循環左シフト（ｃｉｒｃｕｌａｒ  ｌｅｆｔ  ｓｈｉｆｔ）であり、ＲＯＴＬ３２（Ｉｎｄｅｘ２，ＬＳＢＳ）に関しては後に詳しく説明される。インデックスポインターｙと更新変数Ｍｉｘ３２は後に式（３）により詳しく説明される。交換アルゴリズム２（Ｓｗａｐｐｉｎｇ  Ａｌｇｏｒｉｔｈｍ  ２）は、動態Ｓ−ｂｏｘの中の残りの２５５の要素交換（ｔｈｅ  ｒｅｓｔ  ｏｆ  ２５５ｅｌｅｍｅｎｔｓ’ｓｗａｐｐｉｎｇｓ）を受け持ち、それら２５５の要素の全ての交換を行う。交換アルゴリズム２は、動態Ｓ−ｂｏｘの中で第２の要素から要素交換（ｅｌｅｍｅｎｔ  ｅｘｃｈａｎｇｅｓ）を始める。第２の要素は、上記式（２）に示された交換アルゴリズム２に示すように、Ｉｎｄｅｘ２が生成される。上記式（２）のｔｅｍｐ＝ｆｉｘ（Ｉｎｄｅｘ２）に示されたように、ｔｅｍｐが生成される。上記式（２．１）に示されたように、もしｃｏｕｎｔｅｒ＝ｔｅｍｐであれば、第２の要素はＩｎｄｅｘ２の最上位バイトが指した動態Ｓ−ｂｏｘの値と交換する。もしｃｏｕｎｔｅｒ≠ｔｅｍｐであれば、第２の要素はｔｅｍｐが指した動態Ｓ−ｂｏｘの値と交換する。他の２５４要素交換（ｅｌｅｍｅｎｔｓ  ｓｗａｐｐｉｎｇ）のプロセスも第２の要素のスワッププロセス（ｔｈｅ  ｓｗａｐｐｉｎｇ  ｐｒｏｃｅｓｓ  ｏｆ  ｓｅｃｏｎｄ  ｅｌｅｍｅｎｔ）と同様である。スワップアルゴリズム２による２５５の要素の全てを交換するプロセスは、図４に示されている。
Ｉｎｄｅｘ２＝ＲＯＴＬ３２（Ｉｎｄｅｘ２，ＬＳＢＳ）ＸＯＲ  ＫＥＹ［Ｉｎｄｅｘ１］ＸＯＲ  ＤＭ［ｆｉｘ（Ｉｎｄｅｘ２）］（２．１１）
上記式（２．１１）は、前記式（２）における一部の方程式を示す。Ｉｎｄｅｘ２が、３２−ビット長ワード（３２−ｂｉｔ  ｌｅｎｇｔｈ  ｗｏｒｄ）のキーの関数であることが、式（２．１１）で表されている。
【００３２】    ＬＳＢＳ依存循環（ＬＳＢＳ−ｄｅｐｅｎｄｅｎｔ  ｒｏｔａｔｉｏｎｓ）の意味を明確にするために、一般的な循環の意味を次のａ項及びｂ項で一層具体的に説明する。
【００３３】    ａ）ｘは３２ビットのワード（３２−ｂｉｔ  ｗｏｒｄ）で、そしてｎが０＜ｎ＜３２の範囲である整数の場合の左循環シフト（ｒｏｔａｔｅ  ｌｅｆｔ，ｃｉｒｃｕｌａｒ  ｌｅｆｔ  ｓｈｉｆｔ）の演算（ｏｐｅｒａｔｉｏｎ）ＲＯＴＬ３２（ｘ，ｎ）は
ＲＯＴＬ３２（ｘ，ｎ）＝（ｘ≪ｎ）∪（ｘ≫（３２−ｎ））
として定義される。したがって、ＲＯＴＬ３２（ｘ，ｎ）は、循環右シフト（ｃｉｒｃｕｌａｒ  ｒｉｇｈｔ  ｓｈｉｆｔ）ＲＯＴＲ３２（ｘ，３２−ｎ）と同意義であり、ｎビット位置の左向き循環シフト（ｃｉｒｃｌａｒ  ｒｏｔａｔｉｏｎｓ  ｔｏ  ｔｈｅ  ｌｅｆｔ  ｆｏｒ  ｎ−ｂｉｔ  ｐｏｓｉｔｉｏｎｓ）を意味する。
【００３４】    ｂ）ｘは３２ビットのｗｏｒｄ（３２−ｂｉｔ  ｗｏｒｄ）で、そしてｎが０＜ｎ＜３２の範囲である整数の場合の右循環シフト（ｒｏｔａｔｅ  ｔｏ  ｔｈｅ  ｒｉｇｈｔ，ｃｉｒｃｕｌａｒ  ｒｉｇｈｔ  ｓｈｉｆｔ）の演算ＲＯＴＲ３２（ｘ，ｎ）はＲＯＴＲ３２（ｘ，ｎ）＝（Ｘ≫ｎ）∪（ｘ≪（３２−ｎ）として定義される。したがって、ＲＯＴＲ３２（ｘ，ｎ）は循環左シフト（ｃｉｒｃｕｌａｒ  ｌｅｆｔ  ｓｈｉｆｔ）ＲＯＴＬ３２ｘ，３２−ｎ）と同意義であり、ｎビット位置の右向き循環シフト（ｃｉｒｃｕｌａｒ  ｒｏｔａｔｉｏｎｓ  ｔｏ  ｔｈｅ  ｒｉｇｈｔ  ｆｏｒ  ｎ−ｂｉｔ  ｐｏｓｉｔｉｏｎｓ）を意味する。上に説明され記述されたように、「≫」は右シフト運算（ｒｉｇｈｔ−ｓｈｉｆｔ  ｏｐｅｒａｔｉｏｎ）を意味する。そして、Ｘ≫ｎは、ワード（ｗｏｒｄ）ｘの最右端のｎビット（ｔｈｅ  ｒｉｇｈｔｍｏｓｔ  ｎ  ｂｉｔｓ  ｏｆ  ｔｈｅ  ｗｏｒｄ  ｘ）を廃棄し、次にｎ個のゼロを左側に付加すること（ｐａｄｄｉｎｇ  ｔｈｅ  ｒｅｓｕｌｔ  ｗｉｔｈ  ｎ  ｚｅｒｏｅｓ  ｏｎ  ｔｈｅ  ｌｅｆｔ）により得られる。「≪」は左シフト演算（ｌｅｆｔ−ｓｈｉｆｔ  ｏｐｅｒａｔｉｏｎ）を意味する。そして、ｘ≪ｎは、ワード（ｗｏｒｄ）ｘの最左端のｎビット（ｔｈｅ  ｌｅｆｔ−ｍｏｓｔ  ｎ  ｂｉｔｓ  ｏｆ  ｔｈｅ  ｗｏｒｄ  ｘ）を廃棄し、次にｎ個のゼロを右側に付加すること（ｐａｄｄｉｎｇ  ｔｈｅ  ｒｅｓｕｌｔ  ｗｉｔｈ  ｎ  ｚｅｒｏｅｓ  ｏｎ  ｔｈｅ  ｒｉｇｈｔ）により得られる。ここまでの［２］及び［３］の欄に記述したプロセスは、２５６回繰り返される。この２５６回の処理の後に、動態Ｓ−ｂｏｘの中の各要素は、少なくとも一度交換される。
かくして、ユーザーによって提供される秘密キー（ｓｅｃｒｅｔｅ  ｋｅｙ）に基づいた、動態Ｓ−ｂｏｘの中の全ての要素の並べ替え（ｐｅｒｍｕｔａｔｉｏｎ）は、ここに最終的に得られる。
【００３５】［４］インデックスポインターｙの生成
図５は、インデックスポインターｙの生成を示す図である。前記［３］の欄で述べたプロセスを終えた後、図５のインデックスポインターｙの生成プロセスにおいて、キースケジュールアルゴリズムに予め設定されていた所定値の３５３４２２０７２が図５における入力のｙとして与えられる。インデックスポインターｙの生成プロセスでは、その所定のｙ＝３５３４２２０７２に基づく次式により、インデックスポインターｙが、
ＬＳＢＳ＝ｉｎｄｅｘ２  ｍｏｄ３２      （２．２）
ｙ＝ＲＯＴＬ３２（ｙ，ＬＳＢＳ）
ｙ＝ｙ  ＸＯＲ  ＤＭ［ｆｉｘ（ｙ＞＞２４）］ＸＯＲ  ＤＭ［ｆｉｘ（ｙ）］
として与えられる。所定値ｙとしては、３５３４２２０７２以外の値でも差し支えないが、安全性確保のために、乱数が選ばれる。前記［３］の欄で説明した最後に得られた変数Ｉｎｄｅｘ２をモジュロ３２（ｍｏｄ３２）の操作を行うことにより、ＬＳＢＳを得る。上記の式（２．２）のｙ＝ＲＯＴＬ３２（ｙ，ＬＳＢＳ）のように、新たなｙを得る。そして、新たなｙの最上位バイトと最下位バイト（Ｌｅａｓｔ  ｓｉｇｎｉｆｉｃａｎｔ  ｂｙｔｅ）に分ける分割の処理を行い、この分割で得られた２バイトの値（ｔｗｏ  ｂｙｔｅｓ  ｖａｌｕｅｓ）を夫々アドレスとして扱い、動態Ｓ−ｂｏｘにおけるこれら２つのアドレスから夫々の３２ビットのワード（ｔｗｏ  ３２−ｂｉｔ  ｗｏｒｄｓ）を取得する。ここまでのプロセスの後に、上記式（２．２）のｙ＝ｙ  ＸＯＲ  ＤＭ［ｆｉｘ（ｙ＞＞２４）］ＸＯＲ  ＤＭ［ｆｉｘ（ｙ）］のように、３つの３２ビットのワード（ｔｈｒｅｅ  ３２−ｂｉｔ  ｗｏｒｄｓ）について２つの排他的論理和演算を実行し、インデックスポインターｙを生成する。
【００３６】更新変数Ｍｉｘ３２の生成
図６は、更新変数Ｍｉｘ３２の生成を示す図である。更新変数Ｍｉｘ３２は、０ｘ５４６５５３０７の値で初期化され、次に、［３］の欄の交換アルゴリズム１の中で更新される。前記［３］の欄で述べたプロセスを終えた後、図６の更新変数Ｍｉｘ３２の生成プロセスにおいて、前記［３］の欄の交換算法１で得たＭｉｘ３２の値に基づいて、次の式により更新変数Ｍｉｘ３２が、
ＭＳＢＳ＝（Ｉｎｄｅｘ２＞＞２７）      （２．３）
Ｍｉｘ３２＝ＲＯＴＬ３２（Ｍｉｘ３２，ＭＳＢＳ）
Ｍｉｘ３２＝Ｍｉｘ３２  ＸＯＲ  ＤＭ［ｆｉｘ（Ｍｉｘ３２＞＞２４］ＸＯＲ  ＤＭ［ｆｉｘ（Ｍｉｘ３２）］
として与えられる。所定値Ｍｉｘ３２としては、前期［３］の欄で説明した最後に得られた変数Ｉｎｄｅｘ２の最上位ビットを取り出し、ＭＳＢＳを得る。上記の式（２．３）のＭｉｘ３２＝ＲＯＴＬ３２（Ｍｉｘ３２，ＭＳＢＳ）のように、新たなＭｉｘ３２を得る。そして、新たなＭｉｘ３２の最上位バイトと最下位バイト（Ｌｅａｓｔ  ｓｉｇｎｉｆｉｃａｎｔ  ｂｙｔｅ）に分ける分割の処理を行い、この分割で得られた２バイトの値（ｔｗｏ  ｂｙｔｅｓ  ｖａｌｕｅｓ）を夫々アドレスとして扱い、動態Ｓ−ｂｏｘにおけるこれら２つのアドレスから夫々の３２ビットのワード（ｔｗｏ  ３２−ｂｉｔ  ｗｏｒｄｓ）を取得する。ここまでのプロセスの後に、上記式（２．３）のＭｉｘ３２＝Ｍｉｘ３２  ＸＯＲ  ＤＭ［ｆｉｘ（Ｍｉｘ３２＞＞２４）］ＸＯＲ  ＭＤ［ｆｉｘ（Ｍｉｘ３２）］のように、３つの３２ビットのワード（ｔｈｒｅｅ  ３２−ｂｉｔ  ｗｏｒｄｓ）について２つの排他的論理和演算を実行し、更新変数Ｍｉｘ３２を生成する。
【００３７】  この図５の出力のインデックスポインターｙと図６の出力の更新変数Ｍｉｘ３２は、暗号化対象の平文の全文を暗号化するために１回でだけ生成され、図７に示すキースおリーム生成アルゴリズムの入力として利用される。
【００３８】  他方、図７のキーストリーム生成アルゴリズムでは、図５のプロセスで生成されたインデックスポインターｙと図６のプロセスで生成された更新変数Ｍｉｘ３２を最初の入力とし、後述する式（３）によりそのインデックスポインターｙを更新し、後述する式（６）によりその更新変数Ｍｉｘ３２を更新し、２ワード（８バイト）のキーストリームの生成という１ループのキーストリーム生成プロセスにおいて更新されたインデックスポインターｙと更新変数Ｍｉｘ３２を一度だけ使用し、続く２ワード（８バイト）のキーストリームの生成という１ループのキーストリーム生成プロセス毎にインデックスポインターｙと更新変数Ｍｉｘ３２を更新する。キーストリーム生成アルゴリズムにおけるインデックスポインターｙと更新変数Ｍｉｘ３２の更新については後の欄［７］と欄［１０］において詳しく説明する。
【００３９】キーストリーム生成前の準備
Ｐｉ＋＋暗号のキースケジュールアルゴリズムが終わった後、キーストリームを生成せずにキーストリームアルゴリズムを２５６回実行する。これによって、動態Ｓ−ｂｏｘにある各要素は少なくとも一回更新された。その結果、動態Ｓ−ｂｏｘにある全ての要素（ｗｏｒｄｓ）は決して知られることのない値に変更された。インデクスポインターｙもＭｉｘ３２も２５６回に更新され、決して知られることのない値に変更された。
【００４０】［５］キーストリーム生成アルゴリズム
図７は、キーストリーム生成アルゴリズムを示す図である。本発明「Ｐｉ＋＋」は、図７に示すように、キーストリーム生成アルゴリズム中のキーストリーム生成のプロセス（ｔｈｅ  ｐｒｏｃｅｓｓ  ｏｆ  ｋｅｙｓｔｒｅａｍ  ｇｅｎｅｒａｔｉｏｎ）の間中には動態Ｓ−ｂｏｘにおけるどの値も交換しない。代わりに、本発明「Ｐｉ＋＋」では、動態Ｓ−ｂｏｘにおける全ての要素を更新する（ｕｐｄａｔｅ）。更新は２つの更新から成り立つ。一つ目の更新とは動態Ｓ−ｂｏｘにある全ての要素は一つ一つ順序的に最新化（ｕｐｄａｔｅ）される。二つ目の更新とは動態Ｓ−ｂｏｘにある全ての要素は動態的に選択され、更新される。したがって、動態Ｓ−ｂｏｘの中の要素範囲は最大限度に拡張される。
【００４１】  図７のキーストリーム生成アルゴリズムは、２ワード（８バイト）のキーストリームの生成という１ループのキーストリーム生成プロセスを実行するためのアルゴリズムを示す。そのループを繰り返して２ワード（８バイト）ずつキーストリームを生成することにより、暗号化対象の平文または復号化対象の暗号文の全体の長さだけのキーストリームが生成される。平文全体の長さだけのキーストリームとその平文との排他的論理和演算により、平文全体の暗号化が達成される。暗号文全体の長さだけのキーストリームとその暗号文全体との排他的論理和演算により、暗号文全体の復号化が達成される。
【００４２】［６］コインデックスポインターｘ
インデックスポインターｘは、図７にｘ＝ＤＭ（ｉ）と記載されている、キーストリーム生成アルゴリズムにおいて生成される。ここでインデックス変数ｉの範囲は０〜２５５である。この方程式によるｘも、決して知られることのないインデックスポインターである。何故ならば、動態Ｓ−ｂｏｘの要素の配列（ｐｅｒｍｕｔａｔｉｏｎｓ  ｏｆ  ｄｙｎａｍｉｃ  Ｓ−ｂｏｘ’ｓ  ｅｌｅｍｅｎｔｓ）は、前記［１］−［４］の欄で説明したキースケジュールアゴリズム（Ｋｅｙ  Ｓｃｈｅｄｕｌｅ  Ａｌｇｏｒｉｔｈｍ）によって変更されている（ｒｅａｒｒａｎｇｅｄ）こととキーストリーム生成する前の準備で動態Ｓ−ｂｏｘにある各要素は少なくとも一回更新されるからである。インデックスポインターｘも、２ワード（８バイト）のキーストリームの生成という１ループのキーストリーム生成プロセスにおいて一度だけ使用され、その１ループのキーストリーム生成プロセス毎に更新される。
【００４３】［７］インデックスポインターｙの更新
インデックスポインターｙを更新する過程は次の式（３）で示される。
ｙ＝ＤＭ［ｉ］＝ＤＭ［ｆｉｘ（ｘ≫８）］ＸＯＲ  ｙ  ＸＯＲ  Ｍｉｘ３２    （３）
方程式（３）の演算は、インデックスポインターｘの最下位バイト（Ｌｅａｓｔ  ｓｉｇｎｉｆｉｃａｎｔ  ｂｙｔｅ）から第２のバイトをアドレスとして指定した動態Ｓ−ｂｏｘの要素ＤＭ［ｆｉｘ（ｘ≫８）］とインデックスポインターｙと更新変数Ｍｉｘ３２との排他的論理和演算をし、その結果により、新しいインデックスポインターｙを得る。式（３）の演算で得られた更新したインデックスポインターｙは、次のステップでキーストリームを生成するために使用される。その間に、動態Ｓ−ｂｏｘの中の第ｉ番目（ｉｔｈ）の要素の値ＤＭ［ｉ］は、新しく更新されたインデックスポインターｙと取り替えられる。このプロセスで、ＤＭ［ｆｉｘ（ｘ≫８）］とｙとＭｉｘ３２という３つの値全ては、決して知られることのない値であり、また２ワート（８バイト）のキーストリームの生成という１ループのキーストリーム生成処理において一度だけ使用され、２ワート（８バイト）のキーストリームの生成毎に更新される。
【００４４】［８］インデックスポインターｘの動態フリップ（Ｄｙｎａｍｉｃ  ｆｌｉｐ）
インデックスポインターｘは、キーストリーム生成アルゴリズムにおける次のステップのキーストリームを生成するために、動態的にフリップ（ｆｌｉｐ）される。インデックスポインターｘをフリップする過程は、下の式（４）の中に示されている。
ｘ＝ｆｌｉｐ（ｘ）      （４）
ｆｌｉｐ（ｘ）の定義：
ｆｌｉｐ（ｘ）＝ｘ  ＸＯＲ（１≪（ｙ  ｍｏｄ  ３２））
このｆｌｉｐ（ｘ）は、フリップ（ｆｌｉｐ）されたインデックスポインターｘを得る関数である。インデックスポインターｘの動態フリップでは、３２−ビット長のインデックスポインターｙの最下位５ビット（Ｌｅａｓｔ  ｓｉｇｎｉｆｉｃａｎｔ  ｂｉｔｓ）に依頼して、動態的に任意な１ビットが選択され、フリップ（ｆｌｉｐ）される。この時の５ビットの範囲は０〜３１である。インデックスポインターｙをモジュロ３２（ｍｏｄ  ３２）することによって、インデックスポインターｙの最下位５ビットを得る。その結果は１を左シフトするビット数を決定する。上記式（４）に書いてあるプロセス（１≪（ｙ  ｍｏｄ  ３２））によって、生成された１つの１を持つ数はｘと最後に排他的論理和演算（ＸＯＲ）をして、インデックスポインターｘが最終的に動態フリップされる。つまり、ｙの最下位５ビットが指定したｘの１ビットが動態的にフリップ（ｆｌｉｐ）される。フリップ（ｆｌｉｐ）したインデックスポインターｘは、次のステップのキーストリーム生成に使用される。
【００４５】［９］インデックスポインターｙの動態フリップ（Ｄｙｎａｍｉｃ  ｆｌｉｐ）
前記［７］の欄で得られた更新したインデックスポインターｙは一度だけ使用される。インデックスポインターｙは、キーストリーム生成アルゴリズムにおける次のステップのキーストリームを生成するために、動態的にフリップされる。インデックスポインターｙをフリップ（ｆｌｉｐ）する過程は、下の式（５）の中に示される。
ｙ＝ｆｌｉｐ（ｙ）      （５）
ｆｌｉｐ（ｙ）の定義：
ｆｌｉｐ（ｙ）＝ｙ  ＸＯＲ（１≪（Ｍｉｘ３２≫２７））
このｆｌｉｐ（ｙ）は、フリップ（ｆｌｉｐ）されたインデックスポインターｙを得る関数である。インデックスポインターｙの動態フリップでは、３２−ビット長のＭｉｘ３２の最上位５ビット（Ｍｏｓｔ  ｓｉｇｎｉｆｉｃａｎｔ  ｂｉｔｓ）に依頼して、動態的に任意な１ビットが選択され、フリップ（ｆｌｉｐ）される。この時の５ビットの範囲は０〜３１である。Ｍｉｘ３２を２７ビット右シフトすることによって、Ｍｉｘ３２の最上位５ビットを得る。その結果は１を左シフトするビット数を決定する。上の式（５）に書いてあるプロセス（１≪（Ｍｉｘ３２≫２７））によって、生成された１つの１を持つ数はｙと最後に排他的論理和演算（ＸＯＲ）をして、インデックスポインターｙは最終的に動態フリップされる。つまり、Ｍｉｘ３２の最上位５ビットが指定したｙの１ビットが動態的にフリップ（ｆｌｉｐ）される。フリップ（ｆｌｉｐ）したインデックスポインターｙは、次のステップのキーストリーム生成に使用される。
【００４６】［１０］更新変数Ｍｉｘ３２の更新
更新変数Ｍｉｘ３２は一度だけ使用することができるので、使用された直後に更新されなければならない。更新変数Ｍｉｘ３２を更新する方法は方程式（６）の中で説明される。
ＭＳＢ＝（Ｍｉｘ３２≫２７）      （６）
ｔｅｍｐ＝ＲＯＴＬ３２（Ｍｉｘ３２，ＭＳＢ）
Ｍｉｘ３２＝ＤＭ［Ｍｉｘ３２≫２４］＝ｔｅｍｐ  ＸＯＲ  ＤＭ［ｆｉｘ（Ｍｉｘ３２）］
式（６）におけるＲＯＴＬ３２（Ｍｉｘ３２，ＭＳＢ）は、更新変数Ｍｉｘ３２のＭＳＢ依存左循環（ＭＳＢ−ｄｅｐｅｎｄｅｎｔ  ｌｅｆｔ  ｒｏｔａｔｉｏｎ）のことである。それは更新変数Ｍｉｘ３２の最上位ビット（Ｍｏｓｔ  ｓｉｇｎｉｆｉｃａｎｔ  ｂｉｔｓ（ＭＳＢ））の値に依頼して左循環シフト（Ｌｅｆｔ  ｒｏｔａｔｉｏｎ  ｓｈｉｆｔ）することである。したがって、任意の３２ビットワードのための循環シフト（ｒｏｔａｔｉｏｎ  ｓｈｉｆｔ）数は、（３２−１）より少ないか又は同等である。更新変数Ｍｉｘ３２の更新はＭｉｘ３２のＭＳＢ（Ｍｏｓｔ  ｓｉｇｎｉｆｉｃａｎｔ  ｂｉｔｓ）に依頼してＭＳＢ−ｄｅｐｅｎｄｅｎｔ循環シフトを行う。ここでの循環シフトする範囲は０−３１である。その結果は循環する前の更新変数Ｍｉｘ３２のＬＳＢ（Ｌｅａｓｔ  ｓｉｇｎｉｆｉｃａｎｔ  ｂｉｔｓ）が指した動態Ｓ−ｂｏｘにある内容と排他的論理和演算（ＸＯＲ）することにより、新たな更新したＭｉｘ３２を得る。更新変数Ｍｉｘ３２が循環する前の値のＭＳＢ（Ｍｏｓｔ  ｓｉｇｎｉｆｉｃａｎｔ  ｂｉｔｓ）を動態Ｓ−ｂｏｘのアドレスとして、新たに得た更新変数Ｍｉｘ３２の値をそのアドレスの内容を更新する。式（６）及び上述のことから分かるように、更新変数Ｍｉｘ３２の内容が知られることはない。
【００４７】［１１］キーストリームの生成
２ワード（２ワード：３２ビット×２＝６４ビット）のキーストリームは、キーストリーム生成アルゴリズムによって生成される。その生成プロセスは、下記式（７．１−７．６）で示さる。
Ｋ１＝ＤＭ［ｆｉｘ（ｘ）ＸＯＲ（ｙ≫２４）］            （７．１）
Ｋ２＝ＤＭ［（ｘ≫２４）ＸＯＲ  ｆｉｘ（ｙ）］          （７．２）
Ｔｅｍｐ１＝ｆｉｘ（ｋ１≫（Ｋ２≫２７）ｍｏｄ２４））  （７．３）
Ｔｅｍｐ２＝ｆｉｘ（Ｋ２≫（Ｋ１  ｍｏｄ  ２４））      （７．４）
ｉｆ（Ｔｅｍｐ１＝Ｔｅｍｐ２）ｆｌｉｐ（Ｔｅｍｐ２）
ＫＳ１＝ＤＭ［Ｔｅｍｐ１］      （７．５）
ＫＳ２＝ＤＭ［Ｔｅｍｐ２］      （７．６）
上に記述されるように、インデックスポインターｘ及びインデックスポインターｙは、夫々４バイトに分割りされる。インデックスポインターｘの最下位バイトとインデックスポインターｙの最上位バイトとを排他的論理和運算を行う。その排他的論理和運算の結果は、動態Ｓ−ｂｏｘのアドレスとして扱う。この動態Ｓ−ｂｏｘのアドレスの内容を取り出し、Ｋ１を得る（７．１）。インデックスポインターｘの最上位バイトはインデックスポインターｙの最下位バイトともう一度排他的論理和運算を行う。この排他的論理和運算の結果は、もう一つの動態Ｓ−ｂｏｘのアドレスとして扱う。この動態Ｓ−ｂｏｘのアドレスの内容を取り出し、Ｋ２を得る（７．２）。続いて、（７．２）で生成されたＫ２を利用して、右シフトをした後にモジュロ２４（ｍｏｄ  ２４）する。そして式（７．３）のように、先ほどのプロセスにより得られた内容（Ｋ２≫２７）ｍｏｄ２４））］に依存して、ｋ１を右シフトする。この時、（ｋ１≫（（Ｋ２≫２７）ｍｏｄ２４））の右シフトするビット数の範囲は０〜２３である。また、ｆｉｘ（ｋ１≫（（Ｋ２≫２７）ｍｏｄ２４））のように、Ｔｅｍｐ１について、Ｋ１の任意な８ビットの値を得ることができる。その８ビットの値を動態Ｓ−ｂｏｘのアドレスとして利用し、そのアドレスにある内容を取り出しキーストリームの第１のワードＫＳ１（７．５）を得ることができる。キーストリームＫＳ２を生成するには、（７．１）で生成されたＫ１を利用し、それをモジュロ２４（ｍｏｄ２４）する。そして式（７．４）のように、先ほどのプロセスにより得られた内容（Ｋ１  ｍｏｄ２４）に依存して、Ｋ２を右シフトする。この時、（Ｋ２≫（Ｋ１  ｍｏｄ  ２４））の右シフトするビット数の範囲は０〜２３である。Ｔｅｍｐ２について、ｆｉｘ（Ｋ２≫（Ｋ１  ｍｏｄ  ２４））のように、Ｋ２の任意な８ビットの値を得ることができる。若しＴｅｍｐ１＝Ｔｅｍｐ２であれば、Ｔｅｍｐ２は動態的にフリップ（Ｆｌｉｐ）される。若しＴｅｍｐ１≠Ｔｅｍｐ２であれば、Ｔｅｍｐ２の値は直接に動態Ｓ−ｂｏｘのアドレスとして利用し、そのアドレスにある内容を取り出しキーストリームの第２のワードＫＳ２を得ることができる。
Ｔｅｍｐ１＝Ｔｅｍｐ２の場合のｆｌｉｐ（Ｔｅｍｐ２）とは、次のように定義することができる。
ｆｌｉｐ（Ｔｅｍｐ２）＝Ｔｅｍｐ２  ＸＯＲ（１＜＜（Ｔｅｍｐ２  ｍｏｄ  ８））
Ｔｅｍｐ１＝Ｔｅｍｐ２の場合では、Ｔｅｍｐ２が動態的にフリップされた後、上記式（７．６）のように、Ｔｅｍｐ２の８ビットの値を動態Ｓ−ｂｏｘのアドレスとして利用し、そのアドレスにある内容を取り出しキーストリームの第２のワードＫＳ２を得ることができる。
【００４８】［１２］キーストリーム生成の繰る返し
要求された長さのキーストリームを得るために、［５］の欄から［１１］の欄までの範囲のプロセスを必要な回数だけ繰り返す。要求された長さのキーストリームとは、暗号化対象の平文の長さを少なくとも有するキーストリームである。［５］欄から［１１］欄までのプロセスが２５６回繰り返された後には、動態Ｓ−ｂｏｘの中の全ての要素は少なくとも一回更新されている。上に記述された各プロセスにおいて、インデックスポインターｘとインデックスポインターｙと更新変数Ｍｉｘ３２が、一度使用された直後にそれら自身の更新アルゴリズムによって更新される。
【００４９】  図２は復号化のプロセスを示す図である。暗号化のプロセスを示す図１との対比で分かるように、図２の復号化のプロセスは暗号化のプロセスと実質的に全く同じである。暗号化プロセスにおける平文に替えて復号化のプロセスでは暗号文が入力される。したがって、前記［１］欄から［１２］欄のここまでに記述された暗号化アルゴリズム（Ｅｎｃｒｙｐｔｉｏｎ  Ａｌｇｏｒｉｔｈｍ）によって生成された暗号文を解読する復号化アルゴリズム（Ｄｅｃｒｙｐｔｉｏｎ  Ａｌｇｏｒｉｔｈｍ）の構成（ｃｏｎｆｉｇｕｒａｔｉｏｎ）は、前記［１］欄から［１２］欄のここまでに記述された暗号化アルゴリズムの構成と同じである。ある秘密キーを使用してその暗号アルゴリズムで生成された暗号文は、その暗号化アルゴリズム同じ構成の復号化アルゴリズムに同じ秘密キーを適用して、解読される。
【００５０】  以上の「１］欄から［１２］欄の記載により、本発明「Ｐｉ＋＋」の基本的な実施の形態である第１の実施の形態を説明した。
【００５１】  図９は、全ての値が”０”である平文のダンプリストを示すテーブルである。図１０は、暗号化キーを”Ｗｉｔｈｏｕｔ  ＩＶ”とし、本発明「Ｐｉ＋＋」の第１の実施の形態（初期化ベクルトＩＶ無し）により図９の平文を暗号化して得た暗号文のダンプリストを示すテーブルである。また図１１は、暗号化キーを”Ｐｒｉｖａｔｅ”とし、本発明「Ｐｉ＋＋」の第１の実施の形態（初期化ベクルトＩＶ無し）により図９の平文を暗号化して得た暗号文のダンプリストを示すテーブルである。図１０と図１１を参照して明らかなように、全てのデータを完全に同じである図９の平文であっても、本発明「Ｐｉ＋＋」の第１の実施の形態により暗号化すれば、完全に乱数化された暗号文を得ることができる。
【００５２】第２の実施の形態
現在のＩＶ無しの対称暗号（ストリーム暗号）は、同じキーは必ず同じキーストリームを生成する、という重大な問題を常に抱えている。つまり、ストリーム暗号の中で同じキーを繰り返して使用することは、ワンタイムパット（ｏｎｅ  ｔｉｍｅ  ｐａｄ，ＯＴＰ）を再度使用するのと同じく、暗号の安全性を損なう。
【００５３】    そのような問題を解決するために、初期化ベクルト（Ｉｎｉｔｉａｌｉｚａｔｉｏｎ  Ｖｅｃｔｏｒｓ，ＩＶ）の概念（ｃｏｎｃｅｐｔ  ｏｆ  ｉｎｉｔｉａｌｉｚａｔｉｏｎ  ｖｅｃｔｏｒｓ）は不可欠である。本発明「Ｐｉ＋＋」の第２の実施の形態は、基本的な実施の形態である前述の第１の実施の形態に初期化ベクルトの概念を加えることにより、そのような重大な問題を解決できるようにしたものである。初期化ベクルト（ＩＶ）は、暗号の出力中の乱数性を増加させるために使用される乱数の値である。ＩＶは不規則（ｒａｎｄｏｍ）でユニークな値であるので、第２の実施の形態では、暗号化毎に同じキーが使用されたとしても、ストリーム暗号の出力は暗号化の都度に相違する。キーの変更が高いコストなプロセスである場合、そのような初期化ベクルトの概念の適用は非常に有用である。初期化ベクルトＩＶを備えた本発明「Ｐｉ＋＋」の第２の実施の形態は、基本的実施の形態（ｐｒｏｔｏｔｙｐｅ）である第１の実施の形態の変形である。第２の実施の形態はただＩＶ（初期化ベクルト）の入力部を持っているのに対し、第１の実施の形態はＩＶ入力部を持たない点で両者は相違する。すなわち、第２の実施の形態は平文と個人のキーとＩＶという３つのデータの入力部を持っているのに対し、第１の実施の形態は平文と個人のキーという２つのデータの入力部だけを備えている。
【００５４】  両実施の形態の違いについて、さらに以下で説明する。この発明の第２の実施の形態は基本的な実施の形態である第１の実施の形態にＩＶを加えたものである。この第２の実施の形態において、ＩＶのサイズは１２８ｂｉｔｓ（１６ｂｙｔｅｓ）で、同じＩＶに対して、重複して使わない。そして、ＩＶは乱数であること。この場合、暗号化毎に同じキーが使用されても、異なるＩＶは異なる結果を生成する。
【００５５】  第２の実施の形態におけるＩＶのサイズは１２８ビット（１６バイト）である。その１２８ビット（１６バイト）は、ＩＶの第１のバイトで始まる４つのワード（４×３２）に分割される。キースケジュールアゴリズム（Ｋｅｙ  Ｓｃｈｅｄｕｌｅ  Ａｌｇｏｒｉｔｈｍ）では、第１のワード（ｗｏｒｄ）は更新変数Ｍｉｘ３２の初期の値として扱われる。第２のワード（ｗｏｒｄ）はインデックスポインターｘの初期の値として扱われる。第３のワード（ｗｏｒｄ）はインデックスポインターｙの初期の値として扱われる。第４のワード（ｗｏｒｄ）は変数Ｉｎｄｅｘ２の初期の値として扱われる。上に記述されたすべての４つのワード（ｗｏｒｄ）は、キースケジュールアルゴリズム（Ｋｅｙ  ｓｃｈｅｄｕｌｅ  ａｌｇｏｒｉｔｈｍ）において初期値として使用されるだけである。
本発明「Ｐｉ＋＋」の第２の実施の形態は第１の実施の形態と比べると、キースケジュールアルゴリズム（ｋｅｙ  ｓｃｈｅｄｕｌｅ  ａｌｇｏｒｉｔｈｍ）の交換アルゴリズム１における更新変数Ｍｉｘ３２の算法に関し、次の相違がある。
１）相違１
Ｍｉｘ３２＝Ｍｉｘ３２  ＸＯＲ  Ｉｎｄｅｘ２―――――第２の実施の形態（初期化ベクルトＩＶ付き）
Ｍｉｘ３２＝Ｍｉｘ３２＋Ｉｎｄｅｘ２―――――第１の実施の形態（初期化ベクルトＩＶ無し）
２）相違２
キースケジュールアゴリズムにおいて、全ての交換プロセス、つまりｓｗａｐ１とｓｗａｐ２のプロセスが実行し終わった後、第２の実施の形態で生成された変数は第１の実施の形態で生成されたのと違い、インデックスポインターｘも生成される。即ち、第２の実施の形態はインデックスポインターｙと、更新変数Ｍｉｘ３２と、インデックスポインターｘを生成するが、第１の実施の形態はインデックスポインターｙと更新変数Ｍｉｘ３２だけを生成する。
上に言及されたように、動態Ｓ−ｂｏｘの中の要素交換が実行し終わった後に、インデックスポインターｘは以下に記述された関数に基づいて、生成される。
ＬＳＢＳ＝（Ｉｎｄｅｘ２＞＞８）ｍｏｄ  ３２      （８．０）
ｘ＝ＲＯＴＬ３２（ｘ，ＬＳＢＳ）
ｘ＝ｘ  ＸＯＲ  ＤＭ［ｆｉｘ（ｘ＞＞２４）］ＸＯＲ  ＤＭ［ｆｉｘ（ｘ）］
上記の式（８．０）のＬＳＢＳ＝（Ｉｎｄｅｘ２＞＞８）ｍｏｄ  ３２のように、前記［３］の欄で説明した最後に得られた変数Ｉｎｄｅｘ２を８ビットの右シフトした後にモジュロ３２（ｍｏｄ  ３２）の操作を行うことにより、ＬＳＢＳを得る。そして、ｘ＝ＲＯＴＬ３２（ｘ，ＬＳＢＳ）のように、新たなｘを得る。新たなｘの最上位バイトと最下位バイト（Ｌｅａｓｔ  ｓｉｇｎｉｆｉｃａｎｔ  ｂｙｔｅ）に分ける分割の処理を行い、この分割で得られた２バイトの値（ｔｗｏ  ｂｙｔｅｓ  ｖａｌｕｅｓ）を夫々アドレスとして扱い、動態Ｓ−ｂｏｘにおけるこれら２つのアドレスから夫々の３２ビットのワード（ｔｗｏ  ２３−ｂｉｔ  ｗｏｒｄｓ）を取得する。ここまでのプロセスの後に、上記式（８．０）のｘ＝ｘ  ＸＯＲ  ＤＭ［ｆｉｘ（ｘ＞＞２４）］ＸＯＲ  ＤＭ［ｆｉｘ（ｘ）］のように、３つの３２ビットのワード（ｔｈｒｅｅ  ３２−ｂｉｔ  ｗｏｒｄｓ）について２つの排他的論理和演算を実行し、インデックスポインターｘを生成する。このように、キーストリーム生成アルゴリズム用のインデックスポインターｘが得られる。第２の実施の形態でのインデックスポインターｙ及び更新変数Ｍｉｘ３２の生成は第１の実施の形態でそれらの変数の生成と同じである。使われるインデックスポインターｘ及びｙ及び変数Ｍｉｘ３２は一度だけ使用され、それらの値が知られることはない。
３）相違３
本発明「Ｐｉ＋＋」の第２の実施の形態は第１の実施の形態と比べると、キーストリーム生成アルゴリズムにおけるインデックスポインターｘの生成に関し、次の相違がある。
ｘ＝ｘ  ＸＯＲ  ＤＭ［ｉ］―――――第２の実施の形態（初期化ベクルトＩＶ付き）
ｘ＝ＤＭ［ｉ］―――――――――第１の実施の形態（初期化ベクルトＩＶ無し）
以上に第１及び第２の実施の形態間の相違を説明した図１２は、暗号化キーを”Ｗｉｔｈｏｕｔ  ＩＶ”とし、本発明「Ｐｉ＋＋」の第２の実施の形態（初期化ベクルトＩＶ付き）により図９の平文を暗号化して得た暗号文のダンプリストを示すテーブルである。また図１３は、暗号化キーを”Ｐｒｉｖａｔｅ”とし、本発明「Ｐｉ＋＋」の第２の実施の形態（初期化ベクルトＩＶ付き）により図９の平文を暗号化して得た暗号文のダンプリストを示すテーブルである。図１２及び図１３を参照して明らかなように、全てのデータが完全に同じである図９の平文であっても、本発明「Ｐｉ＋＋」の第２の実施の形態により暗号化すれば、完全に乱数化された暗号文を得ることができる。
【００５６】［１３］第３の実施の形態
本発明「Ｐｉ＋＋」の第３の実施の形態は、基本的な実施の形態である第１の実施の形態に、認証と初期化ベクルトＩＶを追加したものである。データ送信プロセスの間にデータを安全に送信すること、そして送信者が送信したデータと受信者が受信したデータとが同一であることが、最も一般的な実際生活のセキュリティ問題である。近代社会では、私たちの周りの多くの部分がセキュリティ保護を要求する。例えば、インターネットは、暗号化及び認証の両方を要求する例の一つである。初期化ベクルトＩＶ及び認証の両方の機能を備える本発明「Ｐｉ＋＋」の第３の実施の形態は、インターネット及び携帯電話のような電子式送信装置における暗号化及び認証の必要条件を満たすことを目的している。
【００５７】  この本第３の実施の形態は、暗号化及び認証の両方の有効な組み合わせをインプリメントする柔軟な組み合わせ方式（ｃｏｍｂｉｎａｔｉｏｎ  ｍｅｔｈｏｄｏｌｏｇｙ）を提供する。この第３の実施の形態の「Ｐｉ＋＋」発明は、ストリーム暗号Ｐｈｅｌｉｘの中で利用された平文の認証ではなく、暗号文の認証を使用する。基本的な実施の形態に初期化ベクトルＩＶを加えた第２の実施の形態は、平文を暗号化するために使われ、そして暗号文のＭＡＣ（Ｍｅｓｓａｇｅ  Ａｕｔｈｅｎｔｉｆｉｃａｔｉｏｎ  Ｃｏｄｅ，メッセージ認証コード）はＨＭＡＣ  ａｌｇｏｒｉｔｈｍのような暗号文のＭＡＣ  ａｌｇｏｒｉｔｈｍによって生成される。その後、暗号文及び暗号文のＭＡＣの両方は受信者へ送られる。受信者は、送信者が使用したものと同じアルゴリズムの使用により、最初に暗号文をチェックする。暗号文のＭＡＣが異なる場合、暗号文は解読する必要無しで削除される。そのような容易で明瞭で、簡潔な方法の使用によって、上に記述された問題は容易に回避することができる。ＭＡＣ（メッセージ認証コード）は、データの整体性（ｉｎｔｅｇｒｉｔｙ）及びメッセージの信頼性（ａｕｔｈｅｎｔｉｃｉｔｙ）の両方を同時に検証する（ｖｅｒｉｆｙ）ために使用される。ＳＨＡファミリーのようなセキュリティハッシュ関数（ｃｒｙｐｔｏｇｒａｐｈｉｃ  ｈａｓｈ  ｆｕｎｃｔｉｏｎ）はＭＡＣの計算の中で使用される。ＭＡＣの暗号強度は、根本的なハッシュ関数の暗号強度、キーのサイズと質、及びハッシュ関数出力のビット長さのサイズに依存する。
【００５８】  以上に実施の形態を挙げ、具体的に説明したように、ＬＦＳＲｓ方法を使わないで、動態Ｓ−ｂｏｘ（Ｄｙｎａｍｉｃ  Ｓ−ｂｏｘ）・動態フリップ（Ｄｙｎａｍｉｃ  ｆｌｉｐ）・動態シフト（Ｄｙｎａｍｉｃ  ｓｈｉｆｔ）・動態更新（Ｄｙｎａｍｉｃ  ｕｐｄａｔｅ）・動態循環シフト（Ｄｙｎａｍｉｃ  ｃｉｒｃｕｌａｒ  ｓｈｉｆｔ）といった全て動態的な概念を一貫に利用する本願発明は、安全性に関する懸念を回避することができると同時に、ワード（ｗｏｒｄ）とバイトの操作（ｂｙｔｅ  ｍａｎｉｐｕｌａｔｉｏｎｓ）だけを使用することにより、ソフトウェア及びハードウェア双方の実現をはるかに容易にする。前記第１の実施の形態で使用されるメモリ空間は、主として動態Ｓ−ｂｏｘ用のＤＭ［０］からＤＭ［２５５］まで及ぶ２５６のｗｏｒｄｓ（２５６×３２ビット（ｂｉｔｓ））である。その最２５６バイトのメモリ空間はＫＥＹ［０］からＫＥＹ［２５５］までの秘密キーと、整数インデックスポインターｘと、整数インデックスポインターｙと、更新変数Ｍｉｘ３２と、少数の整数変数とに使用される。１ワードに関するモジュロ２５６（ｍｏｄｕｌｏ  ２５６  ｏｎ  ａ  ｗｏｒｄ）はそのワードをｂｉｔｗｉｓｅ  ａｎｄ  ｗｉｔｈ  ２５５（ワード“ｂｉｔｗｉｓｅ  ａｎｄ  ｗｉｔｈ”２５５）行うことである。
【００５９】  本発明では、動態Ｓ−ｂｏｘ（Ｄｙｎａｍｉｃ  Ｓ−ｂｏｘ）・動態フリップ（Ｄｙｎａｍｉｃ  ｆｌｉｐ）・動態シフト（Ｄｙｎａｍｉｃ  ｓｈｉｆｔ）・動態更新（Ｄｙｎａｍｉｃ  ｕｐｄａｔｅ）・動態循環シフト（Ｄｙｎａｍｉｃ  ｃｉｒｃｕｌａｒ  ｓｈｉｆｔ）並びにインデックスポインターｘ及びｙを組み合わせることによって、実際の動態Ｓ−ｂｏｘを得ることができる。動態Ｓ−ｂｏｘには、０から２３２−１までの範囲の２３２個の３２ビットの要素があると見え、また、全ての要素の配列（ｐｅｒｍｕｔａｔｉｏｎｓ）はいつも変わっている。本発明「Ｐｉ＋＋」は、ソフトウェアで、若しくはハードウェアで、又は両方の組み合わせで、インプリメントされる（ｉｍｐｌｅｍｅｎｔｅｄ）ことが可能である。ここに記述された暗号化及び復号化アルゴリズムは、例示であり、本発明は、前述の特定の実施例、又は実施例の組み合わせに制限されない。例えば、動態Ｓ−ｂｏｘの具体例で挙げた３２ビットｗｏｒｄｓは３２×２５６ビットのサイズに相当するが、本発明「Ｐｉ＋＋」では、必要に応じて、６４×２５６ｂｉｔｓのサイズに相当するように、動態Ｓ−ｂｏｘを６４ビットｗｏｒｄｓに拡張することは容易にできる。言いかえれば、この発明は、６４ビットのシステム・アーキテクチャーによって提示された能力（ｐｅｒｆｏｒｍａｎｃｅ）の有利性を完全に利用することができるのであって、動態Ｓ−ｂｏｘの６４×２５６ビットのサイズに対応する６４ビットのｗｏｒｄのサイズで構成できる。更に言えば、より大きな内部状態を備えた６４ビットワードでのこの発明の実施は、高いセキュリティを保証し、処理速度をはるかに高速にし、またより多くの他の長所を提供する。私たちは、『別々に記述されたアルゴリズムに基づくことだけによって、本発明のストリーム暗号「Ｐｉ＋＋」は、ＲＣ４と同等の軽さを持つだけでなく、ＲＣ４より少なくとも３又は４倍速い暗号である。』と宣言できる。
【００６０】  本願発明は、具体的に詳しく説明した前述の実施の形態に制限されるものではなく、特許請求の範囲に記載した範囲において各種の変形が可能であることを、ここに改めて確認する。
【図面の簡単な説明】
【００６１】
【図１】本発明の第１の実施の形態による暗号化プロセスを示す流れ図である。
【図２】第１の実施の形態による復号化プロセスを示す流れ図である。
【図３】交換アルゴリズム１による交換プロセスを示す図である。
【図４】交換アルゴリズム２による交換プロセスを示す図である。
【図５】インデックスポインターｙ生成プロセスを示す図である。
【図６】更新変数Ｍｉｘ３２生成プロセスを示す図である。
【図７】キーストリーム生成アルゴリズムを示す図である。
【図８】図１乃至図７における記号を説明する図である。
【図９】全ての値が“０”である平文のダンプリストを示すテーブルである。
【図１０】暗号化キーを”ｗｉｔｈｏｕｔ  ＩＶ”とし、本発明「Ｐｉ＋＋」の第１の実施の形態（初期化ベクルトＩＶ無し）により図９の平文を暗号化して得た暗号文のダンプリストを示すテーブルである。
【図１１】暗号化キーを”Ｐｒｉｖａｔｅ”とし、本発明「Ｐｉ＋＋」の第１の実施の形態（初期化ベクルトＩＶ無し）により図９の平文を暗号化して得た暗号文のダンプリストを示すテーブルである。
【図１２】暗号化キーを”ｗｉｔｈｏｕｔ  ＩＶ”とし、本発明「Ｐｉ＋＋」の第２の実施の形態（初期化ベクルトＩＶ付き）により図９の平文を暗号化して得た暗号文のダンプリストを示すテーブルである。
【図１３】暗号化キーを”Ｐｒｉｖａｔｅ”とし、本発明「Ｐｉ＋＋」の第２の実施の形態（初期化ベクルトＩＶ付き）により図９の平文を暗号化して得た暗号文のダンプリストを示すテーブルである。
【符号の説明】
【００６２】１        動態Ｓ−ｂｏｘ（図では、ＤＭと簡略表記）
２        キー入力
３        動態Ｓ−ｂｏｘにおける要素交換
４        要素交換３より得られた動態Ｓ−ｂｏｘの最終配列（ｆｉｎａｌ  ｐｅｒｍｕｔａｔｉｏｎの一時記憶
５        インデックスポインターｙ及び更新変数Ｍｉｘ３２の取得
６        キーストリーム生成前の準備
７        キーストリーム生成
８        平文入力
９        暗号化
１０      暗号文出力
１０１    初期化された動態Ｓ−ｂｏｘ（Ｉｎｉｔｉａｌｉｚｅｄ  Ｄｙｎａｍｉｃ  Ｓ−ｂｏｘ）
１０２    秘密キー
１０３    要素交換された動態Ｓ−ｂｏｘ
１０４    要素交換３より得られた動態Ｓ−ｂｏｘの最終配列（Ｆｉｎａｌ  ｐｅｒｍｕｔａｔｉｏｎ  ｏｆ  Ｄｙｎａｍｉｃ  Ｓ−ｂｏｘ）
１０５    インデックスポインターｙ及び更新変数Ｍｉｘ３２
１０６    更新した動態Ｓ−ｂｏｘ及びインデックスポインターｙと更新変数Ｍｉｘ３２
１０７    キーストリーム（Ｋｅｙｓｔｒｅａｍ）
１０８    平文（Ｐｌａｉｎｔｅｘｔ）
１０９    暗号文（Ｃｉｐｈｅｒｔｅｘｔ）
５０７    暗号文入力
５０８    復号化
５０９    平文出力
１０００  パイ・データ（Ｐｉ  ｄａｔａ）
２０００  秘密キー（Ｋｅｙ）
５００７  暗号文（Ｃｉｐｈｅｒｔｅｘｔ）
５００８  平文（Ｐｌａｉｎｔｅｘｔ）
【図１】
0005044848.tif 000002
【図２】
0005044848.tif 000003
【図３】
0005044848.tif 000004
【図４】
0005044848.tif 000005
【図５】
0005044848.tif 000006
【図６】
0005044848.tif 000007
【図７】
0005044848.tif 000008
【図８】
0005044848.tif 000009
【図９】
0005044848.tif 000010
【図１０】
0005044848.tif 000011
【図１１】
0005044848.tif 000012
【図１２】
0005044848.tif 000013
【図１３】
0005044848.tif 000014