2009-09-13 12 views
15

Tengo una aplicación para iPhone que encripta un NSString ingresado usando CCCrypt (AES256) y una clave de texto sin formato. La cadena y la clave se asignan al método de cifrado que devuelve un objeto NSData.NSData cifrado a NSString en obj-c?

Solicitando [descripción de datos], donde 'datos' son los datos cadena cifrada da una NSString como: "< 0b368353 a707e7de 3eee5992 ee69827e e3603dc2 b0dbbc0b 861ca87d f39ce72a>" pero cuando intento de convertir eso a un NSString, me sale "(nulo)".

Necesito devolver un NSString al usuario, que se puede utilizar para descifrar la cadena original utilizando la misma clave de texto sin formato. Si la propiedad 'description' del objeto NSData puede devolver una cadena, ¿hay alguna manera de que pueda producir un NSString desde el objeto NSData sin obtener "(null)"?

ACTUALIZACIÓN: Gracias a Quinn, quien sugiere utilizar la codificación Base64 para producir la cadena confusa. Por lo que entiendo, la codificación Base64 no solo intercambia caracteres, sino que el intercambio de caracteres depende de la posición, así que está bien.

Mi única preocupación es que quiero poder encriptar el mensaje con una 'frase de contraseña', y requerir la contraseña idéntica para ingresar cuando se necesita decodificar la cadena confusa - ¿alguien puede sugerir formas de implementar esto?

+0

He actualizado mi respuesta para abordar esto a continuación. Estás en lo cierto, Base64 no es un algoritmo de sustitución, básicamente expande 3 bytes a 4 bytes, por lo que los datos codificados son 1.37x tan grandes como su contraparte no codificada. Básicamente, toma 3 fragmentos de 8 bits y los divide en 4 trozos de 6 bits, luego los reinterpreta como trozos de 8 bits, que se pueden representar fácilmente en ASCII. Wikipedia tiene más detalles. –

Respuesta

32

En primer lugar, NO USE utilice -[NSData description] para crear un NSString para tales fines. (Lo mejor es tratar -description como resultado de depuración. Me disculpo si my previous answer lo engañó, simplemente estaba imprimiendo la descripción para demostrar que el NSData se puede cifrar y descifrar). En su lugar, use los métodos -dataUsingEncoding: y -initWithData:encoding: de NSString para convertir entre NSData y NSString. Incluso con estos, tenga en cuenta que los datos cifrados AES probablemente no se traduzcan bien en cadenas tal como están; algunas secuencias de bytes simplemente no funcionarán bien, por lo que es una buena idea codificar los datos antes de crear la cadena.

Sugeriría que pruebe Base64 encoding NSData, ya que los datos de Base64 siempre se pueden representar como una cadena ASCII. (Por supuesto, cuando haces eso, vas a tener que decodificar de base 64 antes de descifrar.)

Aquí están algunos recursos útiles ...


Editar: estaba asumiendo que le combina esto con mi respuesta a your previous question el cifrado AES de objetos NSString. La codificación de datos como Base64 no impone ninguna restricción sobre los datos en sí; sin duda puede ser datos encriptados por AES. Esto es lo que hay que hacer si lo que desea la cadena de entrada y de salida:

  • cifrado
    • ofrecen los NSString a cifrar y la contraseña a usar para el cifrado.
    • Convierta la cadena a un NSData y realice el cifrado AES (vea la pregunta anterior).
    • Base64: codifica NSData, luego crea y devuelve NSString de la salida codificada.
  • descifrado
    • proporcionan la cadena encriptada y codificada, y la contraseña a usar para desencriptar.
    • Crea un NSData a partir de la primera cadena, luego Base64-descodifica los datos.
    • Realice el descifrado AES de los datos, luego cree y devuelva un NSString.

no deja de ser una cuestión de encadenar las dos partes juntas y la realización de ellos en sentido inverso a la salida. Desde mi respuesta anterior, puede modificar encryptString:withKey: para realizar el último paso y devolver una cadena, y cambie decryptData:withKey: para que sea decryptString:withKey: y acepte dos cadenas. Es bastante sencillo.

+3

+1 y ¡Gracias por el enlace a NSDataAdditions, muy útil! –

+0

@FreeAsInBeer No marque las respuestas de otras personas como Wiki de la comunidad cuando las edite. Para eso no es para eso. –

+0

@QuinnTaylor La sección de Preguntas frecuentes indica que usted es el único que tiene acceso específico a la casilla de verificación Comunidad Wiki. Es posible que mi edición haya provocado involuntariamente que ingrese al modo Wiki comunitario, pero eso fue completamente involuntario. Por favor, no acusen a otras personas de hacer cosas que no pueden hacer. [Referencia] (http://meta.stackexchange.com/questions/11740/what-are-community-wiki-posts/11741#11741) – FreeAsInBeer

2

He creado un paquete completo de categorías para NSData y NSString para proporcionar el cifrado AES256 para cadenas.

Consulte my answer en la pregunta 'original' para obtener más detalles.