2010年11月26日金曜日

全単射写像拡大による擬似乱数生成法

暗号論的擬似乱数を置換と連結だけという非常に原始的なアプローチで生成しました。
このブログは、その生成法と応用について述べるものです。

1. はじめに

コンピュータで使用される乱数は擬似乱数といって乱数の種(シード)をもとに確定的な計算によって作られています。
ですから、同じシードを使えば同じ乱数列を再現できます。またシードの大きさや生成法によって出力の周期があって当然、周期が短いものは解読され易くなります。
儀似乱数でもその方式と過去の出力が既知であれば未来の出力を予測可能なものは暗号学的に安全ではないとして、暗号論的擬似乱数とは差別されます。
「暗号アルゴリズムはその仕組みが一般に公表されることによって強度が失われてはならない」というケルクホフスの原理というものがあって、現代の暗号水準では方式を秘密とすることは採用されません。
公開して尚かつ安全である方式とは、逆算のための計算時間量の膨大さで保証される一方向性を持つ方式であることです。
また、wikipediaでは、誕生日のパラドックスについて
ブロック暗号アルゴリズムをCTRモードで使用した擬似乱数生成器は、ブロック長をLとしたときに、2の(L/2)乗程度のブロック分の乱数出力を行うと2分の1の確率で真の乱数と区別できる。
真の乱数は誕生日のパラドックスから、2の(L/2)乗ブロック分の乱数の中に同じ値を持つブロックが約2分の1の確率で存在する。
とも説明しています。
これを私は、整列した情報に対して真の乱数は周期を持たず不規則で一様分布する範囲を定められないと解釈します。
暗号理論では、一様分布であることと過去の出力から次の出力の最初のビットが0か1かを予測不能であることは同値で、一様分布とは サイコロを振ったときの出目など、すべての事象の起こる確率が等しいものを云い、以下に述べるいくつかの表で原像(初期値)と全単射写像(出力)との一対一対応とは同じことです。

2. 置換と連結だけの擬似乱数生成法

以下の2.1から2.3は特願2010-248228「全単射写像拡大による擬似乱数生成法」の明細書を、もう一度書いたものです。
これは整数を自身の値で値域を拡大しながら擬似乱数を作るもので、そこでは一様分布でも過去の出力から初期値を逆算出来るものを、擬似乱数と云わずに単に全単射写像と表現し、一方向性を持つものを擬似乱数と云っています。

その要約書は
【要約】一つの2ビット値をもう一つの2ビット値をもとに換字と並べ替えで置換したものはこれらの組み合わせをEXOR演算した値と共にベクトルとも云えるパターンを持つ。
ベクトルを選択して並べることで原像よりも拡大された全単射写像を作ることが出来る。
また変換することなく原像の情報を取り出し二重に連結することでも、原像よりも拡大された全単射写像を作ることが出来る。
こうして作られた2つの全単射写像の各ビットをEXOR演算したものがやはり全単射写像である時、これを原像に復元することが直線的には出来ず一方向性を持つと言える。

というものです。

換字と並べ替えによる置換はシャノンのSPN構造と呼ばれていて、循環と方向性をもっていることが特徴です。
循環は現れるベクトルが限定又は固定されるということであり、方向性を選択することで他のベクトルにない独自の変換ルーチンを作ることができます。
また、攪拌や長周期化などの暗号化手法を用いない単純な方法で分かりやすく整然と乱数を生成します。

2.1 並べ替えと連結だけの全単射写像

まず最も簡単なものとして、6ビット情報を変換することなしに8ビットの全単射写像に拡大して下に示す。
2ビットを1単位として4つの変数A、B、C、Dのそれぞれが1ビットの情報を持つこととしてAB、CDの2つのブロックとする。
それぞれ1ビットの情報を持つ変数YとZを追加して6ビット情報とし、AB、CDのブロックに付け加えられる。
ABYZの値の4ビットとCDYZの4ビットの計8ビットをABYZCDYZの順に並べたものが表1です。
Y、Z、AとB、C、Dの組み合わせは64通りあって、行見出しにYZAの値を、列見出しにBCDの値を示しています。
表1の各値はYZABCDの値と一対一対応していてYZABCDの全単射写像といえる。
表2は表1の各値を16進数で表現したものです。
【表1】

