2012-07-30 11 views
7

Sto sviluppando un lettore ePub per iOS. I file ePub che sto scaricando dal server sono crittografati usando l'algoritmo XOR. Sto ottenendo quei file in formato .xlsx con la chiave per decodificarlo. Sto decrittando e caricando il file sul lettore come segue:Codifica file XOR in iOS

  1. Carica il file come NSData dalla directory scaricata.
  2. Decifrare i dati con il tasto.
  3. Scrittura dei dati decrittografati in una directory temporanea.
  4. Carica il file dalla directory temporanea al lettore.

Sto utilizzando AePubReader per caricare il file.

ecco il codice di decrittazione:

- (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; 
} 

Ma quando sto cercando di caricare il file decifrato al lettore, sto ottenendo un errore come segue:

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: 

ho controllato per la percorso url, non è vuoto e controlla anche se il file esiste sul percorso. Il file esiste nel percorso specificato.

Dove potrei sbagliare ??? Qualsiasi aiuto sarà apprezzato. Grazie in anticipo.

+3

Non è questo UB: '* dataPtr = * dataPtr ++^* keyPtr ++;'? –

+0

@PaulR: Scusa ... non ho ottenuto quello che effettivamente tieni da UB ... potresti spiegare un po 'di più ?? – PETER

+0

Vedere http://en.wikipedia.org/wiki/Sequence_point per la spiegazione dei punti di sequenza e il comportamento non definito risultante quando le regole sono interrotte. –

risposta

8

Ho risolto. Come ha commentato Paolo, il problema era con:

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

ho cambiato in:

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

Grazie Paolo.