2013-09-16 3 views
6

Я использую AES256 для защиты и хранения данных в форме шифрования, которая отлично работает в IOS 6 и ниже, но когда я протестировал свое приложение в IOS 7, я не получаю свои данные, был магазин ранее. После отладки я обнаружил, что дешифрование не работает, это IOS 7 и возвращает пустое.AES256 Ошибка шифрования/дешифрования + IOS SDK 7

Мой код, как показано ниже:

- (NSData *)AES256DecryptWithKey:(NSString *)key { 
// 'key' should be 32 bytes for AES256, will be null-padded otherwise 

char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused) 


bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding) 
// fetch key data 
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; 
NSUInteger dataLength = [self length]; 
//See the doc: For block ciphers, the output size will always be less than or 
//equal to the input size plus the size of one block. 
//That's why we need to add the size of one block here 
size_t bufferSize = dataLength + kCCBlockSizeAES128; 
void *buffer = malloc(bufferSize); 
size_t numBytesDecrypted = 0; 
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, 
             keyPtr, kCCKeySizeAES256, 
             NULL /* initialization vector (optional) */, 
             [self bytes], dataLength, /* input */ 
             buffer, bufferSize, /* output */ 
             &numBytesDecrypted); 
if (cryptStatus == kCCSuccess) { 
    //the returned NSData takes ownership of the buffer and will free it on deallocation 
    return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted]; 
} 
free(buffer); //free the buffer; 
return nil; 

}

Можете ли вы помочь получить мои данные снова в IOS 7?

Благодаря

+0

После много отладки, я нашел, когда вызов функции CCCryptorStatus cryptStatus = CCCrypt (....), буфер получит значение NSThreadWillExitNotification как значение. – Hindu

ответ

7

Найдено решение по этой проблеме на Apple Devforums.

- (NSData *)encrypt:(NSString *)key { 
// 'key' should be 32 bytes for AES256, will be null-padded otherwise 
char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused) 
bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding) 

BOOL patchNeeded = ([key length] > kCCKeySizeAES256); 
if (patchNeeded) { 
     key = [key substringToIndex:kCCKeySizeAES256]; // Ensure that the key isn't longer than what's needed (kCCKeySizeAES256) 
} 

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

if (patchNeeded) { 
     keyPtr[0] = '\0'; // Previous iOS version than iOS7 set the first char to '\0' if the key was longer than kCCKeySizeAES256 
} 

NSUInteger dataLength = [self length]; 

//See the doc: For block ciphers, the output size will always be less than or 
//equal to the input size plus the size of one block. 
//That's why we need to add the size of one block here 
size_t bufferSize = dataLength + kCCBlockSizeAES128; 
void *buffer = malloc(bufferSize); 

size_t numBytesEncrypted = 0; 
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, 
               keyPtr, kCCKeySizeAES256, 
               NULL /* initialization vector (optional) */, 
               [self bytes], dataLength, /* input */ 
               buffer, bufferSize, /* output */ 
               &numBytesEncrypted); 
if (cryptStatus == kCCSuccess) { 
     //the returned NSData takes ownership of the buffer and will free it on deallocation 
     return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted]; 
} 

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

Конечно, скопируйте паз же патч для метода дешифрования.

+0

Привет, благодаря предоставлению этого ответа, я проверю его. Еще раз спасибо ... – Hindu

+1

У меня такой же результат. Шифрование всегда работает. Расшифровка работает в iOS 8 и 9, но она не работает на iOS 7. Последний параметр в 'CCCrypt()' равен 0 после выполнения. И буфер остается все 0s. Вместо этого я не использую 'NSString * key', а вместо этого - ключ NSData *. Я пытался распечатать ключ перед вызовом функции, и он выглядит идентично тому, что было при шифровании. Кто-нибудь с ключом? – edwardtoday

+0

@edwardtoday То же самое здесь. Я предлагаю задать этот вопрос как новый вопрос. Я тоже хотел бы знать, почему. – Drakes