Как мне преобразовать эту функцию дешифрования из PHP в Objective C?

0

В настоящее время я работаю над проектом, который требует, чтобы я расшифровал данные. У меня есть версия php, и я хотел бы портировать ее в мой проект iOS.

Это рабочая функция php:

public function decryptCBC($data, $key, $iv) {
        // Decode the key and IV.
        $iv = base64_decode($iv);
        $key = base64_decode($key);
        // Decrypt the data.
        $data = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, $iv);
        $padding = ord($data[strlen($data) - 1]);
        return substr($data, 0, -$padding);
}

В Objective C это то, что я пробовал, но пока не успел

- (NSData *) decryptCBC:(NSData*)data WithKey:(NSString *)key andIv:(NSString *)iv {

    NSData *keyData = [[NSData alloc] initWithBase64EncodedString:key options:0];
    NSData *ivData = [[NSData alloc] initWithBase64EncodedString:iv options:0];

    key = [[NSString alloc] initWithData:keyData encoding:NSASCIIStringEncoding];

    char keyPtr[kCCKeySizeAES128+1];
    bzero(keyPtr, sizeof(keyPtr)); // fill with 0s - padding

    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    NSUInteger dataLength = data.length;

    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);

    size_t numBytesEncrypted = 0;

    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, 0 ,
                                          keyPtr, kCCKeySizeAES128,
                                          [ivData bytes],
                                          [data bytes], dataLength,
                                          buffer, bufferSize,
                                          &numBytesEncrypted);

    if (cryptStatus == kCCSuccess) {
        //the returned NSData takes ownership of the buffer and will free it on deallocation

        NSData *response = [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted-1];
        return response;
    }

    free(buffer); //free the buffer;
    return nil;
}

Если кто-то знает, что я делаю неправильно, я был бы признателен за ответ.

Спасибо /Jonathan

  • 0
    Обеспечьте шестнадцатеричный дамп ключа, iv и данных в и из обеих функций. Существует некоторая обеспокоенность по поводу заполнения.
Теги:
encryption
base64
aes

1 ответ

0

Если у вас точно такой же вход, и входы точно соответствуют длине, вы получите точно такой же результат.

Одна проблема: одно и то же дополнение должно использоваться для каждого, но вы не используете дополнение в расшифровке, вы делаете что-то внешнее для заполнения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню