2014-12-04 115 views
0

我需要一些關於此3DES解密的幫助。我已經創建了一些解密代碼,但我不能讓它按照原樣工作。這是我第一次使用加密技術,我不知道我到底在做什麼。ios 3DES加密/解密CBC

我收到服務器解密的密鑰(這是密鑰的示例值:0F7BC98767FF9A01F2B2AD1CD644AD33 - 它是隨機生成的字節的十六進制表示)。

這是我使用來解密該消息的方法:

-(NSString*)doCipher:(NSString*)message key:(NSString*)key operation:(CCOperation)encryptOrDecrypt { 

const void *messageData; 
size_t messageBufferSize; 

if (encryptOrDecrypt == kCCDecrypt){ 
    NSData *messageEncryptData= [NSData dataWithBase64EncodedString:message]; 
    messageBufferSize= [messageEncryptData length]; 
    messageData= [messageEncryptData bytes]; 
} 
else{ 
    messageBufferSize= message.length; 
    messageData = [[[message dataUsingEncoding: NSUTF8StringEncoding]mutableCopy] bytes]; 
} 

CCCryptorStatus ccStatus; 
uint8_t *bufferPtr = NULL; 
size_t bufferPtrSize = 0; 
size_t movedBytes = 0; 

bufferPtrSize = (messageBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1); 
bufferPtr = malloc(bufferPtrSize * sizeof(uint8_t)); 
memset((void *)bufferPtr, 0x0, bufferPtrSize); 

uint8_t iv[kCCBlockSize3DES]; 
memset((void *) iv, 0x0, (size_t) sizeof(iv)); 



NSData *keyData = [[key dataUsingEncoding:NSUTF8StringEncoding]mutableCopy]; 

ccStatus = CCCrypt(encryptOrDecrypt, 
        kCCAlgorithm3DES, 
        kCCOptionPKCS7Padding & kCCModeCBC, 
        (const void *)[keyData bytes], 
        kCCKeySize3DES, 
        iv, 
        messageData, 
        messageBufferSize, 
        (void *)bufferPtr, 
        bufferPtrSize, 
        &movedBytes); 

if (ccStatus == kCCParamError) return @"PARAM ERROR"; 
else if (ccStatus == kCCBufferTooSmall) return @"BUFFER TOO SMALL"; 
else if (ccStatus == kCCMemoryFailure) return @"MEMORY FAILURE"; 
else if (ccStatus == kCCAlignmentError) return @"ALIGNMENT"; 
else if (ccStatus == kCCDecodeError) return @"DECODE ERROR"; 
else if (ccStatus == kCCUnimplemented) return @"UNIMPLEMENTED"; 

NSLog(@"bufferPtr: %s", bufferPtr); 

NSString *s = [[NSString alloc] initWithFormat:@"%s", bufferPtr]; 
return s; 
} 

- EDIT --- 這是我從該方法得到的輸出:

bufferPtr:A」ÕÏÁU

--- EDIT 2 ----- 我固定密鑰長度爲24字節長,但現在的最終結果是空字符串

+2

是否有一個選項'kCCKeySize2DES'?您的密鑰大小爲16個字節。否則,將前8個字節複製到密鑰並將它們連接到密鑰的末尾,以便爲您的2DES ABA密鑰創建了等效的24字節3DES ABC密鑰。 – 2014-12-04 16:01:26

+0

你好?這是否工作?我在這裏沒有IOS運行時間... – 2014-12-04 19:51:54

+0

我們修復了密鑰長度,但是我仍然遇到問題 – tester777 2014-12-05 08:23:09

回答

2

我發現我的問題。這是我讀關鍵的方式。

我創造了這個方法十六進制字符串轉換爲NSData的:

+ (NSData *)dataFromHexString: (NSString *) hex { 
const char *chars = [hex UTF8String]; 
int i = 0, len = hex.length; 

NSMutableData *data = [NSMutableData dataWithCapacity:len/2]; 
char byteChars[3] = {'\0','\0','\0'}; 
unsigned long wholeByte; 

while (i < len) { 
    byteChars[0] = chars[i++]; 
    byteChars[1] = chars[i++]; 
    wholeByte = strtoul(byteChars, NULL, 16); 
    [data appendBytes:&wholeByte length:1]; 
} 

return data; 
} 

那麼這就是我如何設法解密該死的東西:

NSData *keyData = [Utilities dataFromHexString:key]; 

ccStatus = CCCrypt(encryptOrDecrypt, 
        kCCAlgorithm3DES, 
        kCCOptionPKCS7Padding, 
        [keyData bytes], 
        [keyData length], 
        iv, 
        messageData, 
        messageBufferSize, 
        (void *)bufferPtr, 
        bufferPtrSize, 
        &movedBytes); 

對不起,浪費你的時間:)

+0

所以庫確實處理了16個字節的密鑰? – 2014-12-07 14:00:57

+0

不,我們將密鑰長度固定爲24個字節 - 我在上面的註釋中解釋了這個以上的評論, – tester777 2014-12-09 07:39:28

+0

確定,評論後不確定。很高興你解決了問題,我希望我能幫你達到目標。 – 2014-12-09 08:36:59