Gibt es eine legitime Verwendung für Intels RDRAND?

Heute dachte ich mir: na ja, auch wenn ein großer Verdacht auf die RDRAND-Implementierung von @ besteNIST SP 800-90A, es handelt sich immer noch um eine Hardware-Implementierung des Pseudozufallszahlengenerators (PRNG), die für nicht sensible Anwendungen ausreichen muss. Also habe ich mir überlegt, es in meinem Spiel anstelle von Mersenne Twister zu verwenden.

Um festzustellen, ob die Verwendung der Anweisung zu einer Leistungssteigerung führt, habe ich die Zeit der beiden folgenden Codes verglichen:

// test.cpp
#include <cstdio>

int main()
{
    unsigned int rnd = 0;
    for(int i = 0; i < 10000000; ++i) {
        __builtin_ia32_rdrand32_step(&rnd);
    }
    printf("%x\n", rnd);
}

un

//test2.cpp
#include <cstdio>
#include <random>

int main()
{
    unsigned int rnd = 0;
    __builtin_ia32_rdrand32_step(&rnd);
    std::mt19937 gen(rnd);
    for(int i = 0; i < 10000000; ++i) {
        rnd ^= gen();
    }
    printf("%x\n", rnd);
}

und durch Ausführen der beiden bekomme ich:

$ time ./test
d230449a

real    0m0.361s
user    0m0.358s
sys     0m0.002s

$ time ./test2 
bfc4e472

real    0m0.051s
user    0m0.050s
sys     0m0.002s

Also, Mersenne Twister ist viel schneller als RDRAND auf meiner CPU. Nun, ich war enttäuscht und von meinem Spiel ausgeschlossen. Aber RDRAND ist ein kryptografisch sicheres PRNG (CSPRNG), das viel hinter den Kulissen leistet. Fairer wäre es, es mit anderen CSPRNG zu vergleichen. Also nahm ich meinHas Implementierung (einfache Übersetzung des RFC nach C, keine ausgefallenen Tricks für die Leistung) und schrieb den folgenden Test:

// test3.cpp
#include <cstdio>

extern "C"
{
#include "rabbit.h"
}

int main()
{
    rabbit_state s;
    unsigned long long buf[2];
    __builtin_ia32_rdrand64_step(&buf[0]);
    __builtin_ia32_rdrand64_step(&buf[1]);
    rabbit_init_key(&s, (uint8_t*)&buf[0]);

    for(int i = 0; i < 10000000; ++i) {
        rabbit_extract(&s, (uint8_t*)&buf[0]);
    }
    printf("%llx\n", buf[0]);
}

Und zu meiner Überraschung habe ich doppelt so viele Pseudo-Zufallsdaten generiert wie die ersten beiden. Ich habe eine bessere Zeit als RDRAND:

$ time ./test3 
8ef9772277b70aba

real    0m0.344s
user    0m0.341s
sys     0m0.002s

Alle drei wurden mit aktivierter Optimierung kompiliert.

So, wir haben eine weit verbreitete Paranoia, dass RDRAND gemacht wurde, um NSA-Backdoors in die Software-Kryptographie aller einzubetten. Außerdem haben wir mindestens eine Software, die CSPRNG schneller als RDRAND ist, und die am häufigsten verwendete anständige PRNG, Mersenne Twister, istvie schneller als RDRAND. Schließlich haben wir Open-Source-Auditing-Software-Entropie-Pools wie/dev/random und/dev/urandom, die sich nicht wie RDRAND hinter zweifachen Scrambler-Schichten von AES verstecken.

Also, die Frage: sollten die Leute RDRAND benutzen? Gibt es eine legitime Verwendung dafür? Oder sollten wir es ganz aufgeben?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage