2017-02-23 1 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; 
} 

in diesem Crash: newSize = 800016 datasize = 800001AES128 memcry() Absturz

Wenn ich encrypt machen AES128 für NSData (800001 bytes), Absturz in memcry(), but if the data is smaller, es funktioniert normal

Könnte mir jemand helfen?

+4

Das sieht wie Ziel-C nicht C. Bitte verwenden Sie das richtige Tag. Außerdem sollten Code-Debugging-Fragen ein [mcve] enthalten. – kaylum

+0

1. Was versuchst du mit 'diff' und' kCCKeySizeAES128' zu erreichen? 2. Wenn 'diff <= 0'' newSize' ist '0' was nicht das ist was du willst. 3. Was hat 'kCCKeySizeAES128' mit der Datenlänge zu tun? 4. Mit dem fehlenden Code '...' ist es schwer zu sagen, wofür der bereitgestellte Code ist. 5. Der Variablenname 'diff' ist nicht sehr beschreibend hinsichtlich seiner Funktion. – zaph

Antwort

1

Ihre dataPtr ist im Stapel zugeordnet, der immer eine bestimmte Grenze hat. Wenn Sie mit großen Brocken von Speicher zu tun haben, dann verwenden Sie Heap statt:

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

und vergessen Sie nicht, es zu befreien später

0

Wenn diff <= 0newSize ist 0 so wird kein Speicher dataPtr aqllocated werden: char dataPtr[newSize]; so wird die memcpy abstürzen.