iOS 3DES DES AES加密注意事项!!很重要,否则会加密失败

今天做项目,需要进行3des加密。 加密的gkey:abcdefgh   giv:(偏移量)abcdefgh  

加密后结果:p+X985x5bFS6dWjAnm6sdQ==

下面是代码:

+(NSString *)DES3StringFromText:(NSString *)text{
    
    const void *vplainText;
    size_t plainTextBufferSize;
    
    NSData* data = [text dataUsingEncoding:NSUTF8StringEncoding];
    plainTextBufferSize = [data length];
    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 *) [[NSString stringWithFormat:@"%@%@%@",gkey,gkey,gkey] UTF8String];
    const void *vinitVec = (const void *) [gIv UTF8String];
    
    ccStatus = CCCrypt(kCCEncrypt,
                       kCCAlgorithm3DES,
                       kCCOptionPKCS7Padding,
                       vkey, //key   此处key的长度 和下面参数指定的长度要相同
                       kCCKeySize3DES,              //key的长度为24位,所以  vkey必须是24位长度
                       vinitVec,
                       vplainText,
                       plainTextBufferSize,
                       (void *)bufferPtr,
                       bufferPtrSize,
                       &movedBytes);
    
    
    NSString *result;
    
    NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
    result = [GTMBase64 stringByEncodingData:myData];
    
    return result;
}

可以看到我代码中标红的地方:

  const void *vkey = (const void *) [[NSString stringWithFormat:@"%@%@%@",gkey,gkey,gkey] UTF8String];

为什么key要重复三遍???很重要! 因为你下面 指定的参数
kCCKeySize3DES  值是24

    kCCKeySize3DES            = 24,

我们看一下这个参数的解释:

keyLength

Length of key material. Must be appropriate for the select algorithm. Some algorithms may provide for varying key lengths.

反正大概的意思就是 关键字的长度。必须选择合适算法,每一种算法的关键字长度可能不一样

所以,我们选择了 kCCAlgorithm3DES 这个算法,这个算法的长度是24,你的关键字也必须是24位!! 这也就是为什么 上面我们要把关键字重复三遍的原因。



所以,我们举一反三,如果使用DES加密,我们的算法选择是 kCCAlgorithmDES, 秘钥必须是对应的 kCCKeySizeDES ,你的关键字长度必须是8位!
代码:
+(NSString *)DES3StringFromText:(NSString *)text{
    
    const void *vplainText;
    size_t plainTextBufferSize;
    
    NSData* data = [text dataUsingEncoding:NSUTF8StringEncoding];
    plainTextBufferSize = [data length];
    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 *vinitVec = (const void *) [gIv UTF8String];
    
    ccStatus = CCCrypt(kCCEncrypt,
                       kCCAlgorithmDES,
                       kCCOptionPKCS7Padding,
                       [gkey UTF8String],  此处key的长度 和下面参数指定的长度要相同
                       kCCKeySizeDES,              //key的长度为24位,所以  vkey必须是24位长度
                       vinitVec,
                       vplainText,
                       plainTextBufferSize,
                       (void *)bufferPtr,
                       bufferPtrSize,
                       &movedBytes);
    
    
    NSString *result;
    
    NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
    result = [GTMBase64 stringByEncodingData:myData];
    
    return result;
}
加密后结果:

p+X985x5bFS6dWjAnm6sdQ==


所以,选择合适的加密算法、秘钥长度、以及秘钥 是非常重要的搭配,搭配不好 就加密错误!!
原文地址:https://www.cnblogs.com/niit-soft-518/p/6022893.html