【问题标题】:Will this unicode encryption fail?这种 unicode 加密会失败吗?
【发布时间】:2014-02-20 04:07:03
【问题描述】:

我不需要任何严格的安全措施,我只需要阻止 11 岁的 plist 编辑器轻松地在我的游戏中编辑他们的硬币数量。

我创建了一个接受字符串的函数,对于一个字符的每个 unicode 值,它将这个 unicode 值提高 220 加上它在字符串中的字符数的 14 倍。

显然,如果字符串的长度为一百万个字符,这将失败(我认为),因为最终您会用完 unicode 字符,但出于所有意图和目的,这只会用于 20 个字符或更少字符的字符串。

此范围内是否有任何 unicode 字符不会存储到 plist 中,或者在我保存 plist 时会被 Apple 的底层代码忽略,这样当我检索它并解密时,字符就会消失,我不能解密?

+(NSString*)encryptString:(NSString*)theString {
    NSMutableString *encryptedFinal = [[NSMutableString alloc] init];
    for (int i = 0; i < theString.length; i++) {
        unichar uniCharacter = [theString characterAtIndex:i];
        uniCharacter += +220+(14*i);
        [encryptedFinal appendFormat:@"%C", uniCharacter];
    }
    return encryptedFinal;
}

+(NSString*)decryptString:(NSString*)theString {
    NSMutableString *decryptedFinal = [[NSMutableString alloc] init];
    for (int i = 0; i < theString.length; i++) {
        unichar uniCharacter = [theString characterAtIndex:i];
        uniCharacter += +220+(14*i);
        [decryptedFinal appendFormat:@"%C", uniCharacter];
    }
    return decryptedFinal;
}

【问题讨论】:

  • Unicode 不能那样工作。并非所有值都是有效的 unicode 值。您可以做的一件事是将NSString 转换为NSData,操作数据。
  • 你不需要这个。除非 iPhone/iPad 越狱,否则无法修改应用程序的 .plist 文件。如果 iPhone/iPad 越狱,那么代码注入器将能够破解几乎所有简单的加密方案。
  • 你可能想看看this answer
  • @Pranav 我们的数千名用户只需将他们的设备插入计算机即可修改他们的 plist 而无需越狱。中学生发布了数百个视频,这些视频已经开始影响我们的应用内购买销售。
  • @Zaph 这就是我所担心的。那么我范围内的任何 unicode 字符都无效吗?另外,如果我使用无效的 unicode 字符,NSData 是否会完全删除它,因此无法解密?还是它只是存储一个“损坏”的字符,其值可以在以后返回到解密版本?

标签: ios objective-c encryption unicode plist


【解决方案1】:

如果您在沿 20 个字符行的任何给定点对 unicode 索引中的前 26+26+10+30 个字符之一进行加密,则它适用于长度为 20 个字符或更短的字符串。它可能工作得更高,我只是没有测试它更高。

这是我为测试它而创建的代码,所有 unicode 字符都存储在一个 NSString 中并保持有效以供以后计数。

    int i = 0;
    NSMutableString *encryptedFinal = [[NSMutableString alloc] init];
    NSString *theString = @"a";
    int j = 26+26+10+30;//letters + capital letters + numbers + 30 extra things like ?><.\]!@$
    int f = 0;
    int z = 0;
    while (f < j) {
        while (i < 220+220+(14*20)) {
            unichar uniCharacter = [theString characterAtIndex:0];
            uniCharacter += +f;
            uniCharacter += +220+(14*i);
            [encryptedFinal appendFormat:@"%C", uniCharacter];
            i++;
        }
        z += i;
        f++;
        i = 0;
    }
    NSLog(@"%@", encryptedFinal);
    NSLog(@"%i == %i?", z, encryptedFinal.length);

【讨论】:

    【解决方案2】:

    你可以做两件事:

    1. 使用NSData而不是使用 NSNumber。然后使用 NSData+AES 对其进行加密。您甚至可以将整个 .plist 文件加密为 确保没有其他字段被更改。

    2. 通过默默无闻的安全性。只需将硬币的数量保存为重要的音场。例如:安全令牌号码。您还可以创建一个虚假的硬币数量字段,其值被忽略。或者,可以在两个字段中保存相同的值,如果两个值不匹配,则标记用户作弊。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-04
      • 2023-04-01
      • 2011-10-27
      • 1970-01-01
      • 2017-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多