【表2】

ちなみにYZABCDに加えて変数W、Xがそれぞれ1ビットの情報を持つこととして計8ビットの情報を変換することなしに16ビットの全単射写像に拡大するには先のABYZCDYZを2ビットずつに区切ってABWXYZWXCDWXYZWXというように並べればよい。
原像の、逆像ともいいますが、WXYZABCDに復元するのは簡単で説明を省きます。

2.1.1 方向性を持つと言うこと

さて換字と並べ替えで置換することの前にABCDの順に並んだ各値の組み合わせがどのような値を作るかを見てみます。
何故かと言うと、それらから原像のABCDを逆算できるからです。
(一様分布の全単射写像を作るには原像を逆算できることが条件です。)
下の表3は変数a、b、c、dのそれぞれが1ビットの情報を持つこととして、それらの組み合わせをEXOR演算したものです。
【表3】

a、b、c、dの各ビットを取り出し、並べ替えてEXOR演算することによって、異なるパターンでa、b、c、d各値に対応する11の変換がある。
それらをベクトルということにして1から11の添え字をつけてベクトルV(1)のように表現するのだが、後でこれらを組み合わせ何度か計算するので、解りやすくするためにa^bを mといい、a^cを oと、a^dを pと、b^cを qと、b^dを rと、c^dを nということにする。
それ以外にa^b^cは iと、a^b^dは jと、a^c^dは hと、b^c^dは gといい、そしてa^b^c^dを sということにする。
そしてこれ以降m、o、p、q、rなどはそれぞれ独自のパターンについての名前とし、オペランドを変化させたときの各ベクトルの状態についてはベクトルV(1)からベクトルV(11)などと表現することとする。

次にa、b、c、dを換字と並べ替えで変換する手順について下の表4を用いて説明する。
表4の右半分は表3と同じです。

2.1.2 SubstitutionとPermutation

変換手続きには、各2ビットのレジスタ1とレジスタ2、そして作業レジスタを用意する。
その変換規則は
1.レジスタ1とレジスタ2の値をEXOR演算してその値を作業レジスタにストアする。
2.もしレジスタ2の各ビットの値が等しければ作業レジスタの値をそのまま、もしそうでなければ作業レジスタの値を上下入れ替える。
3.レジスタ2の値をレジスタ1に移動し、作業レジスタの値をレジスタ2に移動する。
4.作業レジスタの値を出力するか、又は繰り返し実行する。
というものである。

以下、レジスタ1の値をレジスタ2でEXOR演算しレジスタ2の各ビットの比較演算値で並べ替えを選択するという一連の操作をXOR-P(permutation)演算と言い、情報abの値をレジスタ1にストアし、情報cdの値をレジスタ2にストアしてXOR-P演算することを、レジスタ1情報abをレジスタ2情報cdでXOR-P演算すると言うことにする。
【表4】

表4は00から11までの2ビット情報を持つレジスタ1情報abを同じく00から11までの2ビット情報を持つレジスタ2情報cdでXOR-P演算を繰り返した途中経過を遷移表で表したものです。
表4の1列目はレジスタ1の初期状態abの値であり、2列目はレジスタ2の情報cdである。
以下で説明する遷移表についても1列目はレジスタ1の初期状態のビット値であり、2列目はレジスタ2のビット値である。
表4の3列目はefと名付けられていて、レジスタ1情報abをレジスタ2情報cdでXOR-P演算した作業レジスタの値の状態である。
それ以降はレジスタ1とレジスタ2の情報を入れ替えてXOR-P演算を実行する度の、作業レジスタの値の状態ごとにgh、ij、klと名前を付けた。
この変換は最大でも6回で循環するため7列目は省略する。
XOR-P演算の順序を違えてレジスタを入れ替えてからEXOR演算した場合、3列目と6列目の値の状態が交換されるだけであって大きな差異はない。

gは表3で説明したb^c^dと同じで、hはa^c^dと、iはa^b^cと、jはa^b^d と同じです。
しかしe、f、k、lはa、b、c、dをEXOR演算するだけでは生成されない。
そして、これらのベクトルもe、f、k、lはab、cdをオペランドとした時のそれぞれのパターン名であり、オペランドを変化させたときの各ベクトルの状態についてはベクトルU(1)からベクトルU(8)などと表現することとする。

下の表5はe、f、k、lの各ベクトルを順に並べたものが abと cdの2ビット値に対応する様子を示すもので、行見出しは abの値であり列見出しは cdの値である。
表5ではefklがabcdと一対一対応せず2対1対応していて、efklの値からabcdを求められないのは後出の表10を見れば解る。
【表5】

2.2 換字と並べ替えの全単射写像

それでは、さきのY、Z、A、B、C、DについてXOR-P演算をして6ビット情報を8ビットの全単射写像に拡大する。
ここでもAB、CDにYZが付け加えられたものとして考える。
下の表6はi、j、k、lの各ベクトルを順に並べたものが abと cdの2ビット値に対応する様子を示すもので、行見出しは abの値であり列見出しは cdの値である。
ijklがabcdと一対一対応しているのが解る。
【表6】

ABを第1オペランドとし、CDを第2オペランドとしてXOR-P演算をしてベクトルU(5)とベクトルU(6)そしてベクトルU(7)とベクトルU(8)の4ビットを求める。
即ちこれらはabcdの全単射写像ijklであってこれらをIJKLということにする。
表1、表2で全単射写像拡大したときABYZとCDYZを取り出して示したが、今回の全単射写像拡大にはABCDの全単射写像IJKLを2ビットずつに分割してYZを作用させIJ,YZとKL,YZをそれぞれXOR-P演算する。

IJを第1オペランドとし、YZを第2オペランドとしてXOR-P演算をしてベクトルU(1)とベクトルU(2)そしてベクトルU(7)とベクトルU(8)の4ビットを求める。
これらは表5で2対1対応すると説明したe、f、k、lのことである。

つぎにKLを第1オペランドとし、やはりYZを第2オペランドとしてXOR-P演算をしてベクトルU(5)とベクトルU(6)そしてベクトルU(7)とベクトルU(8)の4ビットを求める。
これらは表6で一対一対応すると説明したi、j、k、lのことである。

これら8ビットを16進数で表したのが表7です。
行見出しは YZAの値であり列見出しは BCDの値です。
表7の各値はYZABCDの値に一対一対応していてYZABCDの全単射写像といえる。
【表7】

つぎに変数W、Xがそれぞれ1ビットの情報を持つこととしてW、X、Y、Z、A、B、C、DについてXOR-P演算をして8ビット情報を16ビットの全単射写像に拡大する。
さきのY、Z、A、B、C、Dについての8ビットの全単射写像をMNOPQRSTとする時、
MNOPQRSTを2ビットずつに分割してWXを作用させる。
MNを第1オペランドとし、WXを第2オペランドとしてXOR-P演算をしてベクトルU(1)とベクトルU(2)そしてベクトルU(7)とベクトルU(8)の4ビットを求める。
OPを第1オペランドとし、WXを第2オペランドとしてXOR-P演算をしてベクトルU(1)とベクトルU(2)そしてベクトルU(7)とベクトルU(8)の4ビットを求める。
QRを第1オペランドとし、WXを第2オペランドとしてXOR-P演算をしてベクトルU(1)とベクトルU(2)そしてベクトルU(7)とベクトルU(8)の4ビットを求める。
最後にSTを第1オペランドとし、やはりWXを第2オペランドとしてXOR-P演算をしてベクトルU(5)とベクトルU(6)そしてベクトルU(7)とベクトルU(8)の4ビットを求める。
これら16ビットを16進数で表したのが表8です。
行見出しは YZWXの値であり列見出しは ABCDの値です。
表の各値はWXYZABCDの値に一対一対応していてWXYZABCDの全単射写像といえる。
【表8】

先に作った全単射写像を利用すれば、上記と同じように2ビットの変数を増やして2倍のビット数の全単射写像を出力できるのは当然でこれ以上の説明はしない。

2.2.1 全単射写像は一方向性でない

つまり上記の全単射写像拡大の手続きはNビットの変数について2の(N÷2)乗ビットの全単射写像を出力する。
また、最後の1ビットが出力されるまで原像(初期値)を決定することが出来ない。
しかし、最後の1ビットが出力されたとき変数全体の値が解ることになり次のビットの値を予測することができる。
さきのY、Z、A、B、C、Dの全単射写像についての原像復元手続きは以下の通りである。

