DES是一种分组数据加密技术(先将数据分成固定长度的小数据块,之后进行加密),速度较快,适用于大量数据加密 。3DES是一种基于DES的加密算法,使用3个不同密匙对同一个分组数据块进行3次加密,如此以使得密文强度更高。
相较于DES和3DES算法而言,AES算法有着更高的速度和资源使用效率,安全级别也较之更高了,被称为下一代加密标准。
用法详解
- (id)responseObject {
[self.lock lock];
if (!_responseObject && [self isFinished] && !self.error) {
NSError *error = nil;
//af返回数据解密的地方
if([self.responseSerializer isKindOfClass:[AFImageResponseSerializer class]]){
self.responseObject = [self.responseSerializer responseObjectForResponse:self.response data:self.responseData error:&error];
}else{
self.responseObject = [self.responseSerializer responseObjectForResponse:self.response data:[DES3Util decryptsData:self.responseData] error:&error];
}
if (error) {
self.responseSerializationError = error;
}
}
[self.lock unlock];
return _responseObject;
}
其中这部分的代码 用于接收数据的解密
self.responseObject=[self.responseSerializer responseObjectForResponse:self.response data:[DES3Util decryptsData:self.responseData] error:&error];
DES3Util.m 贴部分代码 :
+ (NSString*)decrypt:(NSString*)encryptText {
+ NSData *encryptData = [GTMBase64 decodeData:[encryptText dataUsingEncoding:NSUTF8StringEncoding]];
size_t plainTextBufferSize = [encryptData length];
const void *vplainText = [encryptData bytes];
CCCryptorStatus ccStatus;
uint8_t *bufferPtr = NULL;
size_t bufferPtrSize = 0;
size_t movedBytes = 0;
//C语言 分配内存方法 malloc()
bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));
memset((void *)bufferPtr, 0x0, bufferPtrSize);
const void *vkey = (const void *) [gkey UTF8String];
const void *vinitVec = (const void *) [gIv UTF8String];
ccStatus = CCCrypt(kCCDecrypt,
kCCAlgorithm3DES,
kCCOptionPKCS7Padding,
vkey,
kCCKeySize3DES,
vinitVec,
vplainText,
plainTextBufferSize,
(void *)bufferPtr,
bufferPtrSize,
&movedBytes);
NSString *result = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)bufferPtr
length:(NSUInteger)movedBytes] encoding:NSUTF8StringEncoding];
//C语言 释放内存方法 free()
free(bufferPtr);
return result;
}
开发经验
曾经在项目中使用了捕捉Crash的第三方统计,发现在解密中会出现Crash。而且非能重现。后经过使用Xcode 的intruments 中的Leaks 查出
//C语言 分配内存方法 malloc()
bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));
存在内存泄露 ,没有释放。所以当用户操作频繁数据,数据累计一定量的时候,就会产生内存满载而Crash的情况。()
只要使用这句 free(bufferPtr); 释放即可
Github DES工具类(https://github.com/xinGGG/DES_Demo)