今天在做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;
}