• 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==


    所以,选择合适的加密算法、秘钥长度、以及秘钥 是非常重要的搭配,搭配不好 就加密错误!!
  • 相关阅读:
    Autofac小例子
    Spring自带mock测试Controller
    [转载]转Java 几个memcached 连接客户端对比 选择
    danga的MemcachedClient的几个缺陷
    linux查看memcached状态
    Linux下配置安装PHP环境(Apache2)
    使用memcache.php监控memcached
    memcached运行情况监测
    memcached监控的几种方法(nagios等)
    xmemcached使用的几点优化建议
  • 原文地址:https://www.cnblogs.com/niit-soft-518/p/6022893.html
Copyright © 2020-2023  润新知