2012-07-30 11 views
7

iOS用のePubリーダーを開発しています。サーバーからダウンロードしているePubファイルは、XORアルゴリズムを使用して暗号化されています。私はそれらのファイルを解読するための鍵を持つ.xlsx形式にしています。私は解読して、次のようにファイルを読み込みます。iOSでのXORファイルの暗号化

  1. ダウンロードしたディレクトリからファイルをNSDataとしてロードします。
  2. キーを使用してデータを復号化する。
  3. 解読されたデータを一時ディレクトリに書き込む。
  4. ファイルを一時ディレクトリからリーダーにロードします。

私はファイルをロードするためにAePubReaderを使用しています。ここで

は、復号化コードです:

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

しかし、私は読者に復号化されたファイルをロードしようとしていたときに、以下のように、私はエラーを取得しています:

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: 

私がチェックしurlパス、空ではなく、pathにファイルが存在するかどうかをチェックします。指定されたパスにファイルが存在します。

私は間違っているかもしれませんか?どんな助けもありがとうございます。前もって感謝します。

+3

これはUBではありません: '* dataPtr = * dataPtr ++^* keyPtr ++;'? –

+0

@PaulR:申し訳ありません。実際にあなたがUBに言われたことを得られませんでした。もう少し説明していただけますか? – PETER

+0

シーケンスポイントの説明と、ルールが破られたときの未定義の動作については、http://en.wikipedia.org/wiki/Sequence_pointを参照してください。 –

答えて

8

私はそれを解決しました。

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

はあなたにポールをありがとう:私はそれを変更し

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

:ポールがコメントしたように、問題となりました。