¿Alguien puede señalarme en la dirección correcta para poder cifrar una cadena, devolviendo otra cadena con los datos cifrados? (He estado intentando con el cifrado AES256). Quiero escribir un método que tome dos instancias de NSString, uno es el mensaje para cifrar y el otro es un 'código de acceso' para cifrarlo; sospecho que tendría que generar la clave de cifrado con el código de acceso, de manera que se pueda revertir si el código de acceso se suministra con los datos cifrados. El método debería devolver un NSString creado a partir de los datos cifrados.
He probado la técnica detallada en el primer comentario en esta publicación , pero hasta ahora no he tenido suerte. CryptoExercise de Apple ciertamente tiene algo, pero no puedo entenderlo ... He visto muchas referencias a CCCrypt , pero ha fallado en todos los casos en que lo he usado.
También tendría que poder descifrar una cadena encriptada, pero espero que sea tan simple como kCCEncrypt / kCCDecrypt.
Respuestas:
Como no ha publicado ningún código, es difícil saber exactamente qué problemas está encontrando. Sin embargo, la publicación de blog a la que enlaza parece funcionar bastante bien ... aparte de la coma adicional en cada llamada a la
CCCrypt()
que causó errores de compilación.Un comentario posterior en esa publicación incluye este código adaptado , que funciona para mí, y parece un poco más directo. Si incluye su código para la categoría NSData, puede escribir algo como esto: (Nota: Las
printf()
llamadas son solo para demostrar el estado de los datos en varios puntos; en una aplicación real, no tendría sentido imprimir tales valores .)Dado este código, y el hecho de que los datos cifrados no siempre se traducirán bien en un NSString, puede ser más conveniente escribir dos métodos que envuelvan la funcionalidad que necesita, hacia adelante y hacia atrás ...
Esto definitivamente funciona en Snow Leopard, y @Boz informa que CommonCrypto es parte del Core OS en el iPhone. Tanto 10.4 como 10.5 tienen
/usr/include/CommonCrypto
, aunque 10.5 tiene una página de manual paraCCCryptor.3cc
y 10.4 no, así que YMMV.EDITAR: consulte esta pregunta de seguimiento sobre el uso de la codificación Base64 para representar bytes de datos cifrados como una cadena (si lo desea) utilizando conversiones seguras y sin pérdidas.
fuente
autorelease
.He reunido una colección de categorías para NSData y NSString que utiliza soluciones que se encuentran en el blog de Jeff LaMarche y algunos consejos de Quinn Taylor aquí en Stack Overflow.
Utiliza categorías para extender NSData para proporcionar el cifrado AES256 y también ofrece una extensión de NSString a los datos cifrados con codificación BASE64 de forma segura en cadenas.
Aquí hay un ejemplo para mostrar el uso para cifrar cadenas:
Obtenga el código fuente completo aquí:
¡Gracias por todos los consejos útiles!
-- Miguel
fuente
@owlstead, con respecto a su solicitud de "una variante criptográficamente segura de una de las respuestas dadas", consulte RNCryptor . Fue diseñado para hacer exactamente lo que está solicitando (y fue creado en respuesta a los problemas con el código que se enumera aquí).
RNCryptor utiliza PBKDF2 con sal, proporciona un IV aleatorio y conecta HMAC (también generado a partir de PBKDF2 con su propia sal. Admite operaciones síncronas y asíncronas).
fuente
Esperé un poco en @QuinnTaylor para actualizar su respuesta, pero como no lo hizo, aquí está la respuesta un poco más clara y de una manera que se cargará en XCode7 (y tal vez mejor). Utilicé esto en una aplicación de Cocoa, pero es probable que también funcione bien con una aplicación de iOS. No tiene errores de ARC.
Pegue antes de cualquier sección @implementation en su archivo AppDelegate.m o AppDelegate.mm.
Pegue estas dos funciones en la clase @implementation que desee. En mi caso, elegí @implementation AppDelegate en mi archivo AppDelegate.mm o AppDelegate.m.
fuente
dataWithBytesNoCopy
simplemente asignar unNSMutableData
condataWithLength
y usar lamutableBytes
propiedad para el puntero de bytes y luego cambiar el tamaño configurando sulength
propiedad. 3. El uso de cadenas directamente para un cifrado es muy inseguro, se debe usar una clave derivada como la creada por PBKDF2.keyData.length = kCCKeySizeAES256;
.https://github.com/muneebahmad/AESiOSObjC
fuente