Verwenden Sie den privaten RSA-Schlüssel, um einen öffentlichen Schlüssel zu generieren?


394

Ich verstehe das nicht wirklich:

Laut: http://www.madboa.com/geek/openssl/#key-rsa können Sie einen öffentlichen Schlüssel aus einem privaten Schlüssel generieren.

openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub

Mein erster Gedanke war, dass sie zusammen zu zweit erzeugt werden. Enthält der private RSA-Schlüssel die Summe? oder der öffentliche Schlüssel?


1
Für jeden, der rsa und openssl verwendet und eine große Datei wie 5 KByte verschlüsseln möchte. Bitte denken Sie daran, dass der öffentliche Schlüssel proportional oder größer zu dem sein sollte, was Sie verschlüsseln möchten. Andernfalls erhalten Sie eine "Datei zu groß, um verschlüsselt zu werden". Ich fasse zusammen, dass Sie einen ziemlich großen und seriösen privaten Schlüssel generieren und daraus Ihre privaten Schlüssel erstellen, sodass Sie mit vielen Daten arbeiten können. Ich sagte, wen ich in openssl über den Fehler kenne, und dass sie es einfach selbst schleifen lassen sollten, sonst werden Sie viel Zeit damit verbringen, herauszufinden, warum es sich über die Größe beschwert.
Kent Hansen

10
Das Problem, das Kent Hansen beschreibt, ist auf die direkte Verwendung von RSA für Klartextdaten zurückzuführen, was aus Sicherheitsgründen auf keinen Fall erfolgen sollte. Verwenden Sie stattdessen ein gut analysiertes Hybridverschlüsselungsschema wie RSA-KEM ( tools.ietf.org/html/rfc5990#appendix-A ), wobei ein authentifiziertes symmetrisches Verschlüsselungsschema wie Encrypt- Then -HMAC auf die Daten angewendet wird.
Daira Hopwood



@ SteffenUllrichs Antwort in diesem Link erklärt warum: security.stackexchange.com/questions/172274/…
bearzyj

Antworten:


577
openssl genrsa -out mykey.pem 1024

wird tatsächlich ein öffentlich-privates Schlüsselpaar erzeugen. Das Paar wird in der generierten mykey.pemDatei gespeichert.

openssl rsa -in mykey.pem -pubout > mykey.pub

extrahiert den öffentlichen Schlüssel und druckt ihn aus. Hier ist ein Link zu einer Seite, die dies besser beschreibt.

BEARBEITEN: Überprüfen Sie den Beispielabschnitt hier . So geben Sie einfach den öffentlichen Teil eines privaten Schlüssels aus:

openssl rsa -in key.pem -pubout -out pubkey.pem

Verwenden Sie ssh-keygen, um einen für SSH-Zwecke verwendbaren öffentlichen Schlüssel zu erhalten :

ssh-keygen -y -f key.pem > key.pub

50
Es ist verwirrend, wie jeder in Tutorials überall sagt, dass Sie mit dem Befehl openssl genrsa den PRIVATEN SCHLÜSSEL generieren, weil sie vergessen, dass er auch den ÖFFENTLICHEN SCHLÜSSEL
generiert

15
@jaime kannst du ihnen wirklich die Schuld geben? Die offizielle Dokumentation sagt absolut nichts über einen öffentlichen Schlüssel aus. "BESCHREIBUNG: Der Befehl genrsa generiert einen privaten RSA-Schlüssel." openssl.org/docs/apps/genrsa.html
Despertar

124
@jaime, Das liegt daran, dass dies nicht der Fall ist - genrsa generiert nur den privaten Schlüssel, der öffentliche Schlüssel wird nicht gespeichert. Wenn Sie jedoch den privaten Schlüssel haben, können Sie den öffentlichen Schlüssel daraus berechnen (ableiten) - was der obige 2. Befehl tut. Es berechnet den öffentlichen Schlüssel und extrahiert ihn nicht.
Steveayre

13
@steveayre Nach meinem Verständnis waren die RSA-Schlüssel einfach die beiden Exponenten ( eund din der allgemeinen Literatur). Weder ist mathematisch privat noch öffentlich, das sind Labels, die bei der Erstellung willkürlich zugewiesen werden. Sie könnten genauso gut umgekehrt zugeordnet werden. Das Generieren eines aus dem anderen ist ein gleichwertiges Problem. Das .pemFormat enthält eine ganze Reihe von Informationen, einschließlich beider Exponenten und damit beider Schlüssel, oder?
Lynks

13
@steveayre ist meistens falsch. Die öffentlichen RSA-Schlüsselkomponenten (n, e) werden mit generiert und in die mit dem openssl genrsaBefehl erstellte private RSA-Schlüsseldatei eingebettet . Eine separate Datei mit öffentlichem Schlüssel wird jedoch nicht im selben Schritt erstellt. Um den öffentlichen Schlüssel aus der privaten Schlüsseldatei in eine separate öffentliche Schlüsseldatei zu extrahieren, verwenden Sie Ihren openssl rsa -in private.pem -pubout -out public.pemBefehl. Wenn Sie auf diese Weise einen öffentlichen Schlüssel erstellen, wird dieser aus der privaten Schlüsseldatei extrahiert und nicht berechnet. Siehe meine Antwort unten für weitere Details.
Golem

273

Leute, die nach einem öffentlichen SSH-Schlüssel suchen ...

Wenn Sie den öffentlichen Schlüssel für die Verwendung mit OpenSSH extrahieren möchten, müssen Sie den öffentlichen Schlüssel etwas anders abrufen

$ ssh-keygen -y -f mykey.pem > mykey.pub

Dieses öffentliche Schlüsselformat ist mit OpenSSH kompatibel. Fügen Sie den öffentlichen Schlüssel an remote:~/.ssh/authorized_keysund Sie können loslegen


Dokumente von SSH-KEYGEN(1)

ssh-keygen -y [-f input_keyfile]  

-y Diese Option liest eine private Datei im OpenSSH-Format und druckt einen öffentlichen OpenSSH-Schlüssel an stdout.


3
Das funktioniert wie ein Zauber! Es generiert ein Format, das Github annimmt! Github verwendet nicht das PEM-Format. Die zuvor vorgeschlagene Antwort openssl rsa -in key.pem -pubout -out pubkey.pemwurde nicht akzeptiert, da die Ausgabe offensichtlich ein öffentlicher Schlüssel im PEM-Format ist. Daher wurde folgende Fehlermeldung angezeigt: "Schlüssel ist ungültig. Er muss mit 'ssh-rsa' oder 'ssh-dss' beginnen. Überprüfen Sie, ob Sie die öffentliche Hälfte des Schlüssels kopieren." Allerdings ssh-keygen -y [-f input_keyfile] erzeugt das richtige Format , dass Github nimmt.
Devy

71

In den meisten Programmen, die private RSA-Schlüssel generieren, einschließlich openssls, wird der private Schlüssel als PKCS # 1 RSAPrivatekey- Objekt oder als eine Variante davon dargestellt:

A.1.2 Syntax des privaten RSA-Schlüssels

Ein privater RSA-Schlüssel sollte mit dem ASN.1-Typ
RSAPrivateKey dargestellt werden:

  RSAPrivateKey ::= SEQUENCE {
      version           Version,
      modulus           INTEGER,  -- n
      publicExponent    INTEGER,  -- e
      privateExponent   INTEGER,  -- d
      prime1            INTEGER,  -- p
      prime2            INTEGER,  -- q
      exponent1         INTEGER,  -- d mod (p-1)
      exponent2         INTEGER,  -- d mod (q-1)
      coefficient       INTEGER,  -- (inverse of q) mod p
      otherPrimeInfos   OtherPrimeInfos OPTIONAL
  }

Wie Sie sehen können, enthält dieses Format eine Reihe von Feldern, einschließlich des Moduls und des öffentlichen Exponenten, und ist daher eine strikte Obermenge der Informationen in einem öffentlichen RSA-Schlüssel .


Meinen Sie damit, dass es bei einem privaten Schlüssel mathematisch machbar ist, den öffentlichen Schlüssel zu generieren? Ist die Stärke von RSA nicht die Tatsache, dass es rechnerisch nicht machbar ist, einen Schlüssel unter Berücksichtigung des anderen zu generieren?
Raam

30
@ Raam: Nein, die Stärke von RSA ist, dass es nicht möglich ist, den privaten Schlüssel aus der Öffentlichkeit zu generieren. Generieren Sie die öffentliche Form, die privat ist trivial.
Präsident James K. Polk

@ GregS, warum? Ein Schlüssel besteht aus einem Modul und einem Exponenten. Wenn der andere Exponent aus diesen beiden Zahlen berechnet werden kann, würde RSA leicht geknackt werden. Enthält der private OpenSSL-Schlüssel also mehr als Exponenten und Module?
Calmarius

1
@Calmarius: Wer sagt, dass ein Schlüssel aus einem Modul und einem Exponenten besteht? Das wäre der minimale private Schlüssel, aber normalerweise enthält der private Schlüssel andere Komponenten wie die Primfaktoren. Lesen Sie die Antwort für die Details.
Präsident James K. Polk

1
@ JamesKPolk Das stimmt nicht unbedingt. Wenn der öffentliche Exponent groß ist (dh dieselben Eigenschaften wie der private Exponent hat), kann der öffentliche Schlüssel möglicherweise nicht rekonstruiert werden. Die meisten Bibliotheken unterstützen dies nicht, aber das RSA-Kryptosystem erfordert sicherlich nicht, dass Sie den öffentlichen Schlüssel aus dem privaten Schlüssel rekonstruieren.
Maarten Bodewes

34

Meine Antwort unten ist etwas lang, aber hoffentlich enthält sie einige Details, die in früheren Antworten fehlen. Ich werde mit einigen verwandten Aussagen beginnen und schließlich die erste Frage beantworten.

Um etwas mit dem RSA-Algorithmus zu verschlüsseln, benötigen Sie ein Exponentenpaar aus Modul und Verschlüsselung (öffentlich) (n, e). Das ist dein öffentlicher Schlüssel. Um etwas mit dem RSA-Algorithmus zu entschlüsseln, benötigen Sie ein Exponentenpaar aus Modul und Entschlüsselung (privat) (n, d). Das ist dein privater Schlüssel.

Um etwas mit dem öffentlichen RSA-Schlüssel zu verschlüsseln, behandeln Sie Ihren Klartext als Zahl und erhöhen ihn auf die Potenz des Moduls n:

ciphertext = ( plaintext^e ) mod n

Um etwas mit dem privaten RSA-Schlüssel zu entschlüsseln, behandeln Sie Ihren Chiffretext als Zahl und erhöhen ihn auf die Potenz des Moduls d:

plaintext = ( ciphertext^d ) mod n

Um einen privaten (d, n) Schlüssel mit openssl zu generieren, können Sie den folgenden Befehl verwenden:

openssl genrsa -out private.pem 1024

Um einen öffentlichen (e, n) Schlüssel aus dem privaten Schlüssel mit openssl zu generieren, können Sie den folgenden Befehl verwenden:

openssl rsa -in private.pem -out public.pem -pubout

Führen Sie die folgenden Schritte aus, um den Inhalt des privaten RSA-Schlüssels private.pem zu zerlegen, der mit dem obigen Befehl openssl generiert wurde (Ausgabe hier auf Beschriftungen abgeschnitten):

openssl rsa -in private.pem -text -noout | less

modulus         - n
privateExponent - d
publicExponent  - e
prime1          - p
prime2          - q
exponent1       - d mod (p-1)
exponent2       - d mod (q-1)
coefficient     - (q^-1) mod p

Sollte der private Schlüssel nicht nur aus (n, d) Paaren bestehen? Warum gibt es 6 zusätzliche Komponenten? Es enthält e (öffentlicher Exponent), sodass der öffentliche RSA-Schlüssel aus dem privaten RSA-Schlüssel private.pem generiert / extrahiert / abgeleitet werden kann. Die restlichen 5 Komponenten beschleunigen den Entschlüsselungsprozess. Es stellt sich heraus, dass durch Vorberechnung und Speicherung dieser 5 Werte die RSA-Entschlüsselung um den Faktor 4 beschleunigt werden kann. Die Entschlüsselung funktioniert ohne diese 5 Komponenten, kann jedoch schneller durchgeführt werden, wenn Sie sie zur Hand haben. Der Beschleunigungsalgorithmus basiert auf dem chinesischen Restsatz .

Ja, der private RSA-Schlüssel private.pem enthält tatsächlich alle diese 8 Werte. Keiner von ihnen wird im laufenden Betrieb generiert, wenn Sie den vorherigen Befehl ausführen. Führen Sie die folgenden Befehle aus und vergleichen Sie die Ausgabe:

# Convert the key from PEM to DER (binary) format
openssl rsa -in private.pem -outform der -out private.der

# Print private.der private key contents as binary stream
xxd -p private.der

# Now compare the output of the above command with output 
# of the earlier openssl command that outputs private key
# components. If you stare at both outputs long enough
# you should be able to confirm that all components are
# indeed lurking somewhere in the binary stream
openssl rsa -in private.pem -text -noout | less

Diese Struktur des privaten RSA-Schlüssels wird von PKCS # 1 v1.5 als alternative ( zweite ) Darstellung empfohlen . Der PKCS # 1 v2.0- Standard schließt e- und d-Exponenten insgesamt von der alternativen Darstellung aus. PKCS # 1 v2.1 und v2.2 schlagen weitere Änderungen an der alternativen Darstellung vor, indem optional mehr CRT-bezogene Komponenten einbezogen werden.

Führen Sie die folgenden Schritte aus, um den Inhalt des öffentlichen RSA-Schlüssels public.pem anzuzeigen (Ausgabe hier auf Beschriftungen gekürzt):

openssl rsa -in public.pem -text -pubin -noout

Modulus             - n
Exponent (public)   - e

Keine Überraschungen hier. Es ist nur (n, e) Paar, wie versprochen.

Beantworten Sie nun endlich die erste Frage: Wie oben gezeigt, enthält der mit openssl generierte private RSA-Schlüssel Komponenten sowohl öffentlicher als auch privater Schlüssel und einige weitere. Wenn Sie einen öffentlichen Schlüssel aus dem privaten Schlüssel generieren / extrahieren / ableiten, kopiert openssl zwei dieser Komponenten (e, n) in eine separate Datei, die zu Ihrem öffentlichen Schlüssel wird.


Sie haben geschrieben: "Um einen öffentlichen (d, n) Schlüssel aus dem privaten Schlüssel zu generieren ...". Sollte es nicht "(e, n)" sein? Vielen Dank für die tolle Antwort!
elaktische

Sie vergleichen die (externe) 'Syntax' in Version 1.5 mit der Semantik in späteren Versionen. Überprüfen Sie 2.0 # 11.1.2 und 2.1 und 2.2 # A.1.2 und Sie werden sehen, dass n, e, d noch vorhanden sind. (Wie James Polks Antwort bereits vermerkt hat.)
dave_thompson_085

1
erstaunliche Erklärung. Vielen Dank
Francisco Albert

1
Es scheint, dass der öffentliche Exponent eimmer 65537 ist 0x010001. Es ist wahrscheinlich ein Defacto für die Auswahl des öffentlichen Exponenten, und dies ist wahrscheinlich der Grund in der Manpage, und fast jeder Ort genrsawird als erklärt to generate the private key. Die öffentliche ist irgendwie offensichtlich.
Shampoo

Kann ich das (n, e) nur aus (n, d) berechnen ?
Flyq

21

Der öffentliche Schlüssel wird nicht in der PEM-Datei gespeichert, wie manche Leute denken. Die folgende DER-Struktur ist in der privaten Schlüsseldatei vorhanden:

openssl rsa -text -in mykey.pem

RSAPrivateKey ::= SEQUENCE {
  version           Version,
  modulus           INTEGER,  -- n
  publicExponent    INTEGER,  -- e
  privateExponent   INTEGER,  -- d
  prime1            INTEGER,  -- p
  prime2            INTEGER,  -- q
  exponent1         INTEGER,  -- d mod (p-1)
  exponent2         INTEGER,  -- d mod (q-1)
  coefficient       INTEGER,  -- (inverse of q) mod p
  otherPrimeInfos   OtherPrimeInfos OPTIONAL
}

So gibt es genügend Daten den öffentlichen Schlüssel (Modul und öffentliche Exponenten) zu berechnen, das ist , was openssl rsa -in mykey.pem -pubouttut


Ich sehe, dass der öffentliche Schlüssel dort nicht gespeichert ist, obwohl er wie der private Schlüssel ableitbar ist, aber ich sehe auch nicht, dass der private Schlüssel dort gespeichert ist?! doch wenn ich die pem datei cat ich sehe es sagt privater schlüssel und einige ascii.
Barlop

2
Der private Schlüssel wird ebenfalls abgeleitet. Sehen Sie sich das Feld privateExponent an. Sie können die Felder mit openssl rsa -text -in mykey.pem
Uxio

2
Der öffentliche Schlüssel wird tatsächlich im PEM gespeichert, da der PEM auch e und d enthält, dh den öffentlichen Schlüssel. Im Gegensatz zu diskreten Protokollalgen kann der öffentliche Schlüssel rsa nicht nur aus dem privaten Schlüssel (d, n) berechnet werden. Es ist nur da, weil die rsa-Spezifikationen angeben, dass es mit dem privaten Schlüssel und anderen Informationen gespeichert werden soll.
Michael Chourdakis

1
Ja, diese Antwort ist in jeder Hinsicht FALSCH . Sowohl der öffentliche Exponent als auch der Modul sind vorhanden, sodass der öffentliche Schlüssel mit Sicherheit vorhanden ist. Der öffentliche Exponent muss dort nur den öffentlichen Schlüssel ohne Berechnungen abrufen .
Maarten Bodewes

1
@ MaartenBodewes: Die Antwort ist richtig. Was zitiert wird, wird dem relevanten RFC als die für einen PRIVATE-Schlüssel gespeicherten Werte entnommen. Dass zwei der Werte auch / nur für die Verschlüsselung mit öffentlichem Schlüssel verwendet werden, ändert nichts daran, dass dies die privaten Schlüsseldaten sind. Ich habe all diese Dinge in den letzten zwei Tagen gelernt, nicht indem ich Fragen gestellt habe, sondern indem ich nachgeschlagen und den relevanten Standard gelesen habe. Ich verstehe jetzt alles über ASN.1, DER, PEM und RSA (naja, vielleicht nicht ALLES über RSA).
AlastairG

8

Hier in diesem Code erstellen wir zuerst einen privaten RSA-Schlüssel, der jedoch auch ein Paar seines öffentlichen Schlüssels enthält. Um Ihren tatsächlichen öffentlichen Schlüssel zu erhalten, tun wir dies einfach

openssl rsa -in mykey.pem -pubout > mykey.pub

hoffen , dass Sie es für weitere Informationen erhalten Check dieses


6

Zunächst eine kurze Zusammenfassung der RSA-Schlüsselgenerierung.

  1. Wählen Sie zufällig zwei zufällige wahrscheinliche Primzahlen der entsprechenden Größe (p und q).
  2. Multiplizieren Sie die beiden Primzahlen miteinander, um den Modul (n) zu erhalten.
  3. Wählen Sie einen öffentlichen Exponenten (e).
  4. Rechnen Sie mit den Primzahlen und dem öffentlichen Exponenten, um den privaten Exponenten (d) zu erzeugen.

Der öffentliche Schlüssel besteht aus dem Modul und dem öffentlichen Exponenten.

Ein minimaler privater Schlüssel würde aus dem Modul und dem privaten Exponenten bestehen. Es gibt keinen rechnerisch realisierbaren todsicheren Weg, um von einem bekannten Modul und privaten Exponenten zum entsprechenden öffentlichen Exponenten zu gelangen.

Jedoch:

  1. Praktische private Schlüsselformate speichern fast immer mehr als n und d.
  2. Wenn e normalerweise nicht zufällig ausgewählt wird, wird einer von wenigen bekannten Werten verwendet. Wenn e einer der bekannten Werte ist und Sie d kennen, ist es einfach, e durch Ausprobieren herauszufinden.

In den meisten praktischen RSA-Implementierungen können Sie den öffentlichen Schlüssel vom privaten Schlüssel abrufen. Es wäre möglich, ein RSA-basiertes Kryptosystem aufzubauen, in dem dies nicht möglich war, aber es ist nicht das Richtige.


1
Use the following commands:

1. openssl req -x509 -nodes -days 365 -sha256 -newkey rsa:2048 -keyout mycert.pem -out mycert.pem

Loading 'screen' into random state - done
Generating a 2048 bit RSA private key
.............+++
..................................................................................................................................................................+++
writing new private key to 'mycert.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.

2. If you check there will be a file created by the name : mycert.pem

3. openssl rsa -in mycert.pem -pubout > mykey.txt
writing RSA key

4. If you check the same file location a new public key : mykey.txt will be created.

1
Das ist dumm; Sie müssen keine zusätzlichen Anstrengungen unternehmen, um ein nutzloses Zertifikat zu erstellen, wenn Sie nur ein Schlüsselpaar benötigen. Für einige andere Fragen, bei denen Sie ein Zertifikat wünschen, könnte dies eine Antwort sein.
Dave_thompson_085
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.