2011-01-05 9 views
7

¿Hay alguna manera de generar PrivateKey desde la matriz de bytes? Obtuve esta matriz de bytes usando el método getEncoded(), pero ahora debo convertirla a PrivateKey.Crear PrivateKey desde la matriz de bytes

Gracias, Vuk

+0

¿Esto le sirve de ayuda? http://forums.oracle.com/forums/thread.jspa?threadID=1525932&tstart=105 –

+0

No, esto no ayudó, pero gracias de todos modos – Vuk

Respuesta

5

como se indica en las Java docs

Las claves se obtienen generalmente a través de generadores de claves, certificados, o varias clases de identidad utilizados para gestionar las claves. Las claves también se pueden obtener a partir de las especificaciones clave (representaciones transparentes del material clave subyacente) mediante el uso de una fábrica de claves.

La clase KeyFactory puede ayudarlo con esto.

+0

Olvidé decir que estoy trabajando con javacard, que no es compatible Clase KeyFactory. Admite keyBuilder, pero realmente no puedo entender cómo usar esta clase para mi necesidad. – Vuk

3

Deseche la matriz de bytes codificada. En JavaCard AFAIR no tiene forma de decodificarlo directamente; debe configurar los diferentes componentes clave por separado.

Por ejemplo, un RSAPrivateKey necesita ser inicializado con el exponente y el módulo:

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); 

Por cierto: Para preguntas javacard recomiendo el JavaCard Forum en los foros de Oracle. Si busca allí RSAPrivateKey, encontrará algunas publicaciones interesantes.

+0

¿Cuál es el punto de getEncoded entonces? También podrían haber lanzado una UnsupportedOperationException. – Jus12

+0

getEncoded() solo está disponible en J2SE. Devuelve una clave privada en formato codificado PKCS # 8 que se puede usar en casi todas partes. La plataforma JavaCard es una de esas excepciones. – Robert

+0

@ Robert veo. Gracias por la aclaración. – Jus12

7

Estaba buscando esta respuesta también y finalmente la encontré. keyBytes es una matriz de bytes creada originalmente 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); 

que nunca he hecho nada por JavaCard pero desde este post, parece que se puede utilizar la clase KeyFactory. Probablemente necesites descargar la biblioteca de BouncyCastle.

+1

gracias. ¡Buen trabajo! Me salvaste horas de investigación. Esto debe seleccionarse como la respuesta correcta, a menos que la plataforma del OP no admita el castillo hinchable. – Jus12

+0

No entendí lo que quería decir con "si quiere". ¿Es opcional? – Jus12

+0

@ Jus12 Quise decir si quieres usar BouncyCastle y no está incluido como proveedor en la plataforma que estás usando. Por ejemplo, en Android agregué la biblioteca BouncyCastle y tuve que usar esa línea para agregar BC como proveedor y usar las implementaciones de BC de los algoritmos. Me alegro de poder ayudar a alguien! :) – marchica

0

O bien usted debe decodificar el blob codificado PKCS # 8 usted mismo (análisis ASN.1 BER) y establecer los componentes, o puede obtener los componentes de la clave privada (al menos el exponente privado y el módulo) como BigIntegers Java , conviértelos a matrices de bytes sin signo y configúrelos en la Java Card API como explica Robert. El análisis PKCS # 8 se puede hacer en Java Card, pero es un ejercicio bastante horrendo.