1

我有两个 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");
}
4

2 回答 2

6

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

您的加密生成:

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

所以是的,您需要解密才能进行比较。您可以在此处阅读有关IV的内容,以及ecb vs cbc的一个很好的讨论

于 2013-08-14T13:07:23.887 回答
3

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

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

更新

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

于 2013-08-14T12:18:40.253 回答