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

在此崩潰: 新尺寸= 800016 命令datasize = 800001AES128 memcry()碰撞

當我使memcry(),but if the data is smaller爲NSData的AES128加密(800001個字節),崩潰,它的工作正常

有人能幫助我嗎?

+4

這看起來像objective-C不是C.請使用正確的標記。另外,代碼調試問題應該包含[mcve]。 – kaylum

+0

1.你想用'diff'和'kCCKeySizeAES128'完成什麼? 2.如果'diff <= 0''newSize'是'0',這不是你想要的。 3.「kCCKeySizeAES128」與數據長度有什麼關係? 4.缺少代碼'...'很難告訴所有提供的代碼。 5.變量名稱'diff'在功能上不是很具描述性。 – zaph

回答

1

您的dataPtr被分配在總是有一定限制的堆棧中。如果你正在處理的內存大塊,然後用堆來代替:

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

,不要忘記釋放它以後

0

如果diff <= 0newSize0所以沒有將內存aqllocated到dataPtrchar dataPtr[newSize];所以memcpy會崩潰。