2012-07-30 12 views
7

Ich entwickle einen ePub Reader für iOS. Die ePub-Dateien, die ich vom Server herunterlade, werden mit dem XOR-Algorithmus verschlüsselt. Ich bekomme diese Dateien als .xlsx-Format mit dem Schlüssel, um es zu entschlüsseln. Ich entschlüssle und lade die Datei zum Leser wie folgt:XOR Dateiverschlüsselung in iOS

  1. Laden Sie die Datei als NSData aus dem heruntergeladenen Verzeichnis.
  2. Entschlüsseln der Daten mit dem Schlüssel.
  3. Schreiben der entschlüsselten Daten in ein temporäres Verzeichnis.
  4. Laden Sie die Datei aus dem temporären Verzeichnis in den Reader.

Ich verwende AePubReader, um die Datei zu laden. Hier

ist der Entschlüsselungs-Code:

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

Aber wenn ich versuche, die entschlüsselte Datei an den Leser zu laden, erhalte ich einen Fehler wie folgt:

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: 

ich für das aufgegebene URL-Pfad, es ist nicht leer und sogar überprüft, ob die Datei im Pfad existiert. Die Datei existiert am angegebenen Pfad.

Wo ich vielleicht falsch liege ??? Irgendwelche Hilfe wird geschätzt. Danke im Voraus.

+3

Ist das nicht UB: '* dataPtr = * dataPtr ++^* keyPtr ++;'? –

+0

@PaulR: Sorry..Ich habe nicht bekommen, was du eigentlich von UB hast ... könntest du bitte etwas mehr erklären ?? – PETER

+0

Siehe http://en.wikipedia.org/wiki/Sequence_point für die Erläuterung der Sequenzpunkte und des resultierenden Undefined Behavior, wenn die Regeln fehlerhaft sind. –

Antwort

8

Ich löste es. Als Paul kommentierte war das Problem mit:

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

ich es geändert:

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

Danke Paul.