呼び出しmt_rand($min, $max)
は、基本的に次と同等です。
$rand_in_range_min_to_max = (int)($min + ($max - $min) * ($rand/mt_getrandmax()));
したがって、0 から 2 31 -1までの理論上の範囲から乱数を選択$min
する$max
代わりに、 から までの数値を選択します。$min
が よりも大きい0
か$max
小さい場合、1<<31-1
これだけで可能なシード値の量がすでに減少しています。
提示された攻撃はブルート フォース攻撃であるため、推測の数を減らすと、ブルート フォース プロセスを完了するまでの時間も短縮されます。
ただし、ブルート フォース プロセスの結果の値は実際のランダム値ではなく、ランダム値がマッピングされた値にすぎないため、攻撃者はそのブルート フォース値にマッピングされた可能性のある入力値をそれぞれチェックする必要があります。その範囲は次のように計算できます。
$rand_min = (int)(($rand_in_range_min_to_max - $min) / ($max - $min) * mt_getrandmax());
$rand_max = (int)($rand_min + mt_getrandmax() / ($max - $min + 1));
// range whose values are mapped onto $rand_in_range_min_to_max
$range = range($rand_min, $rand_max);
foreach ($range as $rand) {
assert($rand_in_range_min_to_max === (int)($min + ($max - $min) * ($rand/mt_getrandmax())));
}
範囲内の各数値は同じようにマッピングされるため、それらはすべて、次の乱数を順番に生成するための潜在的な数値にすぎません。実際の数値を間違いなく特定するために、攻撃者はせいぜいmt_getrandmax() / ($max - $min)
その後に生成された乱数しか必要としません。
したがって、実際には、 を使用すると、攻撃者が実際のシードを見つけるための労力mt_rand($min, $max)
が増加します。攻撃者は、複数の乱数値に対してブルート フォース シードを実行する必要がありmt_getrandmax() / ($max - $min)
、その後、正しいシードを一意に識別するために乱数を生成する必要があるからです。