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


所以,選擇合適的加密算法、秘鑰長度、以及秘鑰 是非常重要的搭配,搭配不好 就加密錯誤!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM