मुझे PHP में क्रिप्टोग्राफ़िक रूप से सुरक्षित (सीएस) यादृच्छिक संख्या जेनरेटर बनाने के लिए एक प्रबल-निष्पक्ष (निर्धारक & बीजित) बनाने की आवश्यकता है। हम PHP 5 चला रहे हैं और PHP 7 अभी वास्तव में एक विकल्प नहीं है। हालांकि, मुझे PHP 7 के नए सीएस फ़ंक्शंस के लिए पॉलीफ़िल मिला है इसलिए मैंने उस समाधान को लागू किया है (https://github.com/paragonie/random_compat)।PHP बीजित, निर्धारक, क्रिप्टोग्राफ़िक रूप से सुरक्षित पीआरएनजी (छद्म यादृच्छिक संख्या जनरेटर)। क्या यह संभव है?
मैंने सोचा था कि srand() बीज random_int() के लिए इस्तेमाल किया जा सकता है, लेकिन अब मुझे यकीन नहीं है कि यह मामला है। क्या एक सीएसपीआरएनजी भी बीजित किया जा सकता है? यदि इसे बीज किया जा सकता है, तो क्या उत्पादन निर्धारक होगा (समान यादृच्छिक परिणाम, उसी बीज को दिया जाएगा)?
यहाँ मेरी कोड है:
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) प्रत्येक रन पर ही होना चाहिए, लेकिन यह नहीं है।
यह साबित करने के लिए कि ड्राइंग निष्पक्ष है, विजेता संख्या को चुनने और दिखाए जाने से पहले एक बीज (बीज ए) चुना जाता है। एक और यादृच्छिक संख्या भी उत्पन्न होती है (बीज बी)। बीज बी को नमक के रूप में प्रयोग किया जाता है और बीज ए के साथ जोड़ा जाता है और परिणाम धोया जाता है। यह हैश ड्राइंग से पहले उपयोगकर्ता को दिखाया गया है। उन्हें स्रोत कोड भी प्रदान किया जाएगा ताकि जब विजेता संख्या चुनी जाती है, तो दोनों बीज प्रकट होते हैं। वे सत्यापित कर सकते हैं कि हैश मैचों और सब कुछ काफी किया गया था।
आपका मतलब है https://github.com/paragonie/seedspring? –
हां, लेकिन उसे PHP 7 की आवश्यकता है। कोई विकल्प नहीं। – compcentral
मैं आसानी से composer.json को समायोजित कर सकता हूं^5.6 |^7.0 और random_compat: \ –