2017-02-23 9 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()のクラッシュこのクラッシュで

私はNSDataの(800001バイト)memcryで、クラッシュ()、but if the data is smallerためのAES128の暗号化を行うと、それが動作通常

誰かが私を助けてくれますか?

+4

これはobjective-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); 

newSize0ので、何のメモリがdataPtrにaqllocatedませんですdiff <= 0場合は、後で

0

それを解放することを忘れないでください:char dataPtr[newSize];memcpyはクラッシュします。