乱数の簡単な歴史

「私が本当にランダムな数字を取得しようとしたとき、通常のサイコロほど良いものは見つかりませんでした」とフランシス・ガルトン 1890年にNature誌に書きました。 「骨が揺れてバスケットに投げ込まれた後、それらは互いに予測不可能な方法でバスケットの壁にぶつかり、光を投げても結果を決定することは完全に不可能になります。」



画像

(ローマ帝国時代のサイコロ)



乱数の均一なシーケンスを生成するにはどうすればよいですか? 多様性が非常に美しい事故は、多くの場合、自然界で見られますが、人為的に抽出するのは必ずしも容易ではありませんでした。 最も古いサイコロは中東で発見され、紀元前24世紀頃にさかのぼります。 別の例としては、中国があります。紀元前11世紀に、破壊された亀の甲羅が一撃で使用され、得られたランダムなパーツのサイズがさらに解釈されました。 数世紀後、人々は植物の茎を数回切り刻み、得られた部分のサイズを比較しました。





しかし、20世紀半ばまでに、人類は骨を投げたり、茎を切ったりして得られるよりもはるかに多くの乱数を必要としました。 アメリカの分析センターRANDは、ランダムパルスジェネレーター(電子ルーレットのようなもの)を使用して乱数を生成できるマシンを作成しました。 彼らはそれを立ち上げ、しばらくして十分な数の乱数を受け取り、それを「 100万の乱数と100万の標準偏差 」という本の形で出版しました。



画像 この本をオンラインで読むか、Amazonで 2001年の紙の復刻版購入できます 。 今日、その時点で不条理なアートプロジェクトと思われるものは、大きなブレークスルーでした。 初めて、真に乱数の真に大きなシーケンスが科学者に利用可能になりました。



20世紀の40年代に今日の有名なブレッチリーパークで製造された別の同様の車ERNIEは、英国プレミアムボンド宝くじで乱数を生成するために使用されました。 結果の無作為性と誠実さに対する恐怖を払拭するために、ドキュメンタリー「The重要性はERNIEであること」さえ撃たれました。 今日、Youtubeで見ることができます:







1951年に、ランダム性は最終的に正式に正式化され、実際のFerranti Mark 1コンピューターに組み込まれました。このコンピューターには、 ショットノイズと20のランダムビットを取得できる命令に基づくランダムデータジェネレーターが組み込まれています。 この機能はAlan Turingによって開発されました。 彼の同僚のクリストファー・ストラチーは、それを使用して「ラブレタージェネレーター」を作成しました。 このプログラムによって生成されたテキストの例を次に示します。



JEWEL LOVE MY LIKING HUNGERS FOR YOUR ADORABLE INFATUATION. YOU ARE MY EROTIC ARDOUR.: MY FOND RAPTURE. MY THIRST SIGHS FOR YOUR INFATUATION. MY HEART SEDUCTIVELY WISHES YOUR BREATHLESS LONGING. YOURS CURIOUSLY MUC
      
      





しかし、チューリング乱数ジェネレーターは、すでに新しく不安定なコンピューターシステムにさらに大きな不安定性の要因を導入したため、当時のプログラマーを満足させませんでした。 特定のプログラムの安定した動作を実現するために-デバッガーなしでランダムなデータを使用して-結果の再現性を達成することは不可能でした。 次に、「乱数ジェネレータを何らかの決定論的関数として表現できるとしたらどうでしょうか」という考えが生まれました。その後、一方で、生成された数値にはランダムな兆候がありますが、一方で、ジェネレータの同じ初期化では、データシーケンスは毎回同じです。 これが、疑似乱数ジェネレーター(PRNG)の由来です。



ジョン・フォン・ノイマンは1946年にPRNGを開発しました。 彼のアイデアは、特定の数字から始め、彼の正方形を取り、結果の中央から数字をドロップし、再び正方形を取り、中央をドロップする、などです。 彼の意見では、結果のシーケンスは乱数と同じ特性を持ちました。 フォン・ノイマンの理論は時の試練に耐えませんでした。なぜなら、最初の数を選択しても、この方法で生成されたシーケンスは、8100、6100、4100、8100、6100、4100などの反復値の短いサイクルに縮退するからです...



後続の値が以前の値に基づいている決定性関数を使用する場合、サイクルを完全に回避することは不可能です。 しかし、サイクル期間が非常に長く、実際には問題にならない場合はどうでしょうか?



数学者のデリック・ヘンリー・レマーは、1949年に線形合同法の発明によりこのアイデアを開発しました。 これは、レーマーアプローチに基づいており、JavaScriptで記述された擬似乱数ジェネレータです。



 // The Central Randomizer 1.3 (C) 1997 by Paul Houle (paul@honeylocust.com) // See: http://www.honeylocust.com/javascript/randomizer.html rnd.today=new Date(); rnd.seed=rnd.today.getTime(); function rnd() { rnd.seed = (rnd.seed*9301+49297) % 233280; return rnd.seed/(233280.0); }; function rand(number) { return Math.ceil(rnd()*number); };
      
      





