概要#
コンピュータで乱数を再現した場合、何らかの規則性や再現性をもち、本当の乱数とはやや異なる。そこで 疑似乱数 と呼ばれる。
実用の観点では、暗号論的擬似乱数生成器とそうでない簡易的な疑似乱数生成器の区別がある。
暗号論的擬似乱数生成器による暗号は過去の乱数から次の乱数が予測不可能なようにできている。 しかし、生成器によっては、過去の値から次の値が(部分的にでも)予測できてしまう事がある。 例えば最もシンプルな乱数生成法のひとつである 線形合同法 は、パラメータの一つが偶数だと、生成される乱数が偶数と奇数を交互に繰り返すように生成される。
Pythonでいうと、random パッケージは一般的な乱数生成器を扱うが、暗号論的疑似乱数生成は secrets パッケージに実装がある。
なお、randomパッケージはメルセンヌ・ツイスタ法を使っているらしい。
import random
random.random()
0.9200011661698843
import secrets
secrets.token_hex(16)
'dbe9942f8e0dc5c6aab450af866ba769'
一般的な疑似乱数生成アルゴリズム#
暗号論的擬似乱数生成器(CSPRNG)#
セキュリティが重要な場合に使用される。代表的なものは以下
Yarrow
概要: Bruce Schneierらによって設計された、暗号学的に安全な乱数生成器。
特徴: 高いセキュリティとランダム性。
Fortuna
概要: Yarrowの改良版。特に長期間のセキュリティに重点を置いて設計された。
特徴: モジュール構造と強力なセキュリティ。
SHA-1/SHA-256ベースの生成器
概要: SHA-1やSHA-256のハッシュ関数を用いた乱数生成。
特徴: 暗号学的に安全。
AES-CTR DRBG(Deterministic Random Bit Generator)
概要: AES暗号をカウンターモードで使用した乱数生成器。
特徴: 高速かつ安全。
疑似乱数と暗号・セキュリティ#
nonce#
nonce (ノンス) は、暗号通信で用いられる使い捨てのランダムな値。
例1: インターネット上で買い物をするとき、注文時にノンスを含めれば、もし注文内容が傍受されて攻撃者に繰り返されたとしても「同じノンスで送られたデータは不正なもの」として無視すれば攻撃が成立しなくなる。
例2: いつもNAVI API のOAuth認証でのアクセス時もタイムスタンプとnonceをクエリパラメータに含める仕様になっている
例3: HTTPのDigest認証でも、パスワードのMD5ダイジェストを計算する過程でノンスが使われる。