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?/dev/urandom
für Kryptozwecke gut genug sei. Auf der GnuPG-Mailingliste würde er wahrscheinlich dafür ausgelacht werden. AFAIK Es ist unmöglich zu beweisen, dass bestimmte Daten rein zufällig sind. Sie können Nicht-Zufälligkeit finden, aber nur dort, wo Sie genau nach diesem Muster suchen./dev/random
während OpenSSL nur 32 Byte verwendet,/dev/urandom
scheint ein potenzielles Sicherheitsrisiko für den vorsichtigen Benutzer zu sein, der ein 2048-Bit-RSA-Schlüsselpaar möchte. Ich würde mich daher für gpg entscheiden. 32bytes scheint schrecklich wenig/dev/urandom
ist, dass es (unter Linux) nicht blockiert, bevor es direkt nach dem Booten gesetzt wird. Sobald es ausgesät wurde, bleibt es für immer sicher.Ihr Vorschlag , dass dieser Unterschied ist , weil
openssl
Anwendungen / dev / urandom undgpg
Anwendungen/dev/random
korrekt ist .Sie können beobachten, wie die verfügbare Entropie beim Generieren von Schlüsseln abnimmt, indem Sie Folgendes
gpg
verwenden:Ich habe ein Programm zum Generieren der Beschreibung der Schritte zum Einrichten einer OpenGPG-Smartcard verwendet
gpg
, sodass ichgpg
mehrere Male ausführen musste, bis alles wie beabsichtigt funktioniert hat. Nach den ersten Läufen bemerkte ich, dass/dev/random
es nicht genug Entropie geben würde und gpg einfach warten würde, bis sich neue Entropie ansammelt.Ich habe ein kleines Programm geschrieben, um zusätzliche nicht zufällige Daten bereitzustellen, und wenn ich dies tue,
gpg
würde ich nicht "anhalten", sondern die Schlüssel fast sofort generieren: schön, um das Skript zu testen, damit es korrekt ausgeführt wird, aber natürlich nicht etwas, das Sie tun sollten, während Sie Ihre realen Daten generieren Schlüssel.Das Programm zum Beschleunigen
gpg
( nicht in realen Situationen verwenden ):Wenn ich dies beim Anschauen ausführe,
entropy_avail
kann ich sehen, dass die verfügbare Entropie auf über 3800 ansteigt.quelle
cat
von selbst die Entropie nicht bereits erschöpft ? Haben Sie Beweise oder Quellen, aus denen hervorgeht, dass GPG-Anwendungen/dev/random
die Antwort perfektionieren würden? Bedeutet das schließlich auch, dass openssl RSA-Schlüsselpaare von geringerer Qualität erzeugt als gqg?Unattended key generation
in der Datei/usr/share/doc/packages/gpg2/DETAILS
(oder was auch immer es in Ihrer Distribution sein mag). Der/dev/random
Beweis ist in meiner Antwort.read
eingebauten Shell:while read -r < /proc/sys/kernel/random/entropy_avail; do clear; date; printf '\nAvailable entropy: %s bytes\n' "$REPLY"; sleep 1; done