Esiste un modo per generare PrivateKey dall'array di byte? Ho ottenuto questo array di byte usando il metodo getEncoded(), ma ora devo riconvertirlo in PrivateKey.Crea PrivateKey dall'array di byte
Grazie, Vuk
Esiste un modo per generare PrivateKey dall'array di byte? Ho ottenuto questo array di byte usando il metodo getEncoded(), ma ora devo riconvertirlo in PrivateKey.Crea PrivateKey dall'array di byte
Grazie, Vuk
Come indicato sul Java docs
chiavi vengono generalmente ottenuti mediante generatori di codici, certificati o varie classi di identità utilizzata per gestire le chiavi. Le chiavi possono anche essere ricavate da specifiche chiave (rappresentazioni trasparenti del materiale chiave sottostante) attraverso l'uso di una fabbrica di chiavi.
La classe KeyFactory può aiutarti in questo.
Ho dimenticato di dire che sto lavorando con javacard, che non supporta Classe KeyFactory. Supporta keyBuilder, ma non riesco a capire come usare questa classe per le mie necessità. – Vuk
Gettare via la matrice di byte codificata. Su JavaCard non esiste AFAIR per decodificarlo direttamente: è necessario impostare separatamente i diversi componenti chiave.
Ad esempio, un RSAPrivateKey deve essere inizializzato con l'esponente e il modulo:
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: Per domande Javacard vi consiglio il JavaCard Forum nei forum di Oracle. Se cerchi lì per RSAPrivateKey troverai alcuni post interessanti.
qual è il punto di getEncoded allora? Potrebbero anche aver lanciato una UnsupportedOperationException. – Jus12
getEncoded() è disponibile solo su J2SE. Restituisce una chiave privata nella forma codificata PKCS # 8 che può essere utilizzata quasi ovunque. La piattaforma JavaCard è una di quelle eccezioni. – Robert
@ Robert vedo. Grazie per il chiarimento. – Jus12
Stavo cercando anche questa risposta e finalmente l'ho trovata. keyBytes è una matrice di byte creata originariamente con getEncoded().
//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);
non ho mai fatto niente per JavaCard ma da questo post, sembra che si può utilizzare la classe KeyFactory. Probabilmente dovrai scaricare la libreria BouncyCastle.
grazie. Ottimo lavoro! Mi hai risparmiato ore di ricerche. Questo dovrebbe essere selezionato come risposta corretta, a meno che la piattaforma dell'OP non supporti il castello gonfiabile. – Jus12
Non ho capito cosa intendevi per "se vuoi". È opzionale? – Jus12
@ Jus12 Volevo dire se vuoi usare BouncyCastle e non è già incluso come fornitore sulla piattaforma che stai utilizzando. Ad esempio, su Android ho aggiunto la libreria BouncyCastle e ho dovuto usare quella linea per aggiungere BC come fornitore e utilizzare le implementazioni degli algoritmi di BC. Felice di poter aiutare qualcuno! :) – marchica
O si deve decodificare il blob codificato PKCS # 8 (analisi BER ASN.1) e impostare i componenti oppure è possibile ottenere i componenti dalla chiave privata (almeno l'esponente privato e il modulo) come Java BigIntegers convertirli in array di byte senza segno e impostarli nell'API della Java Card come spiegato da Robert. L'analisi di PKCS # 8 può essere eseguita su Java Card, ma è un esercizio piuttosto orrendo.
dovrebbe questo aiuto? http://forums.oracle.com/forums/thread.jspa?threadID=1525932&tstart=105 –
No, questo non ha aiutato, ma grazie comunque – Vuk