Ayuda para descencriptar un texto en J2ME

Buenas Tardes a todos:

El problema es el siguiente:

Necesito encriptar datos entre dos celulares que utilizan bluetooth.

Para encriptar no existe ningun problema me genera un byte con
el mensaje ecriptado, al enviar el texto al segundo celular ocurre
que me sale el siguiente error:

p: last block incomplete in decryption
at n.a(+172)
at e.a(+67)
at chat.r.a(+29)
at chat.k.a(+50)
at chat.p.run(+77)

Estoy utlilizando AES, pienso que el problema podría estar en que no
estoy enviando los datos encriptados de manera correcta porque al encriptar
en el mismo extremo es decir donde realizo la encriptación si puedo descencriptar
el mismo.

InputStream is = new ByteArrayInputStream(getString().getBytes("UTF-8"));
System.out.println("InputStream"+is);
byte[] os = aes.crypt(true, getString().getBytes(), "ClaveSecreta1234".getBytes());

System.out.println("OutputStream"+os);

byte[] os1 = aes.crypt(false, os, "ClaveSecreta1234".getBytes());
System.out.println("Decodoficado"+os1);
String splano = new String (os1, "ISO-8859-1");
System.out.println("Decodoficado"+splano);

Utilizo la siguiente clase para encriptar y decencriptar

import org.bouncycastle.crypto.BufferedBlockCipher;
import org.bouncycastle.crypto.engines.AESFastEngine;
import org.bouncycastle.crypto.modes.CBCBlockCipher;
import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher;
import org.bouncycastle.crypto.params.KeyParameter;
public class AES_BC {

public byte[] crypt(final boolean model,final byte[] in , final byte[] key){
byte[] encryptedContent = null;

try {

final BufferedBlockCipher engine = new PaddedBufferedBlockCipher(new CBCBlockCipher(new AESFastEngine()));
engine.init(model, new KeyParameter(key));
final byte[] enc = new byte[engine.getOutputSize(in.length)];
final int size1 = engine.processBytes(in, 0, in.length, enc, 0);
final int size2 = engine.doFinal(enc, size1);
encryptedContent =new byte[size1+size2];
System.arraycopy(enc, 0, encryptedContent, 0, encryptedContent.length);
return encryptedContent;

} catch (final Exception ex) {
ex.printStackTrace();
}
return encryptedContent;

}

}

Como puedo pasar de forma correcta el texto cifrado?.

Espero por favor sus comentarios.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de iberck

Encripción en J2ME

Tienes varias alternativas para resolver tu problema, lo más importante es que entiendas qué hace tu código.

Resumiendo:
Existe una forma de encripción de datos llamada encripción simétrica en la cual ambas partes deben ponerse de acuerdo en la llave con la cual van a encriptar/desencriptar datos.

Dentro de la encripción simétrica existen varios modos de encriptar, el que tú estás utilizando en tu ejemplo es el modo por bloques. Cuando utilizas encripción simétrica por bloques (en tu caso el modo CBC a través de la clase CBCBlockCipher) quiere decir que el motor encripta/desencripta la información en bloques de tamaño definido (lo cual hace el proceso más rápido que una encripción en modo mixto el cual es muy utilizado para hardware porque lo hace bit a bit)

Pongamos un ejemplo, necesitas encriptar 15 bytes y tus bloques son de 32 bytes (porque eso mide la llave para encriptar/desencriptar datos), el motor de encripción necesita 17 bytes extra para rellenar (padding) dicho bloque (de acuerdo a tu configuración puede rellenar con datos vacíos y creo también con predefinidos, por default lo hace con datos vacíos)

El error que te está lanzando es porque el 2do extremo está desencriptando de manera incorrecta y no encuentra ese último pedazo del bloque con datos vacíos (esos 17 bytes de relleno)

Edita tu post e Identa tu código, dale color para que pueda ayudarte, así como lo pusiste está críptico de leer...

Un par de consejos:

- Si tu dispositivo móvil tiene capacidades limitadas te recomiendo que mejor utilices la clase AESLightEngine en lugar de AESFastEngine
- A simple vista no veo que utilices un vector de iniciación, utiliza uno para que los mismos mensajes no sean encriptados de manera idéntica (un vector de iniciación distinto por cada sesión eh)
- Si estás pasando eso a un celular pequeñito, lo más seguro es que te reviente por el tamaño final del jar. Vas a tener que ofuscar, Netbeans te lo hace de manera automática con proguard