乱数生成器(RNG) - 暗号化全般

暗号化全般 | IT用語集

乱数生成器(RNG)とは

乱数生成器(RNG / Random Number Generator)は、予測不可能な乱数を生成する仕組みです。暗号化においては、鍵生成、IV/Nonce生成、ソルト生成など、セキュリティの根幹に関わる場面で使用されます。

乱数生成器の種類:

  • TRNG(True RNG):物理的な現象(熱雑音など)を利用した真の乱数
  • PRNG(Pseudo RNG):アルゴリズムに基づく疑似乱数
  • CSPRNG(Cryptographically Secure PRNG):暗号学的に安全な疑似乱数

暗号学的に安全な乱数(CSPRNG)

暗号処理に使用する乱数は、以下の特性を満たす必要があります:

  • 予測不可能性:過去の出力から将来の出力を予測できない
  • 逆行不可能性:内部状態が漏洩しても過去の出力を復元できない
  • 統計的ランダム性:各ビットの出現確率が均等
# Pythonでの安全な乱数生成
import os
import secrets

# OSのCSPRNGを直接使用
secure_random_bytes = os.urandom(32)

# secretsモジュール(Python 3.6+、推奨)
secure_token = secrets.token_bytes(32)
secure_hex = secrets.token_hex(32)
secure_urlsafe = secrets.token_urlsafe(32)

# ❌ 暗号用途に使ってはいけない
import random
# random.random()は予測可能なので暗号には不適切

AIエンジニアとしての実体験

機械学習モデルの暗号化システムを設計する際、適切な乱数生成器の選択が重要でした。特に、モデルの暗号化鍵やAPIトークンの生成では、os.urandom()またはsecretsモジュールを必ず使用しています。

# 暗号鍵の安全な生成
from cryptography.hazmat.primitives.kdf.hkdf import HKDF
from cryptography.hazmat.primitives import hashes
import secrets

def generate_encryption_key() -> bytes:
    """256ビットAES鍵を安全に生成"""
    return secrets.token_bytes(32)

def generate_api_token() -> str:
    """APIトークンを安全に生成"""
    return secrets.token_urlsafe(32)

# セッションIDの生成
def generate_session_id() -> str:
    return secrets.token_hex(16)  # 128ビット

自社サーバー運用への応用

Linuxでの乱数生成

# /dev/urandom - 非ブロッキング、通常はこちらを使用
dd if=/dev/urandom bs=32 count=1 2>/dev/null | xxd -p

# /dev/random - エントロピープールが枯渇するとブロック
# 通常の用途では/dev/urandomで十分

# エントロピー状態の確認
cat /proc/sys/kernel/random/entropy_avail

# OpenSSLでの乱数生成
openssl rand -hex 32

エントロピー源の確保

仮想環境やコンテナでは、エントロピー不足が問題になることがあります。havegedrng-toolsを使用してエントロピープールを補充できます。

# havegedのインストール(Debian/Ubuntu)
sudo apt install haveged
sudo systemctl enable haveged

# rng-toolsのインストール(ハードウェアRNG使用時)
sudo apt install rng-tools

関連ブログ記事

最新動向(2026年)

ハードウェアRNGの普及

Intel RDRAND/RDSEED、AMD RNDR、ARM TRNGなど、CPUに組み込まれたハードウェア乱数生成器が標準で使用されるようになっています。

量子乱数生成器(QRNG)

量子力学的現象を利用した真の乱数生成器が商用化されています。クラウドサービスとしても提供され始めています。

トラブル事例と対策

🚨 重大な脆弱性:弱い乱数生成器の使用

事例:2012年、複数のWebサーバーでMath.random()ベースのセッションIDが予測され不正アクセス

対策:暗号用途には必ずCSPRNGを使用。randomMath.random()は絶対に使わない

⚠️ 仮想環境でのエントロピー不足

問題:VM起動直後にエントロピーが不足し、鍵生成がブロック

対策:havegedの導入、virtio-rngによるホストからのエントロピー供給

権威あるリソース

関連用語

この用語についてもっと詳しく

乱数生成に関するご質問やセキュリティ設計のご相談など、お気軽にお問い合わせください。