ios des 加密長度的坑

今天在做des加密的時候,在網(wǎng)上找到這段代碼 挺好用的,demo測試沒什么問題

//加密
-(NSString *)encryptUseDES:(NSString *)plainText andKey:(NSString *)authKey{
    const void *iv  = (const void *) [@"12345678" UTF8String];
    
    NSString *ciphertext = nil;
    
    NSData *textData = [plainText dataUsingEncoding:NSUTF8StringEncoding];
    NSUInteger dataLength = [textData length];
    NSInteger bufferLength = (dataLength/1024 +1)*1024;
    unsigned char buffer[bufferLength];
    memset(buffer, 0, sizeof(char) * bufferLength);
    size_t numBytesEncrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
                                          kCCAlgorithmDES,
                                          kCCOptionPKCS7Padding,
                                          [authKey UTF8String],
                                          kCCKeySizeDES,
                                          iv,
                                          [textData bytes],
                                          dataLength,
                                          buffer,
                                          bufferLength,
                                          &numBytesEncrypted);
    if (cryptStatus == kCCSuccess) {
        NSData *data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted];
        ciphertext = [data base64EncodedStringWithOptions:0];
    }
    return ciphertext;
}

但是當(dāng)我們加密長度大于1M的數(shù)據(jù)時 直接崩潰了


image.png

于是查詢出來問題出在這里 創(chuàng)建的buffer 無法在內(nèi)存中分配到足夠大的內(nèi)存

unsigned char buffer[bufferLength];

在大神的指點下?lián)Q了一個分配方式解決了問題

    unsigned char * buffer = (unsigned  char *)malloc(bufferLength);
    memset(buffer, 0, sizeof(char) * bufferLength);

記得最后釋放內(nèi)存

   free(buffer);

完整代碼如下

//加密
-(NSString *)encryptUseDES:(NSString *)plainText andKey:(NSString *)authKey{
    const void *iv  = (const void *) [@"12345678" UTF8String];
    
    NSString *ciphertext = nil;
    
    NSData *textData = [plainText dataUsingEncoding:NSUTF8StringEncoding];
    
    NSUInteger dataLength = [textData length];
    NSInteger bufferLength = (dataLength/1024 +1)*1024;
    //    unsigned char buffer[bufferLength];
    
    unsigned char * buffer = (unsigned  char *)malloc(bufferLength);
    memset(buffer, 0, sizeof(char) * bufferLength);
    size_t numBytesEncrypted = 0;
    
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
                                          kCCAlgorithmDES,
                                          kCCOptionPKCS7Padding,
                                          [authKey UTF8String],
                                          kCCKeySizeDES,
                                          iv,
                                          [textData bytes],
                                          dataLength,
                                          buffer,
                                          bufferLength,
                                          &numBytesEncrypted);
    if (cryptStatus == kCCSuccess) {
        NSData *data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted];
        ciphertext = [data base64EncodedStringWithOptions:0];
    }
    free(buffer);
    return ciphertext;
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容