Versión Objective-C de PHP mcrypt_encrypt

Al buscar por todos lados, puedo encontrar una serie de enlaces que hacen referencia a problemas similares, pero nada funciona, me está volviendo loco …

¿Puede alguien darme una guía paso a paso sobre cómo escribir el siguiente código PHP en Objective C.

Estamos creando algunas llamadas a servicios web, que requieren contenido encriptado, y solo se nos ha proporcionado una muestra de cifrado PHP. Para que quede claro que no queremos des-encriptar, queremos duplicar este proceso de encriptación en IOS.

Muchas gracias

function encrypt($plainText) { $initVector = "mysite.com"; $key = base64_decode("GfSDfXS14U8I3YglEFrMjMOOnESUMxN3wRTt1TeDosY="); $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); $padding = $block - (strlen($plainText) % $block); $plainText .= str_repeat(chr($padding), $padding); $crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $plainText, MCRYPT_MODE_CBC, $initVector); $crypttext64 = base64_encode($crypttext); return $crypttext64; } 

Eso estuvo muy cerca de ser un cifrado de modo CBC correctamente ejecutado utilizando AES en PHP 🙂 Es realmente una pena el IV estático, demasiado corto y el hecho de que la encoding de caracteres no se haya especificado (en caso de que plainText sea ​​una cadena de caracteres en su lugar) de bytes).

De lo contrario, esto se parece mucho a AES-256 usando el modo CBC y el relleno PKCS # 7, por lo que puede tomar cualquier ejemplo en Objective-C para ejecutar precisamente eso. También necesitaría un decodificador de base 64, por supuesto.

Sin embargo, debe generar un IV aleatorio y prefijarlo al texto cifrado (seguro aleatorio, que es complicado en PHP). El IV debe tener el mismo tamaño que el tamaño de bloque del cifrado subyacente, en el caso de AES que sería de 16 bytes. Entonces la función de descifrado debería eliminar esos bytes del texto cifrado y usarlos como IV.

En cuanto a la protección de la integridad (Código de autenticación de mensajes o MAC) también sería una muy buena idea.

fue respondida aquí en los foros de apple dev.

https://devforums.apple.com/message/791166#791166

PHP usa wacky crypto IMO, aunque el código parece estar haciendo lo mejor para evitar la locura (por ejemplo, AFAICT el código de relleno implementa PKCS # 7 relleno). Es probable que el problema que está viendo se relacione con cómo PHP traduce la cadena “mysite.com” en un AES-128 IV válido (cuya longitud debe necesariamente coincidir con el tamaño del bloque, es decir, 16 bytes). Es muy posible que las almohadillas de PHP con ceros (que parece ser la forma de PHP), pero tendrá que investigar eso en el lado de PHP de las cosas.

Más allá de eso, parece una aplicación bastante común de Common Crypto. Necesitas:

o pase en la bandera de kCCOptionPKCS7Padding

o no pase en el indicador kCCOptionECBMode (para obtener CBC)

o use kCCAlgorithmAES128, kCCKeySizeAES128 y kCCBlockSizeAES128

o haz tu propio Base64 [1]

Con respecto al último punto, te recomiendo que hagas esto último. Modifique el código PHP para imprimir $ key, $ plainText y $ crypttext como un volcado hexadecimal y luego trabaje con eso en el lado de iOS. Una vez que esté funcionando, agrega el Base64. Eso divide el problema a la mitad, lo que significa que los problemas de Base64 no se combinarán con los problemas de cifrado.

Finalmente, tenga en cuenta que OS X tiene un decodificador y codificador Base64 práctico en la línea de comandos. Por ejemplo, para obtener un volcado hexadecimal de la clave de cifrado en su muestra, puede hacer esto:

$ openssl enc -d -base64 | hexdump -C GfSDfXS14U8I3YglEFrMjMOOnESUMxN3wRTt1TeDOSY = ^ D 00000000 19 f4 83 7d 74 b5 e1 4f 08 dd 88 25 10 5a cc 8c | …} t..O …%. Z .. | 00000010 c3 8e 9c 44 94 33 13 77 c1 14 ed d5 37 83 a2 c6 | … D.3.w …. 7 … | 00000020

Comparte y Disfruta

Gracias a eskimo1