PHP API, который я вызываю из своего приложения для iOS, требует, чтобы полезная нагрузка была зашифрована определенным образом. У меня проблемы с воспроизведением этого подхода в Objective-C с помощью RNCryptor.
Вот код 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, чтобы заставить его работать?
ОБНОВЛЕНИЕ
Я экспериментировал с нативным фреймворком CommonCrypto для iOS напрямую, не используя стороннюю библиотеку RNCryptor. Однако я постоянно получаю тот же результат, что и с RNCryptor. Я даже пытался реализовать AES128 как в своих фрагментах кода Objective-C, так и в PHP, но даже это никогда не приводило к совпадению результатов в двух средах…
ОБНОВЛЕНИЕ 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];
}
MD5String
? Какого типа аргумент и тип возвращаемого значения? - person zaph   schedule 05.11.2013