2012-07-30 2 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 경로, 그것은 비어 있지 않으며 경로에 파일이 있는지 여부도 확인됩니다. 지정된 경로에 파일이 있습니다.

어디서 잘못 될 수 있습니까? 어떤 도움을 주시면 감사하겠습니다. 미리 감사드립니다.

+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++; 

: 바울은 주석으로 함께 문제가 있었다.