2013-08-16 1 views
1

다음 코드를 사용하여 광산의 테스트 앱에 대한 암호를 난독 화합니다.숫자 (문자열 내) 난독 화 목적 C

- (NSString *)obfuscate:(NSString *)string withKey:(NSString *)key 
{ 
    // Create data object from the string 
    NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; 

    // Get pointer to data to obfuscate 
    char *dataPtr = (char *) [data bytes]; 

    // 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 [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
} 

이 모든 문자열 매력처럼 작동하지만 다음과 같은 결과

NSLog([[self obfuscate:@"0000", @"maki"]); //Returns 0]<W 

NSLog([[self obfuscate:@"0809", @"maki"]); //Returns 0]<W 

당신이 볼 수 있듯이 을 비교하는 약간의 문제로 실행했습니다의 숫자와 두 개의 문자열, 다른 반면, 같은 결과를 반환! 이 두 숫자에 대해 동일한 결과가 발생하도록 첨부 한 코드에서 무엇이 잘못 되었습니까?

또 다른 예 :

NSLog([self obfuscate:@"8000" withKey:@"maki"]); //Returns 8U4_ 
NSLog([self obfuscate:@"8290" withKey:@"maki"]); //Returns 8U4_ as well 

내가 난처의 개념을 오해 할 수 있지만 각각의 고유 한 문자열이 독특한 난독 문자열을 반환하는 인상이었다!

나 코드의 버그/결함 소스를 수정 도와주세요 : http://iosdevelopertips.com/cocoa/obfuscation-encryption-of-string-nsstring.html

+0

구현에 문제가 있습니다. 코드를 C로 다시 작성하고 '0000', 'maki'및 '0809', 'maki''와 같은 결과를 얻었습니다 (http : : //ideone.com/mQcfch)). – dasblinkenlight

답변

4

문제는 마지막 라인입니다. 원래의 수정되지 않은 data 개체를 사용하여 새 문자열을 만듭니다.

수정 된 dataPtr 바이트에서 NSData 개체를 새로 만들어야합니다.

NSData *newData = [NSData dataWithBytes:dataPtr length:data.length]; 
return [[NSString alloc] initWithData:newData encoding:NSUTF8StringEncoding]; 

하지만 더 큰 문제가 있습니다.

  1. 호출 bytes에 반환 NSData 객체의 바이트 상수, 읽기 전용 참조입니다. 해당 데이터를 수정하면 안됩니다.
  2. 문자 데이터에 대한 XOR 결과가 더 이상 유효한 UTF-8 인코딩 된 문자열이 아닌 바이트 스트림이 될 수 있습니다.
+0

나는이 두 가지 문제가 프로그램의 결과에 어떤 식 으로든 영향을 미치는지 지금 테스트하고있다. –

+0

물론입니다.앱이 중단되거나 '무효'결과가 발생할 수 있습니다. – rmaddy

2

선택한 난독 화 알고리즘은 데이터와 "키"값을 함께 사용하여 XOR을 기반으로합니다. 일반적으로 이것은 그리 강하지 않습니다. 또한 XOR은 대칭이므로 결과는 중복을 생성하기 쉽습니다.

구현이 현재 중단되었지만 알고리즘을 수정하면 다른 데이터에 대해 동일한 결과가 생성되는 것을 방지하는 데 도움이되지 않습니다. 예를 들어, 동일한 난독 화 문자열을 생성하는 키/데이터 쌍을 생성하는 것은 비교적 간단합니다. ,

[self obfuscate:@"0123" withKey:@"vwxy"] 
[self obfuscate:@"pqrs" withKey:@"6789"] 

은 문자열과 키 모두가 충분히 다를 경우에도 동일한 결과를 생성 "FFJJ" 것이다.

문자열을 암호화 방식으로 "난독 화"하려면 saltedsecure hash 알고리즘을 사용하십시오. 약간 다른 문자열에서도 매우 다른 결과를 생성합니다.

+0

이것은 모두 훌륭한 피드백이지만 실제로 질문에 대한 답변이 아닙니다. 아마도 이것은 주석이어야합니다. – rmaddy

+0

@rmaddy이 답변은 OP 구현을 수정하지 않는다는 것에 동의합니다. 그러나 알고리즘은 훨씬 더 근본적인 방식으로 "깨졌습니다"- 편집에서 더 자세한 내용을 제공했습니다. – dasblinkenlight