2017-02-23 16 views
0
- (NSData *)kd_AES128EncryptWithKey:(NSString *)key { 
    if (key.length == 0) { 
     return nil; 
    } 
    char keyPtr[kCCKeySizeAES128 + 1]; 

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

    NSUInteger dataLength = [self length]; 
    int diff = kCCKeySizeAES128 - (dataLength % kCCKeySizeAES128); 
    NSUInteger newSize = 0; 

    if (diff > 0) { 
     newSize = dataLength + diff; 
    } 

    char dataPtr[newSize]; 
    memcpy(dataPtr, [self bytes], [self length]); // crash EXC_BAD_ACCESS 

    ... 
    free(buffer); 
    return nil; 
} 

в этой аварии: NewSize = 800016 DataSize = 800001AES128 memcry() аварии

Когда я сделать AES128 шифрования для NSData (800001 байт), сбой в memcry(), but if the data is smaller, это работает нормальный

Помогло ли мне кто-нибудь?

+4

Это похоже на объектив-C, а не на C. Пожалуйста, используйте правильный тег. Кроме того, вопросы отладки кода должны включать в себя [mcve]. – kaylum

+0

1. Что вы пытаетесь выполнить с помощью 'diff' и' kCCKeySizeAES128'? 2. Если 'diff <= 0'' newSize' '' '' '', что вы не хотите. 3. Что делает 'kCCKeySizeAES128' связано с длиной данных? 4. С отсутствующим кодом '...' трудно сказать, что все предоставленные коды предназначены для. 5. Имя переменной 'diff' не очень описывает ее функцию. – zaph

ответ

1

Ваш dataPtr выделяется в стек, который всегда имеет определенный предел. Если вы имеете дело с большими кусками памяти, а затем использовать кучу вместо:

char *dataPtr = (char *)malloc(newSize); 

и не забудьте освободить его позже

0

Если diff <= 0newSize является 0 так память не будет aqllocated к dataPtr: char dataPtr[newSize]; поэтому произойдет сбой memcpy.

Смежные вопросы