
歴史上、さまざまなブランドのウォレットユーザーによるコインの紛失事件は数多くありますが、その原因はすべてランダム機能の問題です。
ランダム性は、特に暗号電子通貨であるビットコインにとって非常に重要です。コミュニティではランダム性についてあまり議論されていないため、多くの人が正しい理解を持っていないのが残念です。そこで、今日はランダム性についてお話します。
ランダム性に関しては、「真の乱数ジェネレーター」(TRNG) と擬似乱数ジェネレーター (PRNG) という 2 つの概念を明確にする必要があります。
コンピュータープログラムや言語のランダム関数のほとんどは擬似乱数生成器であり、それらはすべて「シード」(「時間」など)を使用して、特定のアルゴリズムによって「ランダムに見える」結果を生成します。
アルゴリズムとシード、あるいは以前に発生させた乱数を知っていれば、次の乱数列の情報を得ることができることは間違いありません。予測可能性があるため、暗号的に安全ではないため、私たちはそれらを「擬似ランダム」と呼びます。このような乱数は、ゲームの悪役が逃走するのには大きな問題ではありませんが、ビットコインの秘密鍵の生成に使用されると、あまりにも危険です。
真の乱数発生器について話しましょう。中国語の Wiki では、「ハードウェア乱数発生器」(HRNG) を真の乱数発生器と同一視するのはあまり正確ではありません。厳密な意味での真の乱数は、量子力学でのみ存在する可能性があります。その中で、私たちが今望んでいる(あるいは望める)のは、このようなランダム性ではありません。
実際には、予測不可能で、統計的で、暗号的に安全な乱数が必要ですが、これを実行できる乱数生成器であれば、真の乱数生成器と呼ぶことができます。この種の真のランダム性は、必ずしも特別に設計されたハードウェアである必要はありません。Linux オペレーティング システムのカーネル内の乱数ジェネレーター (/dev/random) は、エントロピー プールを維持します (キーボード、マウスの操作、ネットワーク信号強度の変化など)により、可能な限り最大のランダム データ エントロピーを提供できるため、高品質の真の乱数生成器でもあります。
ただし、/dev/random はブロックされています。つまり、エントロピー プールが空の場合、十分な周囲のノイズが収集されるまで、/dev/random への読み取り操作は一時停止されます。
したがって、プログラムを開発するときは、/dev/urandom を /dev/random のコピーとして使用する必要があります。ブロックされませんが、その出力エントロピーは /dev/random よりも小さくなる可能性があります。
さて、そうは言っても、ビットコイン アプリケーションを開発する場合、秘密鍵を生成するにはどのような乱数生成器を使用すればよいでしょうか?
答えは簡単です。「ランダム」です。常に urandom のみを使用してください。
「非常に安全である」と主張するランダム関数を提供する一部の高度なセキュリティ ライブラリであっても、サードパーティの乱数ソリューションは使用しないでください。これらはすべてユーザー モードの暗号化乱数ジェネレーターであり、urandom はカーネル モードの乱数ジェネレーターであるため、カーネルは raw デバイスのエントロピーにアクセスでき、カーネルはアプリケーション間で同じ状態を共有しないことを保証できます。 。
歴史的に、無数の乱数の失敗例は主にユーザー状態の乱数生成器で発生しており、ユーザー状態の乱数生成器はほぼ常にカーネル状態の乱数生成器に依存しています (依存しない場合は、その場合、リスクが大きくなります)、開発作業の一部が簡素化される可能性があることを除いて、追加の利点はまったくありませんが、サードパーティ コードの導入によって引き起こされる可能性のある潜在的なセキュリティ リスクが増加します。
したがって、開発者は、暗号的に安全な乱数が必要な場合には、urandom を使用する必要があります。
最後に、何人かの子供たちが、BITHD ハードウェア ウォレットは真の乱数を生成しますか、と尋ねました。
答えは次のとおりです: もちろんです
BITHD のチップにはハードウェア乱数発生器があり、物理的なノイズ源を取得することで真の乱数を生成しますが、これは予測不可能で検出不可能な、真の乱数源です。