美文网首页
iOS 数据加密(3DES/CBC/PKCS5Padding)

iOS 数据加密(3DES/CBC/PKCS5Padding)

作者: 骑马纵天下 | 来源:发表于2021-05-06 15:02 被阅读0次
    • 3DES(或称为Triple DES)是DES加密算法的一种模式、是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块(先将数据分成固定长度的小数据块,之后进行加密)应用三次DES加密算法。由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。它使用3条56位的密钥对数据进行三次加密。数据加密标准(DES)是美国的一种由来已久的加密标准,它使用对称密钥加密法,并于1981年被ANSI组织规范为ANSI X.3.92。DES使用56位密钥和密码块的方法,而在密码块的方法中,文本被分成64位大小的文本块然后再进行加密。比起最初的DES,3DES更为安全。简单的理解就是对DES加密三次,通过增加DES的密钥长度来避免暴力破解。

    • iOS 7后苹果增加了 CCCrypt函数不需要引入第三方,直接引入 #import <CommonCrypto/CommonCryptor.h>就可以使用3DES加密。

    • 使用加密我们主要关注加密模式和填充方式,至于密码和偏移量一般后台会给。下文使用的是3DES算法加密,CBC加密模式和PKCS5Padding填充方式。

    //密匙 key
    
    #define gkey            @"loprdkldloprdkldloprdkld"
    
    //偏移量
    
    #define gIv             @“12345678"
    
    #import <CommonCrypto/CommonCryptor.h>
    
    //十六进制
    + (NSString *)doEncryptHex:(NSString *)originalStr{
        //把string 转NSData
        NSData* data = [originalStr dataUsingEncoding:NSUTF8StringEncoding];
        //length
        size_t plainTextBufferSize = [data length];
        
        const void *vplainText = (const void *)[data bytes];
        
        CCCryptorStatus ccStatus;
        uint8_t *bufferPtr = NULL;
        size_t bufferPtrSize = 0;
        size_t movedBytes = 0;
        
        bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);
        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];
        //配置CCCrypt
        ccStatus = CCCrypt(kCCEncrypt,
                           kCCAlgorithm3DES, //使用3DES加密算法
                           kCCOptionPKCS7Padding, //设置填充模式
                           vkey,    //key 此处key的长度 和下面参数指定的长度要相同
                           kCCKeySize3DES,//key的长度为24位,所以  vkey必须是24位长度
                           vinitVec,     //偏移量,这里不用,设置为nil;不用的话,必须为nil,不可以为@“” ECB模式不用设置偏移量
                           vplainText,
                           plainTextBufferSize,
                           (void *)bufferPtr,
                           bufferPtrSize,
                           &movedBytes);
        NSMutableString *hexString = [[NSMutableString alloc] init];
    
    
        if (ccStatus == kCCSuccess) {
            NSData *myData = [NSData dataWithBytes:(const char *)bufferPtr length:(NSUInteger)movedBytes];
    //        NSString *result = [GTMBase64 stringByEncodingData:myData];//或者输出为base64
            NSUInteger          len = [myData length];
            char *              chars = (char *)[myData bytes];
            for(NSUInteger i = 0; i < len; i++ ){
                [hexString appendString:[NSString stringWithFormat:@"%0.2hhx", chars[i]]];
            }
        }    
        return hexString;  
    }
    

    CCCrypt函数参数解析

    • 第一个参数(kCCEncrypt)告诉程序是加密还是解密

    • 第二个参数(kCCAlgorithm3DES)告诉程序使用的是3DES加密算法。

    • 第三个参数设置的是填充模式,其中kCCOptionPKCS7Padding对应于CBC使用PKCS7Padding的填充模式进行加密,kCCOptionPKCS7Padding | kCCOptionECBMode表示运用了ECB加密模式。

    • 第四个参数(vkey)秘钥

    • 第五个参数(kCCKeySize3DES)指定秘钥的长度,这个值和第二个加密方式对应的kCCAlgorithm3DES对应的就是24位的kCCKeySize3DES。如果是kCCAlgorithmDES则对应8位的kCCKeySizeDES,以此类推。可以直接点进函数看看。

    • 第六个设置偏移量

    • 第七个是要加密的值

    • 第八个是要加密的值长度

    • 在线加密解密测试网站 http://tool.chacuo.net/crypt3des/

    相关文章

      网友评论

          本文标题:iOS 数据加密(3DES/CBC/PKCS5Padding)

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