【问题标题】:Is it possible to compare two AES encrypted string in iOS?是否可以在 iOS 中比较两个 AES 加密字符串?
【发布时间】:2013-08-14 11:59:34
【问题描述】:

我有两个 NSString,它们是 AES256 加密的。是否可以比较这两个加密字符串?

NSString *passKey = @"mykey";

NSData *data = [@"string to encrypt" dataUsingEncoding:NSUTF8StringEncoding];
NSError *error;
NSData *encryptedData1 = [RNEncryptor encryptData:data
                                    withSettings:kRNCryptorAES256Settings
                                        password:passKey
                                           error:&error];

NSData *encryptedData2 = [RNEncryptor encryptData:data
                                    withSettings:kRNCryptorAES256Settings
                                        password:passKey
                                           error:&error];

NSString *aesEncryptedString1  = [[NSString alloc] initWithData:encryptedData1 encoding:NSASCIIStringEncoding];
NSString *aesEencryptedString2  = [[NSString alloc] initWithData:encryptedData2 encoding:NSASCIIStringEncoding];
NSLog(@"aesEencryptedString1 is %@",encryptedstring1);
NSLog(@"aesEencryptedString2 is %@",encryptedstring2);

if ([aesEncryptedString1 isEqualToString:aesEencryptedString2])
{
    NSLog(@"Success");
}

【问题讨论】:

  • 有可能..如果这就是你想要的......
  • 我做不到。我用相同的密钥加密相同的字符串两次。然后我尝试比较数据。但它失败了:(
  • 你应该展示你是如何做到的(代码)。

标签: ios macos aes


【解决方案1】:

好的,在您包含代码后,您似乎正在使用RNCryptor

您的加密生成:

这会生成一个 NSData,包括标头、加密盐、HMAC salt、IV、密文和HMAC

所以是的,您需要解密才能进行比较。您可以阅读有关IV here 的信息以及很好的讨论ecb vs cbc

【讨论】:

  • 我想比较加密的字符串。事实上,这 2 个字符串在 2 个不同的设备中加密,收集在一起,我们需要比较这 2 个字符串以启动一些过程。
  • @AdarshVC:你有什么具体原因不想解密它们并进行比较吗?鉴于您的用例,我没有看到不这样做的正当理由。与将模式更改为 ECB 相比,解密和比较会更容易、更安全。
  • @AdarshVC 您必须更改加密算法。还添加了一个很好的讨论 ecb vs cbc 的链接
  • 允许比较加密字符串会大大降低加密的安全性,这就是为什么 RNCryptor 不直接支持它的原因。设计一个仍然允许比较的合理安全的加密方案将需要有关特定系统要求的更多详细信息。 (使用此属性很容易构建不安全的加密方案。挑战在于在不牺牲超出要求的安全性的情况下做到这一点。)
  • 请注意,绝对没有理由使用 ECB 来实现这一目标。如果提供恒定的 IV,CBC 完全可以进行比较。 ECB 存在无法比拟的重大安全问题,因此绝不能用于加密随机数据以外的任何内容。
【解决方案2】:

也许吧。它取决于加密期间使用的模式、填充、密钥和 IV(如果适用)。假设使用相同的键和填充...

  • 如果模式是ECB,那么是的,你可以像这样比较密文的字符串。
  • 如果模式是 CBC(或任何其他使用 IV 的模式),并且每次加密都使用随机 IV,那么不,这样比较字符串将不起作用,因为两个相同的字符串将加密为不同的密文。在这种情况下进行比较的唯一方法是解密字符串。
  • 如果模式是 CBC(或任何其他使用 IV 的模式),并且您使用固定 IV,那么可以,您可以比较密文的字符串。

更新

感谢您发布代码。鉴于您的 cmets,我会重新考虑您是否甚至需要为您的用例使用加密。如果这是用于身份验证,则散列算法或密钥派生函数可能更合适。

【讨论】:

  • 您是否需要解密文本?从你的其他 cmets 看来你没有。
  • 我不想解密文本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-29
相关资源
最近更新 更多