ios 3DES шифрование/дешифрование CBC

Мне нужна помощь с расшифровкой 3DES. Я создал некоторый код для расшифровки, но не могу заставить его работать как надо. Это первый раз, когда я играю с шифрованием, и я не знаю, что именно я здесь делаю неправильно.

Я получаю ключ для расшифровки с сервера (это пример значения ключа: 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;
}

-- РЕДАКТИРОВАТЬ --- это вывод, который я получаю от метода:

bufferPtr: Ã’ ÕÏÁU

--- РЕДАКТИРОВАТЬ 2 ----- Я установил длину ключа на 24 байта, но теперь конечным результатом является пустая строка


person tester777    schedule 04.12.2014    source источник
comment
Может есть вариант kCCKeySize2DES ? Ваш ключ имеет размер 16 байт. В противном случае скопируйте первые 8 байтов в ключ и объедините их в конец ключа, чтобы создать эквивалентный 24-байтовый ключ 3DES ABC для вашего ключа 2DES ABA.   -  person Maarten Bodewes    schedule 04.12.2014
comment
Привет? Это работает? У меня нет среды выполнения IOS здесь...   -  person Maarten Bodewes    schedule 04.12.2014
comment
Мы исправили длину ключа, но у меня все еще есть проблема   -  person tester777    schedule 05.12.2014
comment
Не могли бы вы распечатать ввод и вывод в шестнадцатеричном формате? Как должен выглядеть вывод?   -  person Maarten Bodewes    schedule 05.12.2014


Ответы (1)


я нашел свою проблему. Именно так я читал ключ.

я создал этот метод для преобразования шестнадцатеричной строки в 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);

Извините за потраченное время :)

person tester777    schedule 05.12.2014
comment
Нет, мы установили длину ключа на 24 байта — я объяснил это в комментарии выше. - person tester777; 09.12.2014
comment
Хорошо, не был уверен после комментария. Рад, что вы решили эту проблему, надеюсь, я помог вам добраться туда. - person Maarten Bodewes; 09.12.2014