次のコードを使用して、私のテスト アプリのパスコードを難読化しています。
- (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
ご覧のとおり、数値が含まれる 2 つの文字列は、異なっていますが、同じ結果を返します。これらの 2 つの数値で同じ結果になるように添付したコードで何が問題になったのですか?
もう一つの例:
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