Encriptación AES 128 de Android

Estoy tratando de implementar el cifrado AES128 en un Android. Tengo una solución trabajando en un iPhone con Objective C pero teniendo problemas para portarla a Android. He buscado stackoverflow para una solución, pero parece que estoy haciendo algo mal. Soy bastante nuevo en Java, así que creo que me falta algo que ver con los datos, la conversión de cadenas.

Aquí está mi iPhone cifrar:

char keyPtr[kCCKeySizeAES128+1]; [keyString getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSASCIIStringEncoding]; // CString for the plain text char plainBytes[[plainString length]+1]; [plainString getCString:plainBytes maxLength:sizeof(plainBytes) encoding:NSASCIIStringEncoding]; size_t bytesEncrypted = 0; // Allocate the space for encrypted data NSUInteger dataLength = [plainString length]; size_t bufferSize = dataLength + kCCBlockSizeAES128; void* buffer = malloc(bufferSize); // Encrypt CCCryptorStatus ret = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding | kCCOptionECBMode, keyPtr, kCCKeySizeAES128, NULL, plainBytes, sizeof(plainBytes), buffer, bufferSize, &bytesEncrypted); if (ret != kCCSuccess) { free(buffer); } encryptedData = [NSData dataWithBytes:buffer length:bytesEncrypted]; 

Aquí está mi Java:

  SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding"); cipher.init(Cipher.ENCRYPT_MODE, skeySpec); byte[] encrypted = cipher.doFinal(plainText.getBytes("UTF-8")); 

El uso de la misma clave y el texto sin formato en iPhone y Java dan resultados diferentes. Mi resultado de iPhone funciona de la manera que lo necesito así que estoy tratando de obtener java para darme el resultado del iPhone. Estoy perdiendo algo en el Java con seguridad, pero no estoy seguro de lo que es.

editar

Basado en las sugerencias abajo he modificado mi Java a esto

  byte[] keyBytes = plainTextKey.getBytes("US-ASCII"); SecretKeySpec skeySpec = new SecretKeySpec(keyBytes, "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding"); cipher.init(Cipher.ENCRYPT_MODE, skeySpec); byte[] encrypted = cipher.doFinal(plainText.getBytes("US-ASCII")); 

Pero todavía estoy obteniendo resultados diferentes entre Android y iPhone

2 Solutions collect form web for “Encriptación AES 128 de Android”

Además de las dificultades de codificación con su texto plano (como vcsjones señalado en los comentarios), asegúrese de que la codificación es la misma para la cadena clave (tenga en cuenta que el uso de una cadena en bruto, como una contraseña, directamente como una clave criptográfica es una mala noticia Osos, utilice una función de derivación clave como PBKDF2 en la contraseña para obtener una clave).

Además, la cadena de codificación para Java para ASCII es US-ASCII , no sólo ASCII , así que asegúrese de usar eso en sus llamadas getBytes .

EDIT : encontró su problema: la cadena iOS se está cifrando con un charcter nulo extra (0x00) al final, mientras que el java no lo era. Así que encriptar "hola mundo \ 0" en java te dará la misma salida que "hello world" hace en iOS

La mayoría de los ejemplos en Internet son la implementación débil de AES. Para que una implementación sea fuerte, debe utilizarse IV aleatoria todo el tiempo y la clave debe ser hash.

Para más seguro (azar IV + hashed clave) plataforma cruzada (android, ios, c #) la aplicación de AES ver mi respuesta aquí – https://stackoverflow.com/a/24561148/2480840

  • Secretos de OAuth en aplicaciones para móviles
  • Deshabilitar el desplazamiento en todos los dispositivos móviles
  • Reproducir video en el Android grabado desde el iPhone
  • Memoria mínima para descompresión RAR
  • Diferencia entre la aplicación de Android and phonegap nativa
  • ¿Es posible evitar los reproductores de video nativos en dispositivos móviles?
  • Cómo crear API de sitio web
  • La manera más eficiente de dibujar objetos idénticos múltiples?
  • GlDrawElements vs glDrawArray eficiencia
  • Robusta transferencia de archivos desde dispositivos móviles al servidor
  • Convertir ShaderToy a Shader de fragmentos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.