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

ご覧のとおり、数値が含まれる 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

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 に答える