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


    所以,选择合适的加密算法、秘钥长度、以及秘钥 是非常重要的搭配,搭配不好 就加密错误!!
  • 相关阅读:
    git 忽略文件夹权限
    文字特效-shine.js-阴影随动
    微信小程序scroll-view中的坑(因为动态设置高度导致无法下拉)
    gitlab 403 forbidden 报错解决
    Vue子组件调用父组件的方法
    github的小笔记
    windows win10 重装系统 提示不是gpt分区不能安装
    使用html5播放m3u8直播源
    youtube-dl 使用简介
    ABAP RSA 加密
  • 原文地址:https://www.cnblogs.com/niit-soft-518/p/6022893.html
Copyright © 2020-2023  润新知