1

我正在使用以下代码来混淆我的测试应用程序的密码。

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

4

2 回答 2

4

问题是你的最后一行。data您使用未修改的原始对象创建新字符串。

您需要从修改后的字节创建一个新NSData对象。dataPtr

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

但是你有一些更大的问题。

  1. 调用返回对对象bytes中字节的常量只读引用。NSData您不应该修改该数据。
  2. 理论上,对字符数据进行 XOR 的结果可能会导致字节流不再是有效的 UTF-8 编码字符串。
于 2013-08-16T23:03:53.813 回答
2

您选择的混淆算法基于XOR数据和“关键”值。一般来说,这不是很强。此外,由于XOR是对称的,结果很容易产生重复。

尽管您的实现当前已损坏,但修复它对于防止算法为不同数据产生相同结果并没有太大帮助:构造产生相同混淆字符串的键/数据对相对简单 - 例如,

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

将产生相同"FFJJ"的结果,即使字符串和键看起来完全不同。

如果您想以加密方式“混淆”您的字符串,请使用加盐 安全哈希算法:即使字符串略有不同,它也会产生非常不同的结果。

于 2013-08-16T23:09:00.043 回答