zoukankan      html  css  js  c++  java
  • 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==


    所以,选择合适的加密算法、秘钥长度、以及秘钥 是非常重要的搭配,搭配不好 就加密错误!!
  • 相关阅读:
    C#函数式编程
    三种观察者模式的C#实现
    使用C#设计Fluent Interface
    02.Python网络爬虫第二弹《http和https协议》
    03.Python网络爬虫第一弹《Python网络爬虫相关基础概念》
    第七章:Python基础のXML操作和面向对象(一)
    第五章:Python基础の生成器、迭代器、序列化和虚拟环境的应用
    第六章:Python基础の反射与常用模块解密
    第四章:Python基础の快速认识內置函数和操作实战
    第三章:Python基础の函数和文件操作实战
  • 原文地址:https://www.cnblogs.com/niit-soft-518/p/6022893.html
Copyright © 2011-2022 走看看