連続した出力からPRNGの説明を復元する


7

疑似乱数ジェネレータの出力を考えて、タイプ(たとえば、線形フィードバックシフトレジスタ)、乗算付きキャリー、線形合同ジェネレータなど)をどのように決定し、関数とシードを回復できますか?

与えられた数の配列は確かにPRNGによって生成されます(暗号的に安全ではありません)。これは事前にわかっています。出力はクリーンで、PRNGは連続した数値を返すブラックボックスです(変更なし、スキップされた値なし)。次に、タスクは値から関数とシードを見つけることです。

単純なアイデアは、一致が見つかるまですべてのスキームを試すことですが、よりアルゴリズム的なアプローチに興味があります。

回答:


10

PRNGのタイプを判別する単一の方法はありません。実際、暗号強度のPRNGの場合、その出力を真にランダムなものから区別することはできないため、出力を見ただけではそのようなPRNGのタイプを判別できません。

代わりに、あなたが一覧表示することを制度ごとに、そこにある種子を回復し、その出力から、将来のビットを予測する方法。その方法は、PRNGのタイプごとに異なります。したがって、自然なアプローチは次のとおりです。候補タイプごとに、そのタイプのPRNGで機能するシードを回復する方法を試し、成功するかどうかを確認します。もしそうなら、あなたはPRNGのタイプを理解しました。

より効率的または一般的な手法はないと思います。そして率直に言って、もっと効率的なものが必要だとは思いません。リストするタイプには、十分な出力があれば、それらを暗号解読するための非常に効率的なアルゴリズムがあります。したがって、「すべてのスキームを試す」アプローチを打ち負かすのは難しいだろうと私は思います。

これは、PRNGタイプのセットに暗号学的に弱いPRNGのみが含まれている場合、つまり、十分な過去の出力を指定して将来の出力を予測できる場合に機能します。

特定のタイプのPRNGに対してこれを行う方法の詳細については、その1つのタイプのPRNGに焦点を当てた別の質問をすることをお勧めします。リストしたPRNGタイプのいくつかのリソースは次のとおりです。


1
プロットするときに、超平面で高度に整理されたLCGの出力についての宣伝文句を追加できます。このようなプロットは、LCGやその他のタイプを扱っていることを識別するために使用できます。
Iwillnotexist Idonotexist 2017年

2
@IwillnotexistIdonotexist、これらのプロットは実際にリンクする方法よりも効果が低いため、LCGの使用を特定することが目的である場合、これらのプロットを使用する理由はありません。プロットにはより多くの出力が必要で、誰かがプロットを検査する必要があります。私がリンクするアプローチは、少数の出力と非常に少ない計算のみを必要とします。
DW

真; 数学はしっかりしていて、与えられた家族を扱っているかどうかをすぐに特定します。しかし、PRNGがすべて同じように作成されているわけではないことを数学的でなく視覚的に実証するのは良いことであり、これは輝かしい例の1つです。
Iwillnotexist Idonotexist 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.