我从我的 iOS 应用程序中调用的 PHP API 需要以某种自定义方式对有效负载进行加密。我在使用 RNCryptor 在 Objective-C 中复制这种方法时遇到了麻烦。
这是用于加密字符串的 PHP 代码:
function encrypt($string) {
$key = 'some-random-key';
return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key))));
}
这就是我试图在 Objective-C 中实现相同加密结果的方式:
+ (NSData*)encryptData:(NSData*)sourceData {
NSString *keyString = @"some-random-key";
NSData *key = [[keyString MD5String] dataUsingEncoding:NSUTF8StringEncoding];
NSData *iv = [[[keyString MD5String] MD5String] dataUsingEncoding:NSUTF8StringEncoding];
NSMutableData *encryptedData = [NSMutableData data];
RNCryptorEngine *cryptor = [[RNCryptorEngine alloc] initWithOperation:kCCEncrypt settings:kRNCryptorAES256Settings key:key IV:iv error:nil];
[encryptedData appendData:[cryptor addData:sourceData error:nil]];
[encryptedData appendData:[cryptor finishWithError:nil]];
return encryptedData;
}
但是这两个函数的结果从不匹配。例如,对于相同的单字字符串,PHP 代码返回J39gRcuBEaqMIPP1VlizdA8tRjmyAB6za4zG5wcOB/8=
,而在 Objective-C 中(在base64EncodedStringWithOptions:
生成的 NSData 上运行之后)我得到1FGpZpVm2p4z3BBY6KW2fw==
.
我需要在 RNCryptor 设置中进一步调整以使其正常工作吗?
更新
我直接玩过原生 iOS CommonCrypto 框架,完全没有使用第三方 RNCryptor lib。不过,我一直得到与 RNCryptor 相同的结果。我什至尝试在我的 Objective-C 和 PHP 代码片段中实现 AES128,但即便如此,这两个环境的结果也从未匹配......</p>
更新 2
MD5String
我使用的方法是 NSString 上的一个类别,定义如下:
- (NSString *)MD5String {
const char *cstr = [self UTF8String];
unsigned char result[16];
CC_MD5(cstr, strlen(cstr), result);
return [[NSString stringWithFormat:
@"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
result[0], result[1], result[2], result[3],
result[4], result[5], result[6], result[7],
result[8], result[9], result[10], result[11],
result[12], result[13], result[14], result[15]
] lowercaseString];
}