2011-01-05 22 views
7

Gibt es eine Möglichkeit, PrivateKey aus Byte-Array zu generieren? Ich habe dieses Byte-Array mit getEncoded() -Methode, aber jetzt muss ich es zurück zu PrivateKey konvertieren.PrivateKey aus Byte-Array erstellen

Danke, Vuk

+0

sollte dies helfen? http://forums.oracle.com/forums/thread.jspa?threadID=1525932&tstart=105 –

+0

Nein, das hat nicht geholfen, aber trotzdem danke – Vuk

Antwort

5

Wie auf den

Keys Java docs angegeben werden durch Schlüsselgeneratoren, Zertifikate oder verschiedene Identitätsklassen verwalten Schlüssel im Allgemeinen erhalten. Schlüssel können auch aus Schlüsselspezifikationen (transparente Darstellungen des zugrundeliegenden Schlüsselmaterials) durch Verwendung einer Schlüsselfabrik erhalten werden.

Die KeyFactory Klasse kann Ihnen dabei helfen.

+0

Ich habe vergessen zu sagen, dass ich mit javacard arbeite, die nicht unterstützt KeyFactory-Klasse. Es unterstützt keyBuilder, aber ich kann nicht wirklich herausfinden, wie man diese Klasse für meine Bedürfnisse benutzt. – Vuk

3

Werfen Sie das codierte Byte-Array weg. Auf JavaCard gibt es AFAIR keine Möglichkeit, es direkt zu dekodieren - Sie müssen die verschiedenen Schlüsselkomponenten separat einstellen.

Zum Beispiel muss ein RSAPrivateKey mit dem Exponenten und dem Modul initialisiert werden:

rsaPrivate = (RSAPrivateKey) javacard.security.KeyBuilder.buildKey 
    (javacard.security.KeyBuilder.TYPE_RSA_PRIVATE, 
    javacard.security.KeyBuilder.LENGTH_RSA_512, false); 

byte[] exponent = {(byte) 7}; 
byte[] modulus = {(byte) 33}; 
rsaPrivate.setExponent(exponent, (short) 0, (short) exponent.length); 
rsaPrivate.setModulus(modulus, (short) 0, (short) modulus.length); 

BTW: Für Javacard Fragen, die ich die JavaCard Forum in den Oracle-Foren empfehlen. Wenn Sie dort nach RSAPrivateKey suchen, finden Sie einige interessante Beiträge.

+0

Was ist dann der Sinn von getEncoded? Möglicherweise haben sie auch eine UnsupportedOperationException ausgelöst. – Jus12

+0

getEncoded() ist nur auf J2SE verfügbar. Es gibt einen privaten Schlüssel in PKCS # 8-codierter Form zurück, der fast überall verwendet werden kann. Die JavaCard-Plattform ist eine dieser Ausnahmen. – Robert

+0

@ Robert Ich verstehe. Danke für die Klarstellung. – Jus12

7

Ich war auch auf der Suche nach dieser Antwort und fand sie schließlich. keyBytes ist ein Byte-Array, das ursprünglich mit getEncoded() erstellt wurde.

//add BouncyCastle as a provider if you want 
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); 
//create a keyfactory - use whichever algorithm and provider 
KeyFactory kf = KeyFactory.getInstance("DSA", "BC"); 
//for private keys use PKCS8EncodedKeySpec; for public keys use X509EncodedKeySpec 
PKCS8EncodedKeySpec ks = new PKCS8EncodedKeySpec(keyBytes); 
PrivateKey pk = kf.generatePrivate(ks); 

Ich habe nie etwas für Javacard getan, aber von diesem post, es sieht aus wie Sie die KeyFactory Klasse verwenden können. Sie müssen wahrscheinlich die BouncyCastle-Bibliothek herunterladen.

+1

danke. Gute Arbeit! Du hast mir Stunden der Forschung gespart. Dies sollte als korrekte Antwort ausgewählt werden, es sei denn, die OP-Plattform unterstützt keine Hüpfburg. – Jus12

+0

Ich habe nicht verstanden, was du mit "wenn du willst" meinst. Ist es optional? – Jus12

+0

@ Jus12 Ich meinte, wenn Sie BouncyCastle verwenden möchten und es ist nicht bereits als Anbieter auf der Plattform enthalten, die Sie verwenden. Unter Android beispielsweise habe ich die BouncyCastle-Bibliothek hinzugefügt und musste diese Zeile verwenden, um BC als Anbieter hinzuzufügen und die Implementierungen der Algorithmen von BC zu verwenden. Froh, dass ich jemandem helfen könnte! :) – marchica

0

Entweder müssen Sie das PKCS # 8 codierte Blob selbst dekodieren (ASN.1 BER Parsing) und die Komponenten setzen, oder Sie können die Komponenten aus dem privaten Schlüssel (mindestens den privaten Exponenten und Modulus) als Java BigIntegers erhalten wandeln Sie diese in nicht signierte Byte-Arrays um und legen Sie sie wie von Robert erläutert in der Java Card API fest. PKCS # 8 Parsing kann auf der Java Card durchgeführt werden, aber es ist eine ziemlich horrende Übung.