
ハードウェアエントロピーを計測し、研究とセキュリティのために実運用化します。
デバイス上のハードウェアソースからエントロピーを収集し、統計テストでソース品質を分析し、CLI、Rust、Python、HTTPインターフェースを介して生または調整済みの出力を提供します。
エントロピーの研究、検証、暗号展開のための単一ワークフローです。
作者: Amenti Labs
# インストール
cargo install openentropy-cli
# マシン上のエントロピーソースを検出
openentropy scan
# すべての高速ソースをベンチマーク
openentropy bench
# 64バイトの16進形式でランダム出力
openentropy stream --format hex --bytes 64
# ライブTUIダッシュボード
openentropy monitor
デフォルトでは、高速ソース(2秒未満)のみを使用します。
--allを渡すと、低速ソース(DNS、TCP、GPU、BLE)も含まれます。互換性のために位置エイリアスallも受け付けられます。
OpenEntropyのほとんどのソースはホストマシン自体から取得されます。OpenEntropyは、外部ハードウェアデバイスが接続され検出可能な場合もサポートします。
qcicada ソースとして公開されます。OpenEntropyはデバイスの量子出力を読み取り、オンホストソースと並べてベンチマーク、分析、記録、比較できます。デバイス独自の出力モードは raw、sha256、samples にマッピングされ、OpenEntropyは現在 qcicada 0.2.2 のフレッシュスタート連続モードヘルパーを使用して、連続モードに入った後に一度だけバッファリング済みのデバイス入力を破棄し、古いキューバイトからの最初の読み取りを提供しません。詳細は QCicadaマニュアル を参照してください。pip install openentropy
from openentropy import EntropyPool, detect_available_sources
sources = detect_available_sources()
print(f"{len(sources)} 個のエントロピーソースが利用可能")
pool = EntropyPool.auto()
source = sources[0]["name"]
data = pool.get_source_bytes(source, 256, conditioning="sha256")
ソースからビルド(ネイティブ拡張):
git clone https://github.com/amenti-labs/openentropy.git && cd openentropy
pip install maturin
maturin develop
セキュリティエンジニアはOpenEntropyを使用してエントロピー品質を検証し、CSPRNGにシードを供給します:
openentropy analyze --profile security --output audit.md
研究者はOpenEntropyを使用して生ノイズの特性を研究します:
openentropy analyze --profile deep --output analysis.json
セキュリティエンジニアはCSPRNGにシードを供給し、鍵を生成し、独立したハードウェアエントロピーで /dev/urandom を補完します。SHA-256調整出力(--conditioning sha256、デフォルト)は暗号品質のランダムバイトを生成します。security プロファイルは1つのフラグでNISTテストバッテリー、最小エントロピー分析、SHA-256調整を有効にします。
研究者はハードウェアサブシステムの生ノイズ特性を研究します。--conditioning raw を渡すと、各ソースからの実際のノイズ信号を保持する、白色化されていない未調整のバイトを取得します。deep プロファイルは10万サンプル、相互相関、PEARスタイルの試行分析を有効にします。
Rawモードで可能になること:
ほとんどの乱数生成器は 疑似ランダム — 一度シードされた決定論的アルゴリズムです。OpenEntropyはハードウェアから 実際の物理ノイズ を継続的に収穫します:
プールは独立したストリームをXOR結合します。単一のソース障害がプールを危険にさらすことはありません。
調整は オプションで設定可能 です。CLIでは --conditioning、HTTP APIでは ?conditioning= を使用します:
| モード | フラグ | 説明 |
|---|---|---|
| SHA-256 (デフォルト) | --conditioning sha256 | SHA-256調整。暗号品質の出力。 |
| Von Neumann | --conditioning vonneumann | デバイアスのみ — バイアスを除去しつつ、生の信号構造をより多く保持。 |
| Raw | --conditioning raw | 処理なし。白色化ゼロのソースバイト — 研究用に実際のハードウェアノイズ信号を保持。 |
RawモードがOpenEntropyを研究に役立つものにしています。ほとんどのHWRNG APIはDRBG後処理を実行し、すべてのソースを一様なランダムバイトに見せかけ、研究者が必要とする情報を破壊します。Raw出力はソースごとのノイズ構造(バイアス、自己相関、スペクトル特徴、ソース間相関)を保持します。詳細は 調整 を参照してください。
| ドキュメント | 説明 |
|---|---|
| ソースカタログ | 物理的説明とプラットフォームノート付きソースカタログ |
| CLIリファレンス | 完全なコマンドリファレンスと例 |
| 調整 | Raw vs VonNeumann vs SHA-256調整モード |
| 試行分析手法 | PEARスタイル200ビット試行、キャリブレーションゲート、参考文献 |
| テレメトリモデル | 実験的 telemetry_v1 コンテキストモデルと統合ポイント |
| Rust APIリファレンス | コアRust APIサーフェス |
| アーキテクチャ | クレート構造と設計判断 |
| Python SDK | PyO3バインディングとPython APIリファレンス |
| 例 | RustおよびPythonコード例 |
| トラブルシューティング | 一般的な問題と修正 |
| セキュリティ | 脅威モデルと責任ある開示 |
拡張された統計分析ロードマップと手法インベントリは、以下に影響を受けました:
この比較QRNG/PRNG分析面を形作るのに役立ったオープンソースの作業に感謝します。
現在のソースレジストリは13のメカニズムベースのカテゴリに及びます。実際の可用性はプラットフォームによって異なります:
| カテゴリ | 数 |
|---|---|
| 熱 | 4 |
| タイミング | 7 |
| スケジューリング | 6 |
| I/O | 6 |
| IPC | 4 |
| マイクロアーキテクチャ | 16 |
| GPU | 3 |
| ネットワーク | 3 |
| システム | 6 |
| 信号 | 3 |
| センサー | 4 |
| 量子 | 1 |
ソースごとの完全な説明、プラットフォームの可用性、物理ノートについては、 ソースカタログ を参照してください。
現在サポートされている外部ハードウェア:
qcicada — Crypta Labs QCicada USB QRNG (マニュアル)完全なコマンドリファレンスと例については、CLIリファレンス を参照してください。
最もよく使われるワークフロー:
openentropy scan
openentropy bench
openentropy stream --format hex --bytes 64
openentropy analyze --profile security # NISTバッテリー + エントロピー + sha256
openentropy analyze --profile deep # 10万 + フォレンジック + 相互相関 + 試行
openentropy record clock_jitter --duration 30s
openentropy sessions sessions/<id> --profile deep
openentropy compare sessions/<id-a> sessions/<id-b> --profile deep
sessions では、特定のセッションパスが指定された場合のみプロファイルプリセットが適用されます。パスなしの openentropy sessions は常にリストモードになります。
PEARスタイルの試行手法リファレンス(200ビット試行、ターミナルZ、重み付きStouffer合成、キャリブレーションゲーティング)は、 試行分析手法 に文書化されています。
[dependencies]
openentropy-core = "0.12"
use openentropy_core::{ConditioningMode, EntropyPool, detect_available_sources};
let sources = detect_available_sources();
println!("{} sources available", sources.len());