2012-03-13 147 views
2

我開發的iPhone上雪豹在Xcode 3.1從RESTful Web服務接收十六進制格式的算法AES 128位(CBC)加密文本的應用程序。該算法使用初始化向量+祕密密鑰。我如何解密這段文字?感謝大家提供的成功提示。Objective-C的解密AES 128 CBC十六進制字符串

編輯: 我從REST服務器以十六進制和加密格式獲得響應,我嘗試使用此代碼,但我總是收到錯誤的參數錯誤。你能幫我找到錯誤嗎? 是否有可能我首先將字符串響應轉換爲二進制格式?

 NSString *response = [request responseString]; 

     NSData *encryptedData = [response dataUsingEncoding: NSASCIIStringEncoding]; 
     NSString *key = @"32charlength"; 
     NSString *iv = @"16charlength"; 
     NSData *unencryptedData = NULL; 
     size_t unencryptedLength = [unencryptedData length]; 
     CCCryptorStatus ccStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, 0, key, kCCKeySizeAES128, iv, [encryptedData bytes], [encryptedData length], unencryptedData, [encryptedData length], &unencryptedLength);  
     NSString *output = [[NSString alloc] initWithBytes:unencryptedData length:unencryptedLength encoding:NSUTF8StringEncoding]; 

     if (ccStatus == kCCSuccess) risultato.text = @"SUCCESS"; 
     else if (ccStatus == kCCParamError) risultato.text = @"BAD PARAM"; 
     else if (ccStatus == kCCBufferTooSmall) risultato.text = @"BUFFER TOO SMALL"; 
     else if (ccStatus == kCCMemoryFailure) risultato.text = @"MEMORY FAILURE"; 
     else if (ccStatus == kCCAlignmentError) risultato.text = @"ALIGNMENT"; 
     else if (ccStatus == kCCDecodeError) risultato.text = @"DECODE ERROR"; 
     else if (ccStatus == kCCUnimplemented) risultato.text = @"UNIMPLEMENTED"; 

EDIT2: 這個函數返回BAD PARAM因爲沒有合適緩衝區大小,其中分配解密數據。我編輯在這個工作方式的功能:

 NSData *encryptedData = [response dataUsingEncoding: NSASCIIStringEncoding]; 
     const void *key = @"32charlength; 
     uint8_t *iv  = @"16charlength"; 
     char buffer[4*4096]; 
     memset(buffer, '\0', sizeof(buffer)); 
       size_t size = sizeof(buffer); 
     CCCryptorStatus ccStatus = CCCrypt(kCCDecrypt, 
             kCCAlgorithmAES128, 
             0, 
             key, 
             kCCKeySizeAES128, 
             iv, 
             [encryptedData bytes], 
             [encryptedData length], 
             buffer, 
             sizeof(buffer), 
             &size); 

這個功能爲我工作..非常感謝。

編輯3月23日------

目前,該系統的工作形成我16字節的密鑰大小。現在我有一個問題,我能做些什麼來實現32字節的密鑰大小?非常感謝。

回答

2

這是可能的使用包括在<CommonCrypto/CommonCryptor.h>頭中的CCCryptor功能。檢查man CCCryptor的血淋淋的細節,你的情況,它聽起來就像你可以使用一個調用CCCrypt()接收到的數據進行解碼:

CCCryptorStatus 
CCCrypt(CCOperation op, CCAlgorithm alg, CCOptions options, const void *key, size_t keyLength, 
    const void *iv, const void *dataIn, size_t dataInLength, void *dataOut, size_t dataOutAvailable, 
    size_t *dataOutMoved); 

假設你要解密的數據NSData *encryptedData你可以嘗試這樣的:

char * key = "shouldbe16chars."; 
NSUInteger dataLength = [encryptedData length]; 
uint8_t unencryptedData[dataLength + kCCKeySizeAES128]; 
size_t unencryptedLength; 

CCCrypt(kCCDecrypt, kCCAlgorithmAES128, 0, key, kCCKeySizeAES128, NULL, [encryptedData bytes], dataLength, unencryptedData, dataLength, &unencryptedLength); 
NSString *output = [[NSString alloc] initWithBytes:unencryptedData length:unencryptedLength encoding:NSUTF8StringEncoding]; 

這是未經測試,請務必檢查的CCCrypt返回值的錯誤。檢查頭文件的細節,它是有據可查的。

+0

我是新手,我如何初始化var?我試試這個: NSString * hex = [NSString stringWithFormat:@「%@」,response]; CCOperation * op =「decrypt」; CCAlgorithm * alg = @「AES」; CCOptions * options = NULL; const void * key =「xxxx」; size_t * keyLength = [密鑰長度]; const void * iv = @「xxxxxxxx-x-xxxxx」; size_t dataInLength = [hex length]; void * dataOut = response; size_t dataOutAvailable = 10000; size_t * dataOutMoved = NULL; CCCrypt(op,alg,options,key,keyLength,iv,hex,dataInLength,dataOut,dataOutAvailable,dataOutMoved); – pasqui86 2012-03-13 13:58:13

+0

這是一個C級的API,你可以在所有地方混合使用對象類型和枚舉。我已經在上面添加了一個示例。如果你想知道應該給出什麼類型的參數,只需按住Cmd鍵並單擊函數名稱即可轉到頭文件,並在參數類型上執行相同操作以查看選項。現在可以使用16字節密鑰大小的 – Tark 2012-03-13 14:26:16

+0

。我能做些什麼來使用32字節的密鑰大小? – pasqui86 2012-03-23 10:59:23