¿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
¿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
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.
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
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.
¿Cuál es el punto de getEncoded entonces? También podrían haber lanzado una UnsupportedOperationException. – Jus12
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
@ Robert veo. Gracias por la aclaración. – Jus12
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.
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
No entendí lo que quería decir con "si quiere". ¿Es opcional? – Jus12
@ 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
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.
¿Esto le sirve de ayuda? http://forums.oracle.com/forums/thread.jspa?threadID=1525932&tstart=105 –
No, esto no ayudó, pero gracias de todos modos – Vuk