今天做項目,需要進行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==
所以,選擇合適的加密算法、秘鑰長度、以及秘鑰 是非常重要的搭配,搭配不好 就加密錯誤!!