我需要在PHP中創建一個證明性公平的(確定性的&種子)密碼安全(CS)隨機數生成器。我們正在運行PHP 5,而PHP 7現在不是真正的選擇。但是,我發現了PHP 7的新CS功能的填充,所以我實現了該解決方案(https://github.com/paragonie/random_compat)。PHP種子,確定性,密碼安全的PRNG(僞隨機數生成器)。可能嗎?
我認爲srand()可以用來種子random_int(),但現在我不確定如果是這種情況。 CSPRNG甚至可以播種嗎?如果可以播種,輸出是否是確定性的(相同的隨機結果,給定相同的種子)?
這裏是我的代碼:
require_once($_SERVER['DOCUMENT_ROOT']."/lib/assets/random_compat/lib/random.php");
$seed_a = 8138707157292429635;
$seed_b = 'JuxJ1XLnBKk7gPASR80hJfq5Ey8QWEIc8Bt';
class CSPRNG{
private static $RNGseed = 0;
public function generate_seed_a(){
return random_int(0, PHP_INT_MAX);
}
public function generate_seed_b($length = 35){
$characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$randomString = '';
for($i = 0; $i < $length; $i++){
$randomString .= $characters[random_int(0, strlen($characters) - 1)];
}
return $randomString;
}
public function seed($s = 0) {
if($s == 0){
$this->RNGseed = $this->generate_seed_a();
}else{
$this->RNGseed = $s;
}
srand($this->RNGseed);
}
public function generate_random_integer($min=0, $max=PHP_INT_MAX, $pad_zeros = true){
if($this->RNGseed == 0){
$this->seed();
}
$rnd_num = random_int($min, $max);
if($pad_zeros == true){
$num_digits = strlen((string)$max);
$format_str = "%0".$num_digits."d";
return sprintf($format_str, $rnd_num);
}else{
return $rnd_num;
}
}
public function drawing_numbers($seed_a, $num_of_balls = 6){
$this->seed($seed_a);
$draw_numbers = array();
for($i = 0; $i < $num_of_balls; $i++) {
$number = ($this->generate_random_integer(1, 49));
if(in_array($number, $draw_numbers)){
$i = $i-1;
}else{
array_push($draw_numbers, $number);
}
}
sort($draw_numbers);
return $draw_numbers;
}
}
$CSPRNG= new CSPRNG();
echo '<p>Seed A: '.$seed_a.'</p>';
echo '<p>Seed B: '.$seed_b.'</p>';
$hash = hash('sha1', $seed_a.$seed_b);
echo '<p>Hash: '.$hash.'</p>';
$drawNumbers = $CSPRNG->drawing_numbers($seed_a);
$draw_str = implode("-", $drawNumbers);
echo "<br>Drawing: $draw_str<br>";
當這個代碼運行,繪圖($ draw_str)應在每次運行相同的,但事實並非如此。
爲了證明圖紙是公平的,在挑選和顯示獲獎號碼之前選擇種子(種子A)。還生成另一個隨機數(種子B)。種子B用作鹽並與種子A結合,結果被散列。該散列在繪圖之前向用戶顯示。他們也會被提供源代碼,以便在挑選中獎號碼時顯示兩個種子。他們可以驗證哈希匹配和一切都相當公平。
你的意思是像https://github.com/paragonie/seedspring? –
是的,但需要PHP 7.不是一個選項。 – compcentral
我可以很容易地調整composer.json來要求^ 5.6 |^7.0和random_compat:\ –