コードには、多くの「魔法の定数」があります。 これらの数値(通常は素数)は、結果のシーケンスを繰り返す前にサイクルの期間を最大化するように選択されました。 このジェネレーターは現在の時刻を初期値として使用し、約2 ^ 31の周期を持っています。 JavaScript 1.0のリリースで人気を博しました。当時はまだMath.random()関数が組み込まれておらず、誰もがバナー広告をランダムに変更したかったからです。 「セキュリティに関連するものにはこのアルゴリズムを使用しませんが、多くのアプリケーションでは十分です」と、上記のコードの著者であるPaul Houle氏は書きました。



しかし、インターネットにはセキュリティに関連するものが必要でした。 SSLは1995年に登場し、その実装には高品質の擬似乱数ジェネレータが必要でした。 これにより、この分野でかなりワイルドな一連の実験が行われました。 当時発行された乱数の生成に関連する特許を見ると、最初の航空機を製造するための近代化された試みを見ているような気がします。



90年代のほとんどの一般的なプロセッサには、乱数を生成するための特別な命令がなかったため、擬似乱数ジェネレーターの適切な開始値を選択することが非常に重要でした。 これにより、Phillip Hallam-BakerがNetscapeブラウザ(当時)でSSL実装が現在の時刻とそのプロセスIDの組み合わせを使用してPRNGを初期化することを発見すると、セキュリティ上の問題が発生しました。 彼は、ハッカーがこの値を簡単に取得してSSLトラフィックを解読できる方法を示しました。 擬似乱数生成アルゴリズムの初期値を推測することは、今でも一般的な攻撃ですが、長年にわたって少し複雑になっています。 2009年にハッカーニュースで公開され成功した攻撃の例を次に示します。



1997年、プログラマーは真の乱数を取得する能力が制限されていたため、SGIチームはテーブルの横に立っている一対の溶岩ランプを狙ったウェブカメラで構成されるLavaRandを作成しました。 このカメラからの画像は、エントロピーの優れたソースでした-チューリングと同じリアル乱数ジェネレーター。 しかし今回は、毎秒165 Kbの乱数を生成することが判明しました。 発明はすぐに特許を取得しました



この分野のほとんどの実験は時の試練に耐えていませんが、1997年に松本誠と西村拓司によって開発されたMersenna Whirlwindと呼ばれる1つのPRNGが手のひらを保持できました。 パフォーマンスと結果の品質を兼ね備えていたため、多くの言語やフレームワークに迅速に広がりました。 メルセンヌ渦は、 一般化されたリターン備えラウンドシフトシフトレジスタであり、巨大なサイクル周期で決定論的なシーケンスを生成します 。 現在の実装では、期間は2¹⁹⁹³⁷-1であり、今日のほとんどのプログラミング言語に含まれているのはこの実装です。



1999年、Intelはi810チップセットにハードウェア乱数ジェネレーターを追加しました。 この実装は(温度ノイズに基づいて)本当に乱数を与えたが、ソフトウェアPRNGほど速く動作しなかったため、これは良かったので、ほとんどの暗号化アプリケーションはまだPRNPを使用しています。ハードウェア乱数ジェネレーターからの値。



これにより、暗号的に安全な擬似乱数ジェネレーター(KBGPSCH)の概念に導かれます。 (ああ、これらの略語!コンピュータサイエンスが一部の人々にとって退屈に思えるのは驚くことではありません。)KBHPSCはSSLの時代に非常に人気がありました。 CBHRNはどのような要件を満たす必要がありますか? さて、ここにこれらの要件を備えた131ページのドキュメントがあります。楽しんでください。 すでに理解しているように、いくつかの要件はありません。 例えば、同じMersenne Whirlwindはそれらを満足させません。十分に大きな数のシーケンスが生成されるため、次の数を推測できます。



2012年に、インテルはRDRANDおよびRDSEED命令をチップに追加し、同じ温度変動に基づいて実際の乱数を取得できるようになりましたが、最大500 Mb / sの速度で、ソフトウェアPRNを使用する必要がなくなりました。 しかし、これらの指示の誠実さについてのうわさや疑念は社会をうろついています。 NSA専用のブックマークがありますか? 誰も確かに言うことができません。 むしろ、誰かがおそらくできるかもしれませんが、彼は確かにそれについてTwitterに投稿しません。



画像

Redoublerハードウェア乱数ジェネレーターからのランダムデータ)



近年、サードパーティのメーカーのハードウェア乱数ジェネレーター(ソフトウェアとハ​​ードウェアの両方の点で)も完全にオープンになりました。 これらの製品の強みはまさに開放性にあります。自分で調べて、一般的に入手可能なコンポーネントの中から自分で家を建てることさえできます。 例としては、 REDOUBLERおよびInfinite Noise TRNGがあります。



今日でも、特定のシステム、OSカーネル、プログラミング言語、暗号ライブラリなどでどの特定の乱数ジェネレータを使用すべきかについて議論されています。 アルゴリズムには、速度、メモリの節約、セキュリティによって強化された多くのオプションがあります。 そして、それらのそれぞれは、常にハッカーやセキュリティの専門家によって攻撃されています。 しかし、日常の非セキュリティタスクでは、ほとんどのプラットフォームで利用可能な/ dev / randomまたはrand()関数からのデータに非常によく依存できます。 これにより、Alan Turingがやがて幸せになるような十分に大きなランダムなデータシーケンスが得られます。



All Articles