Подтвердить что ты не робот

Разница CCCrypt между iOS5 и iOS6

У меня есть метод дешифрования/шифрования с использованием CCCrypt(), который отлично работает на iOS5. Теперь я работаю с iOS6 SDK и никогда не менял свой код, но кажется, что что-то сломано. Я все еще могу зашифровать строку с ключом и расшифровать ее, но если я использую другой ключ для дешифрации одной и той же строки, CCCryptStatus, возвращающийся из CCCrypt(), по-прежнему 0(kCCSuccess) - даже когда дешифрование завершается с ошибкой, потому что после этого мои NSData не заполнены. На iOS5 я получил сообщение об ошибке -4303, которое я мог бы обработать. Любые идеи, что может быть неправильно сейчас?

Мой код:

char keyPtr[kCCKeySizeAES256+1]; 
bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)

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

if (encryptOrDecrypt == kCCDecrypt)
{
    data = [GTMBase64 decodeData:data];
}

NSUInteger dataLength = [data length];

size_t bufferSize = dataLength + kCCBlockSizeAES128;

void *buffer = malloc(bufferSize);

size_t numBytesDecrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(encryptOrDecrypt,
                                      kCCAlgorithmAES128,
                                      kCCOptionPKCS7Padding,
                                      keyPtr,
                                      kCCKeySizeAES256,
                                      NULL ,
                                      [data bytes], dataLength, 
                                      buffer,       bufferSize, 
                                      &numBytesDecrypted);

if (cryptStatus != kCCSuccess){
    // do something, but cryptStatus is always 0!
}

EDIT: Протестировано на iPad Simulator 5. Когда я делаю дешифрование с помощью другого ключа, я получаю статус -4303. Только в ios6 возвращается статус 0.

4b9b3361

Ответ 1

Я не специалист по шифрованию, но у меня такая же проблема, и я подумал об обходном пути, возможно, все будет хорошо, пока некоторые не найдут реальное решение.

все, что я сделал, - это указать, какой iOS запущен, а для 6+ я меняю вызов CCCrypt на отсутствие прокладки (0 - без заполнения, 1 - перечисление для kCCOptionPKCS7Padding)

float version = [[UIDevice currentDevice].systemVersion floatValue];
if (version >= 6)
{
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, 0,
                                          keyPtr, kCCKeySizeAES128,
                                          ivPtr,
                                          [self bytes], dataLength,
                                          buffer, bufferSize, 
                                          &numBytesDecrypted );


    if( cryptStatus == kCCSuccess )
    {
        return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
    }

    free( buffer ); 
    return nil;
}
else
{
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, 1,
                                          keyPtr, kCCKeySizeAES128,
                                          ivPtr,
                                          [self bytes], dataLength,
                                          buffer, bufferSize, 
                                          &numBytesDecrypted );
    if( cryptStatus == kCCSuccess )
    {
        return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
    }

    free( buffer );
    return nil;
}

Ответ 2

Существует яблоко тема форума разработчиков, в котором обсуждается эта проблема, и у нее есть много информации по этой теме. Похоже, что дополнительный вариант является проблемой для многих людей. Комментарий № 11, где решение начинает обсуждаться.