1.加密三個(gè)參數(shù)千萬(wàn)不要選擇錯(cuò)誤
今天做項(xiàng)目钝吮,需要進(jìn)行3DES加密,引發(fā)了一系列的化學(xué)反應(yīng)埋涧,讓我一直研究這個(gè)加密贴唇,終于發(fā)現(xiàn)其中的蹊蹺,下面所要說(shuō)的注意要點(diǎn)是在3DES,AES,DES等加密中很容易因?yàn)閗ey的長(zhǎng)度而犯下的錯(cuò)誤飞袋!
首先進(jìn)行3DES加密, 加密的gkey(key):abcdefgh? giv:(偏移量)abcdefgh
加密后結(jié)果: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的長(zhǎng)度 和下面參數(shù)指定的長(zhǎng)度要相同
? ? ?kCCKeySize3DES,? ? ? ? ? ? ? //key的長(zhǎng)度為24位链患,所以? vkey必須是24位長(zhǎng)度
? ? ?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;
}
可以看到我代碼中標(biāo)紅的地方:
const void *vkey = (const void *) [[NSString stringWithFormat:@"%@%@%@",gkey,gkey,gkey] UTF8String];
為什么key要重復(fù)三遍巧鸭??麻捻?很重要纲仍! 因?yàn)槟阆旅?指定的參數(shù)
kCCKeySize3DES? 值是24
kCCKeySize3DES ? ? ?= 24,
我們看一下這個(gè)參數(shù)的解釋:
keyLength
Length of key material. Must be appropriate for the select algorithm. Some algorithms may provide for varying key lengths.
反正大概的意思就是 關(guān)鍵字的長(zhǎng)度。必須選擇合適算法贸毕,每一種算法的關(guān)鍵字長(zhǎng)度可能不一樣
所以郑叠,我們選擇了 kCCAlgorithm3DES 這個(gè)算法,這個(gè)算法的長(zhǎng)度是24明棍,你的關(guān)鍵字也必須是24位O绺铩! 這也就是為什么 上面我們要把關(guān)鍵字重復(fù)三遍的原因摊腋。
所以沸版,我們舉一反三,如果使用DES加密兴蒸,我們的算法選擇是 kCCAlgorithmDES, 秘鑰必須是對(duì)應(yīng)的 kCCKeySizeDES 视粮,你的關(guān)鍵字長(zhǎng)度必須是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 *vkey = (const void *) [[NSString stringWithFormat:@"%@%@%@",gkey,gkey,gkey] UTF8String];const void *vinitVec = (const void *) [gIv UTF8String];
ccStatus = CCCrypt(kCCEncrypt,
kCCAlgorithmDES,
kCCOptionPKCS7Padding,
[gkey UTF8String], //8位
kCCKeySizeDES,? ? ? ? ? ? ? //key的長(zhǎng)度橙凳,8位
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;
}
加密后結(jié)果:
p+X985x5bFS6dWjAnm6sdQ==