encriptar desencriptar descifrar cifrar cifrado archivos java encryption blackberry aes

java - desencriptar - Cifrado AES con NoPadding en blackberry



encriptar y desencriptar md5 java (1)

No estoy seguro si esto es realmente una respuesta en general, pero podría ayudar en este caso específico, así que lo estoy agregando como tal.

Realmente no se puede usar AES sin algo de relleno, porque el procesamiento de AES no quiere asumir que los datos que usted suministre serán un múltiplo de 16 bytes. Sin embargo, si en realidad siempre proporciona un búfer que es un múltiplo de 16 bytes, entonces puede encriptar sus datos con un código como este:

AESEncryptorEngine engine = new AESEncryptorEngine( key ); for ( int j = 0; j < ciphertext.length - 15; ) { engine.encrypt(plainText, j, ciphertext, j); j = j+16; }

Entonces, ¿cómo te aseguras de que esto funcione bien en el otro extremo? Puede o no ser posible hacer esto, en realidad depende de lo que se transfiere.

Pero si, por ejemplo, está pasando datos XML, puede agregar espacios para hacer que los datos lleguen a un límite de 16 bytes y el Servidor los descifrará como espacios, y el análisis los ignorará. Puede agregar bytes de relleno redundantes a una variedad de formatos de archivo y se ignorará el relleno, todo depende del formato de archivo que se esté procesando.

Actualizar

Dado que los datos reales son JSON y que creo que JSON ignorará los espacios finales, el enfoque que tomaría es agregar espacios a los datos JSON antes de cifrarlos.

Así que convierta la cadena JSON en bytes:

byte [] jsonBytes = jsonString.getBytes("UTF-8");

almohadilla esto si lo necesita también:

if ( (jsonBytes.length % 16) != 0 ) { // Now pad this with spaces }

y puede cifrar el resultado sin preocuparse por los bytes de relleno.

Soy nuevo en el desarrollo de blackberry y llegué a completar una tarea de cifrado y descifrado con AES / ECB / NoPadding. Utilicé el código siguiente, de internet.

Método de encriptación:

public static byte[] encrypt( byte[] keyData,String message ) throws Exception { byte[] data = message.getBytes("UTF-8"); // Create the AES key to use for encrypting the data. // This will create an AES key using as much of the keyData // as possible. if ((data.length % 16) != 0 ) { StringBuffer buffer = new StringBuffer(message); int moduleOut = data.length % 16; int padding = 16 - moduleOut; for(int i = 0 ; i < padding; i++){ buffer.append(" "); } data = buffer.toString().getBytes("UTF-8"); } AESKey key = new AESKey( keyData); NoCopyByteArrayOutputStream out = new NoCopyByteArrayOutputStream(data.length); AESEncryptorEngine engine = new AESEncryptorEngine(key); BlockEncryptor encryptor = new BlockEncryptor(engine, out); encryptor.write(data,0,data.length); int finalLength = out.size(); byte[] cbytes = new byte[finalLength]; System.arraycopy(out.toByteArray(), 0, cbytes, 0, finalLength); // encryptor.close(); // out.close(); return cbytes; }

Método de descifrado

public static byte[] decrypt(byte[] keyData, byte[] base64EncodedData) throws CryptoException, IOException { // String base64EncodedData=new String(base64EncodedData); byte[] cipherText =Base64ToBytes(new String(base64EncodedData)); // First, create the AESKey again. AESKey key = new AESKey(keyData); // Now, create the decryptor engine. AESDecryptorEngine engine = new AESDecryptorEngine(key); // Create the BlockDecryptor to hide the decryption details away. ByteArrayInputStream input = new ByteArrayInputStream(cipherText); BlockDecryptor decryptor = new BlockDecryptor(engine, input); // Now, read in the data. byte[] temp = new byte[100]; DataBuffer buffer = new DataBuffer(); for (;;) { int bytesRead = decryptor.read(temp); buffer.write(temp, 0, bytesRead); if (bytesRead < 100) { // We ran out of data. break; } } byte[] plaintext = buffer.getArray(); return plaintext; }

Método de conversión de Base64 a Bytes:

private static byte[] Base64ToBytes(String code) { byte[] aesString = null; try { aesString = Base64InputStream.decode(code); } catch (IOException ioe) { } return aesString; }

Ahora el problema es que cuando encripto mi cadena con el método anterior obtengo unicodes acolchados al final de la cadena, que no es tolerable en el lado del servidor.

Sé que es debido a PKCS5FormatterEngine y es normal que los caracteres se anexen al final de la cadena mientras se usa esta clase.

Pero, ¿qué ocurre si quiero encriptar y desencriptar cadenas con el método AES / ECB y eso también con NoPadding? Sé que ECB no es un modo seguro y todo eso, pero el servidor está con PHP y listo, funciona muy bien en Android y J2ME.

Por favor guía. Cómo pasar por alto PKCS5FormatterEngine o encriptar sin ningún relleno.

Actualizar:

Traté de usar la clase Cipher en Blackberry como la utilicé en Android y J2ME, pero parece que no está disponible en net_rim_api.jar, incluso intenté descargar el archivo .cart castillo hinchable y la clase dependiente NoSuchAlogrithmException para java.security jar (org.osgi.foundation-1.0. 0.jar), se compila, pero cuando intento ejecutarlo, deja de decir que se encontraron clases duplicadas. Tiene un problema con algunas clases duplicadas en jar que he guardado para java.security.

Si tiene una solución para esto, hágamelo saber.

Actualización para la respuesta: Tengo la actualización de mi código con el código de cifrado y descifrado completo y también compruebo la respuesta para una mejor comprensión.