Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Membenihkan MT19937 PRNG dalam C dengan Benar untuk Penjanaan Nombor Rawak Selamat?

Bagaimanakah Saya Boleh Membenihkan MT19937 PRNG dalam C dengan Benar untuk Penjanaan Nombor Rawak Selamat?

DDD
DDDasal
2024-11-29 01:11:11762semak imbas

How Can I Properly Seed the MT19937 PRNG in C   for Secure Random Number Generation?

Cara Membenihkan MT19937 PRNG dalam C

Biasanya, std::random_device digunakan untuk menjana nombor rawak, seperti yang dilihat dalam kod berikut:

std::random_device rd;  
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(0, 5);
dis(gen);

Walau bagaimanapun, kaedah ini adalah cacat kerana:

  • std::random_device() mengembalikan entropi yang tidak mencukupi.
  • std::mt19937 gen(rd());gen() mungkin tidak menghasilkan pengagihan output yang baik.
  • std::random_device boleh dilaksanakan sebagai PRNG dengan tetap seed.

Pendekatan yang lebih dipercayai ialah menggunakan CSPRNG, seperti CryptGenRandom pada Windows atau /dev/urandom pada sistem seperti Unix, untuk menjana bait rawak berkualiti tinggi untuk menyemai PRNG. Contohnya:

#include <bit>
#include <iostream>
#include <string>

size_t sysrandom(void* dst, size_t dstlen) {
    std::ifstream stream("/dev/urandom", std::ios_base::binary | std::ios_base::in);
    stream.read((char*)dst, dstlen);
    return dstlen;
}

int main() {
    std::uint_least32_t seed;
    sysrandom(&seed, sizeof(seed));
    std::mt19937 gen(seed);

    // Your code to use the generator here...
    return 0;
}

Kod ini menggunakan /dev/urandom sebagai CSPRNG dan menyemai PRNG menggunakan nilai 32-bit, yang harus ditingkatkan untuk keselamatan yang lebih baik. Pendekatan ini mudah alih, diuji dengan baik dan mudah digunakan, menyediakan asas yang kukuh untuk menjana nombor rawak dalam C .

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Membenihkan MT19937 PRNG dalam C dengan Benar untuk Penjanaan Nombor Rawak Selamat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn