如何使用 AES 128 适当地加密和解密 NSString
How to appropriately encrypt and decrypt a NSString with AES 128
我正在使用 http://aes.online-domain-tools.com 来加密我的 NSString,我从中得到的是一个无符号字符数组,例如 c2 84 6b 71 72 6d d2 e7 cd 0b a6 08 cd 85 c3 0c。
然后在我的代码中使用它把它转换成 NSString:
const unsigned char encrpytedAppIDbytes[] = {0xe5, 0x35, 0xdf, 0x72, 0x57, 0xaf, 0xf7, 0xe6, 0x1f, 0x6d, 0x51, 0x1d, 0x26, 0xe8, 0x5e, 0xa2};
NSData *appIDToDecrypt = [NSData dataWithBytes:encrpytedAppIDbytes length:sizeof(encrpytedAppIDbytes)];
NSString *decryptedAppID = [[NSString alloc] initWithData:[appIDToDecrypt AES128DecryptedDataWithKey:@"something"] encoding:NSUTF8StringEncoding];
if([decryptedAppID isEqualToString:@"Something"]){} // This fails even when i look at them in the debugger they are the same.
但是当我试图解密它时,它显示为相同的字符串,但是当我将它与相同的 NSString 硬代码进行比较以检查它是否是相同的字符串时,它不起作用。
我在我的应用程序中进行的一些身份验证检查失败了。
请指出我在这里做错了什么。
谢谢,
好吧,在花了几个小时之后,我终于找到了可能不是最佳但适合我的解决方案。
似乎在解密后,该字符串包含一些其他字符,这些字符在调试器中不可见,但是当我尝试检查长度时,它显示的字符数大于其中的字符数,这表明有问题.现在我所做的是:
const unsigned char nameBytes[] = {0xa6, 0xf0, 0xea, 0x36, 0x5f, 0x78, 0xb7, 0x52, 0x29, 0x6a, 0x67, 0xb7, 0xeb, 0x73, 0xd5, 0x14};
NSData *nameBytesData = [NSData dataWithBytes:nameBytes length:sizeof(nameBytes)];
NSString *nameBytesString = [[NSString alloc] initWithData:[nameBytesData AES128DecryptedDataWithKey:@"PaymentGateway"] encoding:NSUTF8StringEncoding];
NSCharacterSet * set = [[NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ0123456789"] invertedSet];
NSString *safeSearchString = [[nameBytesString componentsSeparatedByCharactersInSet:set] componentsJoinedByString:@""];
NSLog(@"length:%lu",(unsigned long)[safeSearchString length]);
NSLog(@"lengthActual:%lu",(unsigned long)[@"ashutosh" length]);
if ([safeSearchString isEqualToString:@"ashutosh"]) {
NSLog(@"Success");
}
NSLog(@"Decrypted:%@",nameBytesString);
上面的代码删除了所有特殊字符并将其替换为@"",因此结果字符串仅包含有效字符。要添加支持以将更多字符视为有效,只需将它们添加到 NSCharacterSet * set。
我正在使用 http://aes.online-domain-tools.com 来加密我的 NSString,我从中得到的是一个无符号字符数组,例如 c2 84 6b 71 72 6d d2 e7 cd 0b a6 08 cd 85 c3 0c。
然后在我的代码中使用它把它转换成 NSString:
const unsigned char encrpytedAppIDbytes[] = {0xe5, 0x35, 0xdf, 0x72, 0x57, 0xaf, 0xf7, 0xe6, 0x1f, 0x6d, 0x51, 0x1d, 0x26, 0xe8, 0x5e, 0xa2};
NSData *appIDToDecrypt = [NSData dataWithBytes:encrpytedAppIDbytes length:sizeof(encrpytedAppIDbytes)];
NSString *decryptedAppID = [[NSString alloc] initWithData:[appIDToDecrypt AES128DecryptedDataWithKey:@"something"] encoding:NSUTF8StringEncoding];
if([decryptedAppID isEqualToString:@"Something"]){} // This fails even when i look at them in the debugger they are the same.
但是当我试图解密它时,它显示为相同的字符串,但是当我将它与相同的 NSString 硬代码进行比较以检查它是否是相同的字符串时,它不起作用。 我在我的应用程序中进行的一些身份验证检查失败了。
请指出我在这里做错了什么。
谢谢,
好吧,在花了几个小时之后,我终于找到了可能不是最佳但适合我的解决方案。
似乎在解密后,该字符串包含一些其他字符,这些字符在调试器中不可见,但是当我尝试检查长度时,它显示的字符数大于其中的字符数,这表明有问题.现在我所做的是:
const unsigned char nameBytes[] = {0xa6, 0xf0, 0xea, 0x36, 0x5f, 0x78, 0xb7, 0x52, 0x29, 0x6a, 0x67, 0xb7, 0xeb, 0x73, 0xd5, 0x14};
NSData *nameBytesData = [NSData dataWithBytes:nameBytes length:sizeof(nameBytes)];
NSString *nameBytesString = [[NSString alloc] initWithData:[nameBytesData AES128DecryptedDataWithKey:@"PaymentGateway"] encoding:NSUTF8StringEncoding];
NSCharacterSet * set = [[NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ0123456789"] invertedSet];
NSString *safeSearchString = [[nameBytesString componentsSeparatedByCharactersInSet:set] componentsJoinedByString:@""];
NSLog(@"length:%lu",(unsigned long)[safeSearchString length]);
NSLog(@"lengthActual:%lu",(unsigned long)[@"ashutosh" length]);
if ([safeSearchString isEqualToString:@"ashutosh"]) {
NSLog(@"Success");
}
NSLog(@"Decrypted:%@",nameBytesString);
上面的代码删除了所有特殊字符并将其替换为@"",因此结果字符串仅包含有效字符。要添加支持以将更多字符视为有效,只需将它们添加到 NSCharacterSet * set。