RSA 2048-Schlüsselpaargenerierung: über openssl 0,5s über gpg 30s, warum der Unterschied Es gibt mehrere Programme, die öffentliche / private RSA-Schlüsselpaare erzeugen können
GnuPG / OpenPGP hat zum Beispiel einen Zauberer, über den aufgerufen wird
gpg --gen-key
OpenSSL kann über diese Befehlszeilen ein Schlüsselpaar generieren
openssl genrsa -out testkey.private 2048 openssl rsa -in testkey.private -pubout -out testkey.public
für das gleiche, das ein Schlüsselpaar RSA 2048-Bit erzeugt, kann ich - auf derselben Maschine - sehr unterschiedliche Zeiten wahrnehmen.
openssl
Das Generieren eines Schlüsselpaars in ungefähr 0,5 Sekunden
gpg
dauert ungefähr 30 Sekunden und sogar Werbung "Maus bewegen, um Zufälligkeit / Entropie zu erzeugen"
Kann der Unterschied erklärt werden? Ich weiß, dass gpg ein bisschen mehr tut als nur die RSA-Schlüsselerstellung, aber ich wähle speziell Option (4)
Bitte wählen Sie die gewünschte Art von Schlüssel aus: (1) RSA und RSA (Standard) (2) DSA und Elgamal (3) DSA (nur Zeichen) (4) RSA (nur Zeichen) Deine Auswahl?
Daher wird wirklich nur ein 2048-Bit-RSA-Schlüsselpaar generiert. Doch der Zeitunterschied beträgt 30 Sekunden?
Mir scheint, dass entweder gpg unnötig Zeit verschwendet oder OpenSSL nicht genug Zeit wartet und daher unsichere Schlüssel erstellt.
Meine Frage ist, was könnte den Unterschied erklären?
Aktualisieren
Die RSA-Erstellung muss eine gewisse Zufälligkeit als Eingabe verwenden. Um sicherzustellen, dass das schnelle Öffnen nicht einfach das Ergebnis einer gespeicherten Zufälligkeit ist, starte ich es mehrmals
time bash -c "für i in {1..50}; do openssl genrsa -out / dev / null 2048; done;"
was ergibt
echte 0m16.577s Benutzer 0m16.309s sys 0m0.092s
Das heißt, dass für 50 2048-Bit-RSA-Schlüssel (ich nehme an, dass sie viel Entropie / Zufälligkeit benötigen) openssl immer noch nur 16 Sekunden benötigt. Meine Annahme hier wäre daher die "Antwort", dass openssl gebrochen werden muss. Immerhin bin ich misstrauisch, dass mein Linux (ein 3.2.0-59-Kernel) so groß geworden ist, Zufälligkeit zu erzeugen.
Vielleicht liegt der Unterschied einfach darin, dass openssl /dev/urandom
und gpg verwendet werden. /dev/random
Wenn true, könnte dies den Zeitunterschied erklären. Mein Problem ist, dass ich nicht weiß, wie ich davon erfahren würde, um dies zu überprüfen.
update2
Um die Quelle von openssls Zufall zu testen, habe ich verwendet
strace -xe trace = Datei, lesen, schreiben, schließen openssl genrsa -out testkey5.private 2048 2> & 1 | grep random -A1
was ergibt
open ("/ dev / urandom", O_RDONLY | O_NOCTTY | O_NONBLOCK) = 4 Lesen Sie (4, "\ x21 \ xd8 \ xaa \ xf1 \ x2b \ x5f \ x4a \ x89 \ x5d \ x6c \ x58 \ x82 \ xc1 \ x88 \ x21 \ x04 \ xfa \ x5b \ x18 \ x98 \ x8a \ x34 \ x2b \ xe3 \ xf3 \ xc0 \ xb1 \ xef \ xfb \ x44 \ x15 \ x09 ", 32) = 32
es scheint also, dass 32 Bytes von /dev/urandom
(nicht das "bessere" /dev/random
) für das 2048-Bit-RSA-Schlüsselpaar in openssl ausreichen. Deshalb ist es so schnell!
Messungen
2048-Bit-RSA-Schlüsselpaar-Generierungsmittel
- Nur 32 Bytes
/dev/urandom
(mit openssl) - 300 Bytes
/dev/random
(mit openPGP GNU Privacy Guard)
das erklärt natürlich den zeitunterschied!
/dev/urandom
, sagt gpg sogar "1 Byte/dev/random
ist nicht gut genug für 1 Byte Zufall". Würde dies nicht bedeuten, dass openssl-Schlüssel im Vergleich zu gpg's anfälliger für "zu wenig Zufälligkeit" sind?