2012-07-30 12 views
7

Estoy desarrollando un lector de ePub para iOS. Los archivos ePub que estoy descargando del servidor están encriptados usando el algoritmo XOR. Obtengo esos archivos como formato .xlsx con la clave para descifrarlo. Estoy descifrando y cargando el archivo al lector de la siguiente manera:Cifrado de archivos XOR en iOS

  1. Cargue el archivo como NSData del directorio descargado.
  2. Descifrar los datos con la clave.
  3. Escribir los datos descifrados en un directorio temporal.
  4. Cargue el archivo del directorio temporal al lector.

Estoy usando AePubReader para cargar el archivo.

Aquí está el código de descifrado:

- (NSData *)obfuscate:(NSData *)data withKey:(NSString *)key 
{ 
    NSMutableData *result = [data mutableCopy]; 


    // Get pointer to data to obfuscate 
    char *dataPtr = (char *) [result mutableBytes]; 

    // Get pointer to key data 
    char *keyData = (char *) [[key dataUsingEncoding:NSUTF8StringEncoding] bytes]; 

    // Points to each char in sequence in the key 
    char *keyPtr = keyData; 
    int keyIndex = 0; 

    // For each character in data, xor with current value in key 
    for (int x = 0; x < [data length]; x++) 
    { 
     // Replace current character in data with 
     // current character xor'd with current key value. 
     // Bump each pointer to the next character 
     *dataPtr = *dataPtr++^*keyPtr++; 

     // If at end of key data, reset count and 
     // set key pointer back to start of key value 
     if (++keyIndex == [key length]) 
      keyIndex = 0, keyPtr = keyData; 
    } 

    return result; 
} 

Pero cuando estoy tratando de cargar el archivo descifrado para el lector, que estoy recibiendo un error de la siguiente manera:

2012-07-30 20:45:12.652 XYX[5986:12203] ERROR: ePub not Valid 
2012-07-30 20:45:12.652 XYX[5986:12203] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSURL initFileURLWithPath:]: nil string parameter' 
*** First throw call stack: 

he comprobado para el ruta url, no está vacía e incluso se comprueba si el archivo existe en la ruta. El archivo existe en la ruta especificada.

Donde podría estar yendo mal? Cualquier ayuda será apreciada. Gracias por adelantado.

+3

¿No es esto UB: '* dataPtr = * dataPtr ++^* keyPtr ++;'? –

+0

@PaulR: Lo siento ... No obtuve lo que realmente mentiste por UB ... ¿podrías explicarme un poco más? – PETER

+0

Consulte http://en.wikipedia.org/wiki/Sequence_point para obtener una explicación de los puntos de secuencia y el comportamiento indefinido resultante cuando se rompen las reglas. –

Respuesta

8

Lo resolví. Como se comentó Paul, el problema era con:

*dataPtr = *dataPtr++^*keyPtr++; 

lo cambié a:

*dataPtr = *dataPtr^*keyPtr; 
     dataPtr++; 
     keyPtr++; 

Gracias Paul.