我開發的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字節的密鑰大小?非常感謝。
我是新手,我如何初始化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
這是一個C級的API,你可以在所有地方混合使用對象類型和枚舉。我已經在上面添加了一個示例。如果你想知道應該給出什麼類型的參數,只需按住Cmd鍵並單擊函數名稱即可轉到頭文件,並在參數類型上執行相同操作以查看選項。現在可以使用16字節密鑰大小的 – Tark 2012-03-13 14:26:16
。我能做些什麼來使用32字節的密鑰大小? – pasqui86 2012-03-23 10:59:23