Расшифровка 3DES ECB с ключом MD5 на iOS - PullRequest
3 голосов
/ 20 января 2011

Я пытаюсь расшифровать данные с сервера .NET в приложении для iOS.Данные были зашифрованы с помощью 3DES в режиме ECB.Мне удалось успешно расшифровать эти же данные на Android, но на IOS я просто продолжаю получать мусор.

Я сравнил зашифрованные байты и байты обработанного ключа между iOS и Android, и они кажутся одинаковыми (хотя мне пришлось преобразовать подписанные байты Java в шестнадцатеричное представление, чтобы можно было сравнить с отладчик xcode ).Однако криптообъекты Java находятся на более высоком уровне, чем Common Crypto, поэтому я не уверен, что правильно подготовил ключ.Пожалуйста, взгляните на следующий код - любые отзывы приветствуются.

//read the encrypted data from file into NSData
NSString *servicesPath = [NSString stringWithString:[[AppMobiDelegate applicationDocumentsDirectory] stringByAppendingPathComponent:@"services.xml"]];
NSData *servicesData = [NSData dataWithContentsOfFile:servicesPath];

//setup crypto objects
const void *vEncryptedText = [servicesData bytes];
size_t encryptedTextBufferSize = [servicesData length];
CCCryptorStatus ccStatus;
uint8_t *bufferPtr = NULL;
size_t bufferPtrSize = 0;
size_t movedBytes = 0;
bufferPtrSize = (encryptedTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);
bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));
memset((void *)bufferPtr, 0x0, bufferPtrSize);

//get a cstring with key data
const char *cStr = [@"FAKEKEY" cStringUsingEncoding:UTF8String];

//make a 16 byte array to put the md5 digested data into    
unsigned char md5[CC_MD5_DIGEST_LENGTH];
bzero( md5, sizeof(md5) );
CC_MD5( cStr, strlen(cStr), md5 );
//make a 24 byte array so we have correct size for 3des key and copy digest data in
unsigned char key[kCCKeySize3DES];
bzero( key, sizeof(key) );
memcpy(key, md5, sizeof(md5));  

//decrypt data and return string 
ccStatus = CCCrypt(kCCDecrypt,
    kCCAlgorithm3DES,
    kCCOptionECBMode, //kCCOptionPKCS7Padding kCCOptionECBMode
    key, //vKey md5
    kCCKeySize3DES,
    NULL,
    vEncryptedText,
    encryptedTextBufferSize,
    (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";

NSString *result = [[[NSString alloc] initWithData: [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes] encoding:NSASCIIStringEncoding] autorelease];
return result;
...