it-swarm.com.de

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

Ich verstehe das nicht wirklich:

laut: http://www.madboa.com/geek/openssl/#key-rsa , Sie können 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 anfänglicher Gedanke war, dass sie in einem Paar zusammen erzeugt werden. Enthält der private RSA-Schlüssel die Summe? oder der öffentliche Schlüssel?

355
c2h2
openssl genrsa -out mykey.pem 1024

wird tatsächlich ein öffentlich-privates Schlüsselpaar erzeugen. Das Paar wird in der generierten mykey.pem -Datei 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

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

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

Leute, die nach öffentlichen SSH-Schlüsseln 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 beziehen

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

Dieses öffentliche Schlüsselformat ist mit OpenSSH kompatibel. Hängen Sie den öffentlichen Schlüssel an remote:~/.ssh/authorized_keys an, und Sie können loslegen


dokumente aus SSH-KEYGEN(1)

ssh-keygen -y [-f input_keyfile]  

- y Diese Option liest eine private OpenSSH-Formatdatei und druckt einen öffentlichen OpenSSH-Schlüssel auf stdout.

264
user633183

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

A.1.2 RSA-Syntax für private Schlüssel

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

  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, 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 .

65
James K Polk

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

Um etwas mit einem 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 einem RSA-Algorithmus zu entschlüsseln, benötigen Sie ein (privates) Exponentenpaar (n, d) für Modul und Entschlüsselung. Das ist dein privater Schlüssel.

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

ciphertext = ( plaintext^e ) mod n

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

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 mit openssl einen öffentlichen (e, n) Schlüssel aus dem privaten Schlüssel zu generieren, können Sie den folgenden Befehl verwenden:

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

Um den Inhalt des privaten RSA-Schlüssels private.pem zu zerlegen, der mit dem obigen Befehl openssl generiert wurde, führen Sie Folgendes aus (Ausgabe hier abgeschnitten auf Labels):

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 aus dem privaten RSA-Schlüssel private.pem ein öffentlicher RSA-Schlüssel generiert/extrahiert/abgeleitet werden kann. Die restlichen 5 Komponenten sollen den Entschlüsselungsprozess beschleunigen. Es stellt sich heraus, dass es durch Vorberechnen und Speichern dieser 5 Werte möglich ist, die RSA-Entschlüsselung um den Faktor 4 zu beschleunigen. 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 Chinese Remainder Theorem .

Ja, der private.pem RSA-Schlüssel 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. PKCS # 1 v2. Standard schließt e- und d-Exponenten von der alternativen Darstellung insgesamt aus. PKCS # 1 v2.1 und v2.2 schlagen weitere Änderungen an der alternativen Darstellung vor, indem optional weitere CRT-bezogene Komponenten einbezogen werden.

Führen Sie den folgenden Befehl aus, um den Inhalt des öffentlichen RSA-Schlüssels public.pem anzuzeigen (Ausgabe hier abgeschnitten auf Labels):

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

Modulus             - n
Exponent (public)   - e

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

Jetzt endlich die erste Frage beantworten: Wie oben gezeigt, enthält der mit openssl generierte private RSA-Schlüssel Komponenten sowohl des öffentlichen als auch des privaten Schlüssels und vieles mehr. Wenn Sie aus dem privaten Schlüssel einen öffentlichen Schlüssel generieren/extrahieren/ableiten, kopiert openssl zwei dieser Komponenten (e, n) in eine separate Datei, die Ihr öffentlicher Schlüssel wird.

24
golem

Der öffentliche Schlüssel wird nicht in der PEM-Datei gespeichert, wie manche Leute meinen. 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
}

Es sind also genügend Daten vorhanden, um den öffentlichen Schlüssel (Modul und öffentlicher Exponent) zu berechnen, was openssl rsa -in mykey.pem -pubout tut

21
Uxio

hier in diesem Code erstellen wir zunächst einen privaten RSA-Schlüssel, der jedoch auch über ein Paar seines öffentlichen Schlüssels verfügt. Um Ihren tatsächlichen öffentlichen Schlüssel zu erhalten, führen wir dies einfach aus

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

hoffe, Sie bekommen es für weitere Informationen überprüfen Sie dies

8
Rdx

Zunächst ein kurzer Rückblick auf die RSA-Schlüsselgenerierung.

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

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 machbaren todsicheren Weg, um von einem bekannten Modul und einem privaten Exponenten zu dem entsprechenden öffentlichen Exponenten zu gelangen.

Jedoch:

  1. Praktische private Schlüsselformate speichern fast immer mehr als n und d.
  2. e wird normalerweise nicht zufällig ausgewählt, sondern es 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 also vom privaten Schlüssel abrufen. Es wäre möglich, ein RSA-basiertes Kryptosystem zu erstellen, bei dem dies nicht möglich war, aber es ist nicht das, was getan wird.

5
plugwash
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.
0
Ankit Jain