美文网首页
iOS中3DES加密解密

iOS中3DES加密解密

作者: FlyOceanFish | 来源:发表于2017-09-18 09:38 被阅读162次

    加密

    加密分为对称加密和非对称加密。

    • 对称性加密算法,信息接收双方都需事先知道密匙和加解密算法且其密匙是相同的,之后便是对数据进行 加解密了;
    • 非对称算法与之不同,发送双方A,B事先均生成一堆密匙,然后A将自己的公有密匙发送给B,B将自己的公有密匙发送给A,如果A要给B发送消息,则先需要用B的公有密匙进行消息加密,然后发送给B端,此时B端再用自己的私有密匙进行消息解密,B向A发送消息时为同样的道理。

    对称加密

    对称加密常见的AES、DES、3DES。DES是一种分组数据加密技术(先将数据分成固定长度的小数据块,之后进行加密),速度较快,适用于大量数据加密,而3DES是一种基于DES的加密算法,使用3个不同密匙对同一个分组数据块进行3次加密,如此以使得密文强度更高;AES相比较其他两种具有更高的速度和资源使用效率。

    非对称加密

    非对称加密常见RSA、DSA、ECC。RSA和DSA的安全性及其它各方面性能都差不多,而ECC较之则有着很多的性能优越,包括处理速度,带宽要求,存储空间等等。

    我们采用的是3DES,代码如下:

    #import "DESTools.h"
    #import <CommonCrypto/CommonCrypto.h>
    #import "GTMBase64.h"
    #import "GTMDefines.h"
    
    //加密解密的key,与后台一致
    #define USER_KEY @"xxxxxx"
    //初始化向量,与后台一致
    #define initIv    @"xxx"
    
    @implementation DESTools
    
    + (NSString *)encryptWithText:(NSString *)sText
    {
        //kCCEncrypt 加密
        return [self encrypt:sText encryptOrDecrypt:kCCEncrypt key:USER_KEY];
    }
    
    + (NSString *)decryptWithText:(NSString *)sText
    {
        //kCCDecrypt 解密
        return [self encrypt:sText encryptOrDecrypt:kCCDecrypt key:USER_KEY];
    }
    
    + (NSString *)encrypt:(NSString *)sText encryptOrDecrypt:(CCOperation)encryptOperation key:(NSString *)key
    {
        const void *dataIn;
        size_t dataInLength;
        
        if (encryptOperation == kCCDecrypt)//传递过来的是decrypt 解码
        {
            //解码 base64
            NSData *decryptData = [GTMBase64 decodeData:[sText dataUsingEncoding:NSUTF8StringEncoding]];//转成utf-8并decode
            dataInLength = [decryptData length];
            dataIn = [decryptData bytes];
        }
        else  //encrypt
        {
            NSData* encryptData = [sText dataUsingEncoding:NSUTF8StringEncoding];
            dataInLength = [encryptData length];
            dataIn = (const void *)[encryptData bytes];
        }
        
        /*
         DES加密 :用CCCrypt函数加密一下,然后用base64编码下,传过去
         DES解密 :把收到的数据根据base64,decode一下,然后再用CCCrypt函数解密,得到原本的数据
         */
        CCCryptorStatus ccStatus;
        uint8_t *dataOut = NULL; //可以理解位type/typedef 的缩写(有效的维护了代码,比如:一个人用int,一个人用long。最好用typedef来定义)
        size_t dataOutAvailable = 0; //size_t  是操作符sizeof返回的结果类型
        size_t dataOutMoved = 0;
        
        dataOutAvailable = (dataInLength + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);
        dataOut = malloc( dataOutAvailable * sizeof(uint8_t));
        memset((void *)dataOut, 0x0, dataOutAvailable);//将已开辟内存空间buffer的首 1 个字节的值设为值 0
        
        const void *vkey = (const void *) [key UTF8String];
        const void *iv = (const void *) [initIv UTF8String];
        
        //CCCrypt函数 加密/解密
        ccStatus = CCCrypt(encryptOperation,//  加密/解密
                           kCCAlgorithm3DES,//  加密根据哪个标准(des,3des,aes。。。。)
                           kCCOptionPKCS7Padding,//  选项分组密码算法(des:对每块分组加一次密  3DES:对每块分组加三个不同的密)
                           vkey,  //密钥    加密和解密的密钥必须一致
                           kCCKeySize3DES,//   DES 密钥的大小(kCCKeySizeDES=8)
                           iv, //  可选的初始矢量
                           dataIn, // 数据的存储单元
                           dataInLength,// 数据的大小
                           (void *)dataOut,// 用于返回数据
                           dataOutAvailable,
                           &dataOutMoved);
        
        NSString *result = nil;
        
        if (encryptOperation == kCCDecrypt)//encryptOperation==1  解码
        {
            //得到解密出来的data数据,改变为utf-8的字符串
            result = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)dataOut length:(NSUInteger)dataOutMoved] encoding:NSUTF8StringEncoding] ;
        }
        else //encryptOperation==0  (加密过程中,把加好密的数据转成base64的)
        {
            //编码 base64
            NSData *data = [NSData dataWithBytes:(const void *)dataOut length:(NSUInteger)dataOutMoved];
            result = [GTMBase64 stringByEncodingData:data];
        }
        
        return result;
    }
    @end
    
    

    相关文章

      网友评论

          本文标题:iOS中3DES加密解密

          本文链接:https://www.haomeiwen.com/subject/zcpvsxtx.html