2017-05-27 8 views

Antwort

2

PublicKey/PrivateKey sind Schlüssel für einen Algorithmus, der ein Schlüsselpaar verwendet, ohne anzugeben, was der Algorithmus ist.

Ihre RSA-verwandten Gegenstücke sind ihre Spezialisierungen für RSA-Algorithmus. Zum Beispiel hat RSAPublicKeygetPublicExponent() Methode fehlt in PublicKey. In der Praxis können Sie diese Regel verwenden: Wenn Sie sicher sind, dass Sie nur RSA verwenden, verwenden Sie RSAPublicKey/RSAPrivateKey; Andernfalls verwenden Sie PublicKey/PrivateKey.

+0

Entschuldigung, ich wollte die fehlenden Informationen zu Ihrer Antwort hinzufügen, aber es passte nicht, wie Sie aus meiner eigenen Antwort sehen können. Ich habe deine Antwort natürlich aufgefrischt - diese Frage kann eine schöne und kompakte Antwort wie diese und eine erweiterte verwenden :) –

+0

Kein Problem überhaupt :) –

4

Instanzen von Klassen wie Cipher und Signature wird jede PublicKey oder PrivateKey Instanz für ihre Initialisierungsmethoden während der Kompilierung der Regel akzeptieren. Der Schlüsseltyp sollte jedoch dem implementierten Algorithmus entsprechen. Dies wird zur Laufzeit überprüft, was zu einem InvalidKeyException führt, wenn der Schlüssel und der Algorithmus nicht übereinstimmen.

Dies ermöglicht den einfachen Wechsel zwischen Algorithmen, auch während der Laufzeit, wenn dies erforderlich ist. Daher kann der größte Teil des Codes unabhängig vom verwendeten Algorithmus implementiert werden, zumindest solange, bis Schlüsseltyp-spezifische Operationen erforderlich sind.


Beachten Sie, dass RSAPublicKey erstreckt PublicKey und dass beide Java-Schnittstellen. In der Regel sollten Sie selbst nur RSAPublicKey verwenden, wenn Sie die zusätzlichen Möglichkeiten der Schnittstelle benötigen. Dies sollte nicht oft der Fall sein; für die kryptografischen Operationen reicht normalerweise die PublicKey aus.

Manchmal benötigen Sie jedoch weitere Informationen wie die Schlüsselgröße (Modulgröße im Fall von RSA) oder codieren die Schlüssel anders als die Standardcodierung bereitstellt. In diesem Fall müssen Sie die Schnittstellen der höheren Ebene direkt verwenden.


Die KeyFactory und KeyPairGenerator Factory-Klassen einfach Ausgang PublicKey oder PrivateKey, letztere indirekt durch eine allgemeine KeyPair Instanz ausgibt. Wenn Sie die zusätzlichen Methoden benötigen Sie müssen daher Guss der öffentliche Schlüssel zu einem öffentlichen RSA-Schlüssel:

RSAPublicKey rsaPublicKey = (RSAPublicKey) publicKey; 

Wenn Sie jedoch nicht sicher sind, welche Art von Schlüssel Sie erhalten müssen Sie zunächst überprüfen, ob der Typ Korrektur mit instanceof:

if (publicKey instanceof RSAPublicKey) { 
    RSAPublicKey rsaPublicKey = (RSAPublicKey) publicKey; 
} 

oder Sie sollten die ClassCastException, die folgen könnten zu fangen bereit sein.


Kryptografieanbieter, implementiert gemäß der Java Cryptography Architecture, bieten die tatsächliche Implementierung dieser Schnittstellen.

Dies erklärt, eine weitere Nutzung dieser Schnittstellen: solange die zugrunde liegenden kryptographisches Material wie das Modul und den Exponenten kann es einen Schlüssel oder Schlüsselpaar mit einem Anbieter und es in einem anderen Anbieter verwenden, um erstellen möglich abgerufen werden . Dies wäre nicht möglich, wenn die Schnittstelle zum Abrufen des Moduls und des Exponenten nicht standardisiert wäre.

Hardwarebasierte Anbieter (Smartcards, HSMs) lösen normalerweise eine Ausnahme aus, wenn Sie versuchen, den privaten Exponenten oder anderes privates Schlüsselmaterial abzurufen. Dies liegt daran, dass der Schlüssel das Hardwaregerät im Allgemeinen nicht verlässt; Sie können die RSA-Vorgänge nur auf dem Gerät selbst ausführen, indem Sie den angegebenen Anbieter verwenden.

Es ist nicht möglich, diese Schlüssel in anderen Cipher Implementierungen zu verwenden. Java enthält daher eine "verzögerte Providerauswahl", um sicherzustellen, dass der richtige Provider ausgewählt wird, wenn er nicht explizit bei der Instanziierung angegeben wurde, zum Beispiel - Cipher.getInstance(String algorithm). Stattdessen wird der Provider während der Initialisierung ausgewählt.


RSAPrivateCrtKey ist eine Schnittstelle, die RSAPrivateKey erstreckt sich wieder. Diese Klasse enthält Zugriff auf die Parameter, die erforderlich sind, um schnellere Berechnungen durchzuführen, die das chinesische Resttheorem (CRT) verwenden. Im Allgemeinen müssten Sie diese Parameter auch nicht aufrufen.

Verwandte Themen