Y、Z、A、B、C、Dについての8ビットの全単射写像をMNOPQRSTとする時、
QRSTはKLを第1オペランドとしYZを第2オペランドとしてXOR-P演算をしたベクトルU(5)、ベクトルU(6)、ベクトルU(7)、ベクトルU(8)であって
ベクトルU(5)、ベクトルU(6)即ちベクトルijを第1オペランドとしベクトルU(7)、ベクトルU(8)即ちベクトルklを第2オペランドとしてXOR-P演算をした遷移表が下の表9であることから
【表9】

QRを第1オペランドとしSTを第2オペランドとしてXOR-P演算をしたベクトルU(1)、ベクトルU(2)、ベクトルU(3)、ベクトルU(4)がKLYZである。
つぎにMNOPはIJを第1オペランドとし、YZを第2オペランドとしてXOR-P演算をしてベクトルU(1)とベクトルU(2)そしてベクトルU(7)とベクトルU(8)であるけれども、
ベクトルU(1)、ベクトルU(2)即ちベクトルefを第1オペランドとし、ベクトルU(7)とベクトルU(8)即ちベクトルklを第2オペランドとしてXOR-P演算をした遷移表が下の表10であるのでMNOPだけからIJを求めることは出来ない。
【表10】

そこでPOを第1オペランドとし、先に求めたZYを第2オペランドとしてXOR-P演算をする。
これはベクトルlkを第1オペランドとし、dcを第2オペランドとしてXOR-P演算をしたものと同じでありベクトルU(2)、ベクトルU(1)がIJであることは表11の遷移表で解る。
【表11】

こうして求められたIJKLを表9のとおりXOR-P演算をしたベクトルU(1)、ベクトルU(2)、ベクトルU(3)、ベクトルU(4)がA、B、C、Dである。
こうして直線的に元のY、Z、A、B、C、Dが求まる。

2.3 二つの全単射写像を合成した擬似乱数は一方向性を持つ

さて、最初に述べた表2の全単射拡大写像とさきの表7の全単射拡大写像の各値をそれぞれEXOR演算したものが表12である。
表12の各値はYZABCDの値に一対一対応していてYZABCDの全単射写像といえる。

【表12】

表2の全単射拡大写像はABYZCDYZであり、表7の全単射拡大写像MNOPQRSTはYZABCDを変換したものであって、どちらもYZABCDの全単射拡大写像である。
ABYZCDYZの値か又はMNOPQRSTの値をもとに表12の値からYZABCDの値を求めようとしても、YZABCDの値を知らなければABYZCDYZの値か又はMNOPQRSTの値を生成できない。
ABYZCDYZとMNOPQRSTをEXOR演算した表12の各値は直線的な原像復元手続きの無いYZABCDの全単射拡大写像です。
写像と原像との対応を知るためには表12が必要で、これは表12の各値からYZABCDの値を知るには全鍵検索をしなければならないということです。

悪意のある解読者がいたとしても、解読者が予め表12を準備することができないなら、YZABCDの値を増分するなどと予告されていて上記と同じ手続きで新しい8ビットが出力されても、その最初のビットが0か1かさえ予測することは出来ない。
ビット数を大きくして初期値(シード)の値を知るためのコンピュータ的時間量が膨大になれば、たとえアルゴリズムが全て公開されていて解読者が全く同じ擬似乱数生成器を持っていたとしても解読者は秘密であるべき原像の値を知ることなしに同じ擬似乱数を再現することは出来ないし原像の値の変更とその増分数が分かっても未来の出力を予測することもできない。
全鍵検索をしなくては原像の値を知ることの出来ないこの全単射拡大写像は暗号論的擬似乱数です。

3 逆算のための計算時間量と一方向性

「全単射写像拡大による擬似乱数生成法」で初期値(シード)のビット数が大きくなればなるほど全鍵検索は困難になります。
Nビットについて2の(N÷2)乗ビットの全単射写像を出力するために、その前の(N-2)ビットの全単射写像を作り、それぞれを2倍に拡大する必要があります。
つまり、擬似乱数を作るには(2+4+8+‥+2のN乗)回のXOR-P演算が二つとEXOR演算が必要で(2+4+8+‥+2のN乗)はNが大きくなればその2倍に近くなる。
直線的な原像復元手続きが無い、つまり逆算できないのですから、Nビットの初期値(シード)を見つけるために全鍵検索をして(2の(N+2)乗)×(2のN乗)回のXOR-P演算をしなければなりません。
現在最速の毎秒100テラフロップスパコンを1000年稼動し続けると(2の82乗)回の浮動小数点計算ができます。
乱暴にも、この最速スパコンで1秒に鍵を1兆回チェックできるとすれば、シードのビット数(N)が60のとき、
2の(19乗)秒が1年とすると1兆は2の40乗ですから、(2の60乗)の全鍵検索に2年ということになります。
もし、シードのビット数が120ビットなら誕生日攻撃を用いて同じ2年で鍵を見つけることができるかもしれない。

4 擬似乱数による暗号化

分かり易い擬似乱数生成法に現在はあまり使われていないV.ノイマンの 平方採中法があります。
ある桁数の乱数を乱数列の最初の数とし、これを2乗した数値の中央の同じ桁数を取り出した数字列を乱数列の2番目の数とする。以下、この手順を繰り返す。というものてす。
なぜ最初から乱数列が必要かというと、擬似乱数には循環の周期があって周期が短いと出力パターンがすぐに見つかり次に生成される乱数が予測されてしまうので初期値(シード)を吟味しなくてはいけないこと、同じシードを用いると同じ乱数が生成されるため同じシードは使えないことなど予め設計をしなければ安全な擬似乱数を生成することは出来ないのです。
暗号論的に安全な暗号手法を用いて擬似乱数を生成するにしても、或いはその周期を長くしたとしてもそれは同じです。
無理やり擬似乱数化するのですから擬似乱数をもとに暗号化する、という発想自体ありません。

一方、「全単射写像拡大による擬似乱数生成法」は予め設計をしたものではありません。
「全単射写像拡大による擬似乱数生成法」は、数とそれを置換したものの持つ自然の性質を利用しただけです。
そこで、この擬似乱数を使って暗号化することにします。

4.1 バーナム暗号あるいはワンタイムパッド

「バーナム暗号はストリーム暗号に属し、平文と鍵の各ビットごとに排他的論理和を取り暗号化を行うシンプルな方式である。しかし,鍵の秘匿により解読不可能となる非常に強力な暗号方式の一つである。」
これは何かからの引用です。
「暗号の安全性について数理的分析を行ったのは、シャノンによる1949年の論文「秘匿系での通信理論」が始まりとされる。シャノンは、暗号が情報理論的な意味で無条件に安全であるためには「平文サイズ≦鍵サイズ」を満たすことが必要十分条件であることを示した。この条件を満たすワンタイムパッドは、情報理論的に安全であるので、どれだけの暗号文を集めても、無限大の計算能力を持ってしても、解読できない。しかし、平文と同じサイズの秘密鍵を事前に通信者間で共有する必要があり、情報理論的に安全な暗号を維持運用にするには多くの費用がかかる。このため、情報理論的に安全な暗号は特別な用途を除いてあまり広くは使用されない。」
これも何かからの引用です。
それでは「全単射写像拡大による擬似乱数生成法」が「鍵の秘匿により解読不可能」な、そして真性乱数でなくても「平文サイズ≦鍵サイズ」で安全な暗号化をすることを示します。

4.1.1  2ビットを6ビットで暗号化

表4で示される各ベクトルを使用して表7と同じような擬似乱数を作ることが出来る。
例えばijklの代わりにmnogを用いて、
mnを第1オペランドとし、YZを第2オペランドとしてXOR-P演算をしてベクトルV(1)とベクトルV(6)そしてベクトルV(2)とベクトルU(3)の4ビットを求める。
これらは表4でm、n、o、gのことである。
つぎにogを第1オペランドとし、やはりYZを第2オペランドとしてXOR-P演算をしてベクトルV(1)とベクトルV(6)そしてベクトルV(2)とベクトルU(1)の4ビットを求める。
これらは表4でm、n、o、eのことである。
これら4ビットを連結して8ビットとする。。
このように作られる全単射拡大写像を下の表13に示す。

表13の各値はYZABCDの値に一対一対応していてYZABCDの全単射写像といえる。
暗号化とは直接の関係はありませんが、表13と表2の全単射拡大写像とをEXOR演算したものは表12と同様にYZABCDの値に一対一対応していて、これも擬似乱数といえます。
【表13】

それぞれ1ビットの変数W、Xの2ビットをYZABCDで暗号化する。
ワンタイムパッドの手法で通信先にYZABCDの6ビットが既に手渡されていることとする。
YZABCDで作られた表13の各値とABCDYZWXをEXOR演算したものが表14です。
WXの00~11の各値について表13の各8ビットがEXOR演算されるので16×16の大きさになります。

表14の各値は00~FFの値が一様分布していてWXYZABCDの値に一対一対応しているのが分かります。
【表14】

相手には表14の各値のうちの下位2ビット(W、XとEXOR演算したもの)を送る。
これはW、XをABCDYZの6ビットで暗号化したことなり、シャノンがいう「平文サイズ≦鍵サイズ」なので、この暗号化は安全である。

4.1.2  8ビットを8ビットで暗号化

次に、前出の表8で示したように表13の8ビット情報を16ビットの全単射写像に拡大する。
さきのY、Z、A、B、C、Dについての8ビットの全単射写像をMNOGmnoeとする時、
MN、OG、mn、oeの2ビットずつに分割してWXを作用させる。
MNを第1オペランドとし、WXを第2オペランドとしてXOR-P演算をしてベクトルV(1)とベクトルV(6)そしてベクトルV(2)とベクトルU(3)の4ビットを求める。
これらは表4でm、n、o、gのことである。
OGを第1オペランドとし、WXを第2オペランドとしてXOR-P演算をしてベクトルV(1)とベクトルV(6)そしてベクトルV(2)とベクトルU(1)の4ビットを求める。
これらは表4でm、n、o、eのことである。
mnを第1オペランドとし、WXを第2オペランドとしてXOR-P演算をしてベクトルV(1)とベクトルV(6)そしてベクトルV(2)とベクトルU(1)の4ビットを求める。
これらは表4でm、n、o、eのことである。
最後にoeを第1オペランドとし、やはりWXを第2オペランドとしてXOR-P演算をしてベクトルV(1)とベクトルV(6)そしてベクトルV(2)とベクトルU(1)の4ビットを求める。
これらは表4でm、n、o、eのことである。
これら16ビットを16進数で表したのが表15です。

表15の各値はWXYZABCDの値に一対一対応していてWXYZABCDの全単射写像といえる。
【表15】

8ビットのEFGHIJKLを平文として、表15の16ビット値とABCDYZWXEFGHIJKLをEXOR演算した各値は0000~FFFFの値が一様分布します。
256×256の大きさの表を示すことはしませんが、これは8ビットのEFGHIJKLをWXYZABCDの8ビットで暗号化したことなり、シャノンがいう「平文サイズ≦鍵サイズ」なので、平文と暗号化文の両方が既知でない限り、この暗号化は安全である。
初期値(シード)のビット数を大きくして「平文サイズ>鍵サイズ」にしたとしても、擬似乱数列のうちの初期値(シード)のビット数分を送信しないというこの方法では平文と暗号化文の両方が既知でない限り全鍵検索が無意味なのは同じです。

ところで、バーナム暗号は平文と鍵の各ビットごとに排他的論理和を取り暗号化を行うものですから平文と暗号化文の両方が既知であれば鍵が分かってしまいます。
しかし、この擬似乱数生成法による暗号化では、平文と暗号化文の両方が既知であっても全鍵検索をしなくては初期値(シード)を見つけることが出来ません。
また、表14で「平文サイズ<鍵サイズ」という具体的にイメージできない暗号化を目で見ることが出来ます。

ただし、これは同じ平文で同じ暗号化文を出力する鍵が他にもあるということで常識的には排除されるべきかもしれません。
しかし常識は変化するものです。
平文と鍵、そして暗号化文と鍵は必ず一対一に対応するという常識も変わらないとは言えない。

5.「平文サイズ<鍵サイズ」で4分の1知識証明 ?

以下のような暗号通信をすることができます。

たとえば送信者と受信者がいるとして、送信者はその始めての送受信の前、送信者との一致を裏付けるために自らの個人情報をハッシュ関数化したディジタル情報を可視化したメディア(バーコードや数字を書いた郵便物やそれらの写真を添付したメールなど)にして送付してあるものとする。(これは秘密を別のルートで送るというだけのことです。)
始めての送受信の際、受信者は送信者の求めに応じて2ビットの乱数情報を送付します。
送信者は先に送付したハッシュ関数化情報の内の6ビットをYZABCDとし、乱数情報の2ビットをW、Xとして表14の「平文サイズ<鍵サイズ」暗号化をして、下位2ビットを送る。
受信者は先のハッシュ関数化情報をディジタル化して送信者と同じ操作をし、送られた2ビットと照合し次のための2ビットの乱数情報を送付する。
送信者は次の6ビットと次の2ビットで暗号化した下位2ビットを送る。
既定の回数だけこれを繰り返し全ての照合が一致すれば、受信者は送付されたメディアのディジタル情報提供者と送信者との一致を認める。

さて、「平文サイズ<鍵サイズ」の暗号化は安全で、同じ平文で同じ暗号化文を出力する鍵が他にもあると言いました。
上の照合は偽の送信者を排除できることを示します。
YZABCDの値を知らない偽送信者の最も単純な攻撃法は既定の回数分のランダムなビットを送信することです。
この方法では受信者が偽送信者を受理する確率は回数が多くなればなるほど減少します。
(これはゼロ知識証明でも用いられている主張で、2ビット毎10回の照合のあとで偽送信者が受理される確率は100万分の1になると考えられます。)
そこで、偽送信者は表14を用意して送信者のやり方を模倣します。
表14が一様分布であることから分かるように、盗聴したWXの2ビット値についてYZABCDの組み合わせが64種類あり乱数で一つを選んで送信情報を作ったとしても送信情報は00~11の4種類のどれかです。
受信者が受理するのは、そのうちの一種類です。
これでは最も単純な攻撃法と同じ確率でしかありません。
それでは、正しい送信者が送信した後そのときの送信情報を用いて送信者のふりをします。
盗聴した送信情報とWXのおかげでYZABCDの組み合わせは16種類になりますが乱数で送信情報を作ったとしても、やはり送信情報は00~11の4種類ができます。
これも最も単純な攻撃法と同じ確率でしかありません。
1回の送受信で2ビット分の情報漏出があり4度目で攻撃が成功するはずとしても個人的同定情報を変更すれば上の努力も無駄になります。
つまり、これはゼロ知識証明ならぬ4分の1知識証明といえます。

上の照合は表14を用意できる6ビットで説明しましたが、全鍵検索に膨大なコンピュータ的計算時間量が必要な鍵サイズであれば「平文と暗号化文の両方が既知でない限り」という但し書き無しに安全な「ほとんど」ゼロ知識証明ができます。

6. おわりに

将来、量子計算機で数千量子ビットのハードウェアが実現したら並列処理して理論上、現在の最速スーパーコンピュータ(並列度が220以下)で数千年かかっても解けないような計算でも、数十秒といった短い時間でこなすことができるそうです。
また現在でも、676ビット長の離散対数問題を汎用コンピュータ18台で33日という処理時間で計算できるのが分かっているそうです。
いずれ数学的難問解決の困難性をボトルネックとするゼロ知識証明や公開鍵暗号方式は一方向性の根拠を失うかもしれない。
しかし逆算が出来なくて全鍵検索するには作るのと同じだけ時間を費やすと先に述べた「全単射写像拡大による擬似乱数生成法」は公開鍵と異なり整数の値すべてを使用できるのでシードの大きさを少し増加することでコンピュータ技術の進歩にも対応できます。
先に1000年掛かると述べた40ビットの全鍵検索と同じ2の60乗(100万ビット×1兆回)ビットの擬似乱数を1秒で出力する量子計算機があるとしても、そのシードの大きさを倍の80ビットにすれば全鍵検索するのに(2の35乗)年かかることになる。