Problema ao transmitir uma chave pública RSA, javaME, castelo insuflável

Estou trabalhando na portabilidade de um aplicativo de mensagens de instância do Java para o JavaME, que também implementa criptografia. O problema é que eu quero enviar minha chave pública para o servidor. O cliente da área de trabalho possui este código para este trabalho:

byte[] encoded_public_key=publick_key.getEncoded();

E o servidor possui este código para recuperar a chave:

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

Agora procurei na API o getEncoded e ele diz que retorna a forma codificada em DER da chave como uma matriz de bytes (http://www.docjar.com/docs/api/sun/s...tml #getEncoded)

Minha implementação para isso no JavaME foi 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.

No entanto, quando tento recuperar a chave codificada DER criada pelo JavaME com o código do servidor, em outras palavras, quando tento isso:

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

eu recebo

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)

Ponto interessante: A chave codificada por DER do Java normal (usando a função getencoded ()) é uma matriz de bytes com 162 bytes de comprimento, enquanto a mesma chave DER codificada em JavaME usando castelo insuflável tem 140 bytes. Essas chaves codificadas em 2 DER não deveriam ter o mesmo comprimento? Quero dizer, é a mesma chave no formato codificado em DER, portanto elas devem ser as mesmas.

O que estou fazendo errado?

É verdade que eu não percebi isso. O problema é que você sabe como criar um objeto subjectPublickeyInfo a partir de uma PublicKey em bouncyCastle? Eu tentei:

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

Mas não deu certo. Eu também tentei:

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

Na verdade, eu esperava que isso não funcionasse, mas eu tive que tentar. Então, como posso criar uma Subjectpublickeyinfo a partir dos parâmetros RSAkey? (Este é um dos pontos em que a obscuridade da API do castelo de bouncy realmente brilha, eu acho)

Mais uma vez obrigado por sua resposta, você tem sido de grande ajuda. Você me colocou no caminho certo.

questionAnswers(1)

yourAnswerToTheQuestion