Objective-C расшифровывает шестнадцатеричную строку AES 128 cbc
Я разрабатываю приложение для iPhone на Snow Leopard с Xcode 3.1, которое получает от успокоительного веб-сервиса зашифрованный текст в шестнадцатеричном формате с алгоритмом AES 128-bit (CBC). Алгоритм использует вектор инициализации + секретный ключ. Как мне расшифровать этот текст? Спасибо всем за советы, которые мне удастся дать.
РЕДАКТИРОВАТЬ: Я получаю ответ от REST Server в шестнадцатеричном и зашифрованном формате, я пытаюсь с этим кодом, но я всегда получаю ошибку неправильного параметра. Можете ли вы помочь мне найти ошибку? Возможно ли, чтобы я сначала преобразовал строковый ответ в двоичный формат?
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);
Эта функция работает для меня .. большое спасибо.
РЕДАКТИРОВАТЬ 23 МАРТА ------
Теперь система работает с 16-байтовым размером ключа. Теперь у меня есть вопрос, что я могу сделать, чтобы реализовать размер ключа 32 байта? Огромное спасибо.