he estado rompiendo mi pelo todo el día tratando de resolver este ...diferencia entre el iPhone AES (Objetivo-c) y Java
que tienen un cliente de Objective-C se ejecuta en el iPhone, que conecta a una aplicación Java servidor. El iPhone está encriptando datos usando AES, pero no puedo descifrarlo en el servidor. Estoy usando una contraseña y un mensaje conocidos (cadena única) y estoy generando la matriz de bytes en el iPhone, generando una matriz de bytes de comparación en el servidor Java usando la misma clave y el mismo mensaje pero las matrices de bytes son completamente diferentes (y por lo tanto no ser decodificado en el lado de Java).
el cliente está utilizando la biblioteca CommonCrypto con los siguientes valores ...
de datos es un NSData
sosteniendo el "mensaje" palabra utilizando dataUsingEncoding:NSASCIIStringEncoding
Key es una NSData
la celebración de la frase "1234567891123456" de nuevo utilizando la codificación como encima. algoritmo es kCCAlgorithmAES128
Options es kCCOptionsPKCS7Padding
(que creo que equivale a BCE en el servidor ?!)
el servidor está usando el siguiente código ...
byte[] key = "1234567891123456".getBytes();
Cipher c = Cipher.getInstance("AES/ECB/PKCS5Padding");
SecretKeySpec k = new SecretKeySpec(key, "AES");
c.init(Cipher.ENCRYPT_MODE, k);
byte[] encryptedData = c.doFinal("message".getBytes());
pero los datos en encryptedData no coincide lo que se está generando en el código objetivo-c, las matrices de bytes son completamente diferentes.
¿Alguien puede ver algo obvio que estoy haciendo mal? Yo creo los ajustes son todos iguales ... :(
- ACTUALIZACIÓN - Conforme a lo solicitado ....
autorización así que aquí va ....
cliente de iPhone es cifrar el siguiente "mensaje" cadena utiliza la tecla "1234567891123456" se utiliza un vector de inicialización de "1010101010101010" está utilizando AES128, con el modo CBC (por lo que puedo decir) y las opciones de kCCOptionsPKCS7Padding.
El resultado de la encriptación (con codificación base64) es UHIYllDFAXl81ZM7OZPAuA ==
El servidor está cifrar la misma cadena, con el mismo vector de llave y la inicialización. Está utilizando el siguiente Cipher.getInstance ("AES/CBC/PKCS5Padding");
El resultado de la encriptación (con codificación base64) es ALBnFIHysLbvAxjvtNo9vQ ==
Gracias.
- ACTUALIZACIÓN 2 - Conforme a lo solicitado ...
Aquí está el código iPhone ....
NSData *toencrypt = [@"message" dataUsingEncoding:NSASCIIStringEncoding];
NSData *pass = [@"1234567891123456" dataUsingEncoding:NSASCIIStringEncoding];
NSData *iv = [@"1010101010101010" dataUsingEncoding:NSASCIIStringEncoding];
CCCryptorStatus status = kCCSuccess;
NSData *encrypted = [toencrypt dataEncryptedUsingAlgorithm:kCCAlgorithmAES128 key:pass initializationVector:iv options:kCCOptionPKCS7Padding error:&status];
NSString *text = [NSString base64StringFromData:encrypted length:[encrypted length]];
La categoría NSData para cifrar viene de aquí ...
http://github.com/AlanQuatermain/aqtoolkit/tree/master/CommonCrypto/
Por cierto, he comprobado las matrices de bytes que se encuentran en toencrypt, pasar y IV y que coinciden con los que están en el servidor.
He cambiado el servidor para usar ECB como se sugiere y todavía no funciona. Por cierto, sí noté que el servidor usa PKCS5 y el cliente usa PKCS7, pero no hay 5 disponibles en el cliente y no hay 7 disponibles en el servidor, y aparentemente son compatibles de todos modos. –
Sí, el relleno de PKCS7 es igual que PKCS5Padding. Si cambiar al ECB no funcionó, es probable que el iPhone esté usando el modo CBC. Debe determinar el vector de inicialización y asegurarse de que el servidor esté utilizando el mismo. – erickson
Gracias por las respuestas. Creé un IV igual en el cliente y en el servidor pero aún no funcionaba. ¡Aquí es donde una biblioteca de AES decente y decente para el iPhone está muy ausente! :( –