第八个参数:dataOut:
处理后的结果回传给此参数。
注意,此值必须能放下输出的结果,否则函数调用失败。
第9个参数:size_t dataOutAvailable
指第九个参数void *dataOut的长度。
注意:必须和第9个参数的实际长度一致。c语言不能由指针求出长度,所以必须指定长度。
按网上的很多例子,如下,使用1024的固定值,在输出结果大于1024字节时会失败:
unsigned char buffer[1024];
memset(buffer, 0, sizeof(char));
size_t numBytesDecrypted = 0;
开发时虽然觉得此处用一个固定值感觉有不妥,
但以为会想oc的数组一样,在内容超出时会自动扩容。
因为测试时测试数据都很短,没有问题,结果上线以后就悲剧了。
下面是DES解密时,dataOut长度的计算:
+(NSString *)decryptUseDESWithKey:(NSString*)key encryptedStr:(NSString*)encryptedStr{
NSData *cipherKeyData = [[NSData alloc] initWithBase64EncodedString:key options:0];
NSData *cipherData = [[NSData alloc] initWithBase64EncodedString:encryptedStr options:0];
//求buffer的长度,buffer必须能容下解密后的数据,否则解密会失败。
NSUInteger dataLength = [cipherData length];
unsigned long bufferPtrSize = (dataLength + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);
unsigned char buffer[bufferPtrSize];
memset(buffer, 0, sizeof(char));
size_t numBytesDecrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
kCCAlgorithmDES,
kCCOptionPKCS7Padding | kCCOptionECBMode,
[cipherKeyData bytes],
kCCKeySizeDES,
NULL,
[cipherData bytes],
[cipherData length],
buffer,
bufferPtrSize,
&numBytesDecrypted);
NSString* plainText = nil;
if (cryptStatus == kCCSuccess) {
NSData* data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesDecrypted];
plainText = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}
return plainText;
}