Soweit ich mich erinnere, verschlüsseln Sie die Nachricht mit einem öffentlichen Schlüssel und entschlüsseln sie mit einem privaten Schlüssel. Meine Frage ist, ob es möglich ist, einen öffentlichen Schlüssel von einem privaten RSA-Schlüssel zu erhalten. Wenn ich beispielsweise einen Schlüssel wie diesen habe:
-----BEGIN RSA PRIVATE KEY----- MIICXgIBAAKBgQCtrKVnwse4anfX+JzM7imShXZUC+QBXQ11A5bOWwHFkXc4nTfE Or3fJjnRSU5A3IROFU/pVVNiXJNkl7qQZK5mYb8j3NgqX8zZJG7IwLJ/Pm2sRW5Q j32C/uJum64Q/iEIsCg/mJjDLh1lylEMEuzKgTdWtoeLfxDBL2AJ20qXzQIDAQAB AoGBAKNXi0GpmjnCOPDxLFg5bvQVfhLSFCGMKQny1DVEtsfgZmbixv5R2R41T4+d CHJMdEsUFFJ6I7CRLTcg1SDU8IhcAWCBRSNeVuomCHlQG16ti8HxwhiwIcjvDz/z NC2sL5ZJ2eJnhbtXLdf6pxxO1pA5vLp1AX06IaETO977XvupAkEA+ZgtGZybyUkf tEA3ekXc5eLoW+zgU0C1fATWcIZ8Iq5YV1BW+3oAzf8HgIbkQh4LM2qa6An3l+vW NXR4wICHkwJBALIhrcdJqKw36qiyenq+m78klp5SnurQifVt0Sy1GMWyOUqYz5jK t9sGo9Qn6GDuYe/XGXKWQW25PkEYXxxPPx8CQQCpICyvRidp5VrOURVGjUB5pZ+9 am02/In9V2nXJcnH1kuWHqJSFQGmlEEJHl5dTu5YEMyWnupezzd/UUThbDZxAkAz TNO5QxNalbf04YG4e9Bq2eSur+iog2pXzkqhb3404UDypNOUkz0jzOO9o8ieschu xCnGAFPTf7fYE2bAxmnNAkEA0/3bdsvJclquypqP9CQeQnxGwQtWz6+yn07gj3U1 V19mdeKCUZWklRarrcr67u9DdEx+JowyEY/ppzgeQtW01g== -----END RSA PRIVATE KEY-----
kann ich einen öffentlichen Schlüssel erhalten?
Kommentare
- Dieser Schlüssel ist jetzt ins Internet gelangt und kann nicht mehr außerhalb von Beispielen verwendet werden, nur damit Sie dies erkennen.
- “ Hier ist der Schlüssel zu meinem Haus. Wer möchte eine Kopie erstellen? “
- Ich hoffe, dass das OP einen Beispielschlüssel nur zur Verwendung in dieser Frage generiert und dann sofort entsorgt hat.
- @ basic6 “ Hier ist der Schlüssel zu meinem Haus. Wie mache ich mir eine Sperre dafür? “
- Sie müssen klären, ob Sie ‚ danach fragen nur der private Schlüssel (in diesem Fall lautet die Antwort nein) oder die private Schlüsseldatei , die gemäß Konvention (wie hier) beide Schlüssel enthält.
Antwort
Kann ich einen öffentlichen Schlüssel erhalten?
Mit openssl rsa
ist es ganz einfach:
$ openssl rsa -in the-private-key-from-your-question.pem -pubout writing RSA key -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCtrKVnwse4anfX+JzM7imShXZU C+QBXQ11A5bOWwHFkXc4nTfEOr3fJjnRSU5A3IROFU/pVVNiXJNkl7qQZK5mYb8j 3NgqX8zZJG7IwLJ/Pm2sRW5Qj32C/uJum64Q/iEIsCg/mJjDLh1lylEMEuzKgTdW toeLfxDBL2AJ20qXzQIDAQAB -----END PUBLIC KEY---
Wenn Sie sich ein Bild davon machen möchten, was in einer Schlüsseldatei enthalten ist, können Sie die Option -text
übergeben, um einen für Menschen lesbaren (Art) Debug-Dump anzuzeigen. Auf diese Weise können Sie Stellen Sie sicher, dass eine Schlüsseldatei sowohl private als auch öffentliche Informationen enthält. Insbesondere enthält sie den Modul und publicExponent, die den öffentlichen Schlüssel vollständig beschreiben:
$ openssl rsa -text -in the-private-key-from-your-question.pem Private-Key: (1024 bit) modulus: 00:ad:ac:a5:67:c2:c7:b8:6a:77:d7:f8:9c:cc:ee: 29:92:85:76:54:0b:e4:01:5d:0d:75:03:96:ce:5b: 01:c5:91:77:38:9d:37:c4:3a:bd:df:26:39:d1:49: 4e:40:dc:84:4e:15:4f:e9:55:53:62:5c:93:64:97: ba:90:64:ae:66:61:bf:23:dc:d8:2a:5f:cc:d9:24: 6e:c8:c0:b2:7f:3e:6d:ac:45:6e:50:8f:7d:82:fe: e2:6e:9b:ae:10:fe:21:08:b0:28:3f:98:98:c3:2e: 1d:65:ca:51:0c:12:ec:ca:81:37:56:b6:87:8b:7f: 10:c1:2f:60:09:db:4a:97:cd publicExponent: 65537 (0x10001) privateExponent: (…)
Kommentare
- @Pysis: Bei dieser Antwort geht es nicht um “ Finden von “ der Öffentlichkeit aus dem öffentlichen Schlüssel. Es ist einfach, dass alle Informationen, die sowohl für den privaten als auch für den öffentlichen Teil benötigt werden, in der privaten Schlüsseldatei gespeichert werden. In der Datei mit dem öffentlichen Schlüssel fehlen stattdessen alle Informationen zum privaten Teil.
- @Pysis Dies ist eine asymmetrische Verschlüsselung.
- @Pysis Ja, eine asymmetrische Verschlüsselung “ leicht asymmetrisch „.
- @SteffenUllrich Dieser Satz sollte Teil Ihrer Antwort sein
- @Mehrdad: Im Kontext der realen Informationssicherheit wird alles, was praktisch nicht realisierbar ist, als nicht realisierbar angesehen. Informationstheoretische Sicherheit spielt hier keine Rolle, da sie eine unbegrenzte Rechenleistung voraussetzt, die es einfach nicht gibt. Daher sollten alle Informationen zum privaten Teil fehlen, da alle Informationen, die es in der Praxis ermöglichen , den privaten Schlüssel abzuleiten, fehlen .
Antwort
In der Praxis können Sie dies Rufen Sie den öffentlichen Schlüssel vom privaten Schlüssel ab. Im Prinzip wäre es möglich, einen privaten RSA-Schlüssel zu erstellen, aus dem der entsprechende öffentliche Schlüssel nicht einfach sein kann Dies würde jedoch die Verwendung einer nicht standardmäßigen Schlüsselgenerierungsmethode und eines nicht standardmäßigen privaten Schlüsselspeicherformats erfordern.
Lassen Sie uns die Grundlagen schnell überprüfen. Ein öffentlicher RSA-Schlüssel besteht aus zwei Werte:
- der Modul n (ein Produkt aus zwei geheim ausgewählten großen Primzahlen p und q ), und
- der öffentliche Exponent e (der für viele Schlüssel gleich sein kann und typischerweise als kleine ungerade Primzahl gewählt wird, am häufigsten entweder 3 oder 2 16 +1 = 6 5537).
Ein privater RSA-Schlüssel erfordert unterdessen mindestens die folgenden zwei Werte:
- den Modul n (wie im öffentlichen Schlüssel) und
- der private Exponent d (berechnet aus dem öffentlichen Exponenten e und die Faktoren p und q des Moduls).
Die meisten Formate zum Speichern von privaten RSA-Schlüsseln, einschließlich der PKCS1 Das in Ihrer Frage gezeigte RSAPrivateKey-Format speichert tatsächlich eine Reihe zusätzlicher Werte, einschließlich:
- des öffentlichen Exponenten e
,
Insbesondere die Einbeziehung des öffentlichen Exponenten e im privaten Schlüsselformat bedeutet, dass der öffentliche Schlüssel trivial aus einer PKCS1-kompatiblen privaten Schlüsseldatei extrahiert werden kann.Selbst wenn der öffentliche Exponent e nicht in der privaten Schlüsseldatei enthalten war, ermöglicht die Kenntnis der Faktoren p und q des Moduls beide Exponenten leicht aus dem anderen berechnet werden. Und schließlich könnten wir für RSA-Schlüssel, die auf die übliche Weise generiert wurden, einfach die am häufigsten verwendeten Werte von e testen und sehen, welcher von ihnen generiert, selbst wenn wir die Faktoren des Moduls nicht kennen Chiffretexte, die mit dem angegebenen privaten Schlüssel korrekt entschlüsselt werden können.
Alles, was gesagt wurde, wenn wir einen nicht standardmäßigen RSA-Schlüsselgenerierungsalgorithmus verwenden würden, der e ( oder d ) zufällig aus dem zulässigen Wertebereich (dh die ganzen Zahlen größer als 1 und kleiner als und koprime mit λ ( n ) = lcm ( p − 1, q − 1)), und wenn wir ein nicht standardmäßiges privates RSA-Schlüsselformat verwendet haben, in dem nur die minimalen Mindestinformationen für die Entschlüsselung gespeichert wurden (dh n und d ), dann wäre es nicht möglich, den öffentlichen Schlüssel aus dem privaten Schlüssel zu berechnen, ohne den Schlüssel effektiv zu knacken (dh den Modul zu berücksichtigen).
In der Tat, wenn er in einem solchen nicht standardmäßigen Mann verwendet wird ner wird der RSA-Algorithmus in dem Sinne „symmetrisch“, dass keiner der Schlüssel ( n , e ) und ( n , ) d ) kann effektiv aus dem anderen berechnet werden und jeder kann willkürlich als privater Schlüssel bezeichnet werden. Wenn Sie dem privaten Schlüsselinhaber den entsprechenden „öffentlichen“ Schlüssel nicht mitteilen würden (was natürlich bedeutet, dass er nicht mehr wirklich öffentlich ist), könnten sie im Prinzip nur Nachrichten entschlüsseln, aber nicht verschlüsseln. Leider ist der praktische Nutzen eines solchen Schemas eher durch die einfache Tatsache begrenzt, dass derjenige, der das Schlüsselpaar generiert, zwangsläufig ohnehin beide Hälften davon kennt.
Kommentare
- Ich runzele die Stirn wegen des letzten Satzes. Da e ohnehin als öffentlich angesehen wird, kann das Nicht-Vergessen von e (und p und q) kaum als Hintertür angesehen werden, die dem Besitzer des privaten Schlüssels zur Verfügung steht. (Und wenn ein Gegner den privaten Schlüssel d erhält, hat er auch den öffentlichen Schlüssel e und gewinnt)
- @HagenvonEitzen: Im letzten Absatz geht es um den (nicht standardmäßigen) Anwendungsfall, bei dem e weder öffentlich noch klein ist .
- @HagenvonEitzen: In der Tat habe ich dieses Problem im verlinkten crypto.SE-Beitrag erwähnt. Jedes Schema, das sich darauf stützt, dass der “ public “ -Schlüssel nicht vom “ private abgeleitet werden kann “ Schlüssel muss unbedingt den “ public “ Schlüssel vor mindestens einigen Parteien geheim halten ( und damit gegen eine der Standardannahmen der Krypto mit öffentlichem Schlüssel verstoßen, damit diese Funktion von Nutzen ist. Aber ich kann sehen, wie dieser Absatz irreführend gewesen sein kann; hoffentlich ist die umgeschriebene Version zumindest ein bisschen klarer.
- RSA hat eine interessante mathematische Eigenschaft, bei der die Entschlüsselung dieselbe Formel wie die Verschlüsselung verwendet, nur mit
d
anstelle vone
. Dank dessen können Siee
undd
austauschen (d. H. Den privaten Schlüssel für die Verschlüsselung und den öffentlichen Schlüssel für die Entschlüsselung verwenden). Dann erhalten Sie das elektronische Signaturschema.
Antwort
Ja. Es ist auch ganz einfach. Wenn Sie sich die RSA-Spezifikation ansehen, benötigt ein öffentlicher Schlüssel n
und e
. Ein privater Schlüssel hat möglicherweise p
q
d
. Verwenden Sie diese zur Berechnung.
n=p*q e=mod_inverse(d,euler_totient(n))
Wenn Sie sie wieder in ein PEM-Format packen möchten, lesen Sie https://github.com/ius/rsatool
Kommentare
- Als mathematische Antwort eingerahmt, ist dies falsch. Ein privater Schlüssel könnte nur n und d haben, und daher ist dies unmöglich Im Allgemeinen ist es in der Praxis normalerweise nur möglich, e ‚ zu verwenden, da e fast immer aus einer Handvoll von Werten ausgewählt wird. Als praktische Antwort ist dies falsch: e ist, In der Praxis immer in den anderen Parametern enthalten (mindestens n und d, normalerweise auch die für die CRT-basierte Berechnung erforderlichen Parameter).
- Einverstanden, aber praktisch RSA mit privaten CRT-Schlüsseln werden normalerweise gespeichert als ein Tupel von (n, e, d, p, q, dP, dQ, qInv), was hier der Fall ist. Ich habe gerade versucht, die Komponenten mathematisch festzulegen.
- Ja: Praktisch werden private Schlüssel normalerweise als Tupel gespeichert, das e enthält. Es ist nicht erforderlich, e zu berechnen.
- @Gilles Aus dem Beitrag: “ Ein öffentlicher Schlüssel benötigt
n
unde
.“ und von sudhackar ‚ s Kommentar: “ aber praktisch RSA mit privaten CRT-Schlüsseln normalerweise als Tupel von (n, e, d, p, q, dP, dQ, qlnv) “ gespeichert, was mich zu dem Schluss führt, dass praktisch private Schlüssel normalerweise gespeichert werden als Tupel , das den privaten Schlüssel enthält. Der private Schlüssel muss nicht berechnet werden, sodass diese gesamte Frage und alle ihre Antworten irrelevant sind. Ich verstehe ‚ Ihren letzten Kommentar nicht. Die Antwort von sudhackar ‚ zeigt, wie der Satz möglicher öffentlicher Schlüssel anhand der am wenigsten nützlichen Informationen ermittelt werden kann. - @ wizzwizz4 Wenn Sie p, q und d haben Sie haben mehr als die am wenigsten nützlichen Informationen, die für einen privaten Schlüssel möglich sind. Ich ‚ habe noch nie private Schlüssel mit p, q und d gesehen, aber nicht n und e. Sie müssen n verwenden, um mit dem Schlüssel etwas Nützliches zu tun, und wenn Sie p und q anstelle von n speichern, erhält ‚ keinen Speicherplatz.