2017-02-23 84 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会崩溃。