AES128 memcry()崩溃

时间:2017-02-23 01:29:37

标签: ios objective-c c

- (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 = 800001

当我为NSData(800001字节)进行AES128加密时,在memcry(),but if the data is smaller中崩溃,它正常工作

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

你的dataPtr被分配在堆栈中,总是有一定的限制。如果你正在处理大块内存,那么请改用堆:

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

并且不要忘记稍后释放

答案 1 :(得分:0)

如果diff <= 0 newSize0,则不会将内存分配给dataPtrchar dataPtr[newSize];,以便memcpy崩溃。