2014-12-04 8 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 байтов в ключ и соедините их до конца ключа, чтобы вы создали эквивалентный 24-байтовый ключ 3DES ABC для вашего ключа 2DES ABA. –

+0

Привет? Это работает? У меня нет времени выполнения IOS здесь ... –

+0

Мы зафиксировали длину ключа, но у меня все еще есть проблема – tester777

ответ

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-байтовыми ключами? –

+0

Мы не зафиксировали длину ключа до 24 байтов - я объяснил это в комментарии выше – tester777

+0

Хорошо, после комментария не был уверен. Рад, что вы решили, что я помог вам туда добраться. –