Problema al transmitir una clave pública RSA, javaME, castillo hinchable

Estoy trabajando en la transferencia de una aplicación de mensajería de instancias de Java a JavaME, que también implementa criptografía. El problema es que quiero enviar mi clave pública al servidor. El cliente de escritorio tiene este código para este trabajo:

byte[] encoded_public_key=publick_key.getEncoded();

Y el servidor tiene este código para recuperar la clave:

EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(encoded_public_key);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey puKey = keyFactory.generatePublic(publicKeySpec);

Ahora he buscado la API para getEncoded y dice que devuelve la forma codificada DER de la clave como una matriz de bytes (http://www.docjar.com/docs/api/sun/s...tml #getEncoded)

Mi implementación para eso en JavaME fue esta:

RSAPublicKeyStructure public_key_JAVAME=new RSAPublicKeyStructure(modulus,exponent);
byte[] DER_encoded_public_key_JAVAME=public_key_JAVAME.getDEREncoded();

//the getEncoded functions returns exact the same byte array.

Sin embargo, cuando intento recuperar la clave codificada DER creada por JavaME con el código del servidor, en otras palabras, cuando intento esto:

EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(DER_encoded_public_key_JAVAME);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey puKey = keyFactory.generatePublic(publicKeySpec);

yo obtengo

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException: algid parse error, not a sequence
at sun.security.rsa.RSAKeyFactory.engineGeneratePublic(RSAKeyFactory.java:188)
at java.security.KeyFactory.generatePublic(KeyFactory.java:304)

Caused by: java.security.InvalidKeyException: IOException: algid parse error, not a sequence
at sun.security.x509.X509Key.decode(X509Key.java:380)
at sun.security.x509.X509Key.decode(X509Key.java:386)
at sun.security.rsa.RSAPublicKeyImpl.<init>(RSAPublicKeyImpl.java:66)
at sun.security.rsa.RSAKeyFactory.generatePublic(RSAKeyFactory.java:281)
at sun.security.rsa.RSAKeyFactory.engineGeneratePublic(RSAKeyFactory.java:184)

Punto interesante: La clave codificada DER del Java normal (usando la función getencoded ()) es una matriz de bytes de 162 bytes de largo, mientras que la misma clave DER codificada en JavaME usando el castillo hinchable tiene 140 bytes de largo. ¿No deberían estas claves codificadas 2 DER tener la misma longitud? Quiero decir que es la misma clave en formato codificado DER, por lo que deberían ser las mismas.

¿Qué estoy haciendo mal?

Es cierto que no me di cuenta de eso. El problema es ¿sabes cómo crear un objeto subjectPublickeyInfo desde una PublicKey en bouncyCastle? He intentado:

ByteArrayInputStream bIn = new ByteArrayInputStream(RSApublickey.toString().getbytes()); SubjectPublicKeyInfo info = new SubjectPublicKeyInfo((ASN1Sequence)new ASN1InputStream(bIn).readObject());

Pero no funcionó. También probé:

ByteArrayInputStream(RSApublicKeyStructure.getEncoded()); SubjectPublicKeyInfo info = new SubjectPublicKeyInfo((ASN1Sequence)new ASN1InputStream(bIn).readObject());

En realidad esperaba que no funcionara, pero bueno, tuve que intentarlo. Entonces, ¿cómo puedo crear un Subjectpublickeyinfo a partir de los parámetros RSAkey? (Supongo que este es uno de los puntos donde la oscuridad de la API del castillo hinchable realmente brilla)

Nuevamente, gracias por su respuesta, ha sido de gran ayuda. Me ha puesto en el camino correcto.

Respuestas a la pregunta(1)

Su respuesta a la pregunta