关于iOS DES加密及其Crash

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值