2012-07-30 13 views
7

Pracuję nad czytnikiem ePub na iOS. Pliki ePub pobierane z serwera są szyfrowane przy użyciu algorytmu XOR. Otrzymuję te pliki w formacie .xlsx z kluczem do odszyfrowania. Odszyfrowuję i ładuję plik do czytnika w następujący sposób:Szyfrowanie plików XOR w iOS

  1. Załaduj plik jako NSData z pobranego katalogu.
  2. Odszyfrowywanie danych za pomocą klucza.
  3. Zapisanie odszyfrowanych danych do katalogu tymczasowego.
  4. Załaduj plik z katalogu tymczasowego do czytnika.

Używam AePubReader do załadowania pliku.

Oto kod deszyfrowania:

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

Ale gdy próbuję załadować odszyfrowane plik do czytnika, ja otrzymuję błąd w następujący sposób:

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: 

Sprawdziłem dla ścieżka URL, nie jest pusta, a nawet sprawdza, czy plik istnieje w ścieżce. Plik istnieje w podanej ścieżce.

Gdzie może być źle? Każda pomoc zostanie doceniona. Z góry dziękuję.

+3

Czy to nie jest UB: '* dataPtr = * dataPtr ++^* keyPtr ++;'? –

+0

@PaulR: Przepraszam .. Nie dostałem tego, co faktycznie zrobiłeś przez UB ... czy mógłbyś wyjaśnić trochę więcej? – PETER

+0

Zobacz http://en.wikipedia.org/wiki/Sequence_point dla wyjaśnienia punktów sekwencyjnych i wynikających z nich niezdefiniowanych zachowań, gdy reguły są zepsute. –

Odpowiedz

8

Rozwiązałem to. Jak komentuje Paweł, problem był z:

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

zmieniłem go na adres:

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

Dziękuję Paul.