美文网首页
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