Я новичок в Objective-C, но я опытный разработчик (С#), но я не могу понять это:
У меня есть строка, зашифрованная RC4, и мне нужно расшифровать ее с помощью Objective-C на iPad (iOS 5.0). Я просмотрел всю сеть в поисках рабочего примера, но мне не удалось найти пример, который работает от начала до конца. Приведенный ниже код не только не возвращает правильно расшифрованную строку, но и возвращает что-то другое при каждом выполнении, что заставляет меня думать, что указатель где-то высвобождается.
Примечание. Не знаю, имеет ли это значение, но строка была зашифрована с помощью http://archive.plugins.jquery.com/project/RC4, а затем сохранен в виде текста в базе данных Sqlite, к которой я сейчас обращаюсь из Objective-C (знаю, архитектура звучит беспорядочно, но я не могу изменить это в данный момент.)
Используемый мной код (взято из шифрование RC4 - CommonCrypto (Objective-C) против PHP):
+ (NSString*)decryptData:(NSData*) dataToDecrypt
{
const void *vplainText;
size_t plainTextBufferSize;
plainTextBufferSize = [dataToDecrypt length];
vplainText = [dataToDecrypt bytes];
CCCryptorStatus ccStatus;
uint8_t *bufferPtr = NULL;
size_t bufferPtrSize = 0;
size_t movedBytes = 0;
bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);
bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));
memset((void *)bufferPtr, 0x0, bufferPtrSize);
NSString *key = @"theKeyIUsedtoEncryptInTheFirstPlace";
const void *vkey = (const void *) [key UTF8String];
size_t keyLength = [[key dataUsingEncoding:NSUTF8StringEncoding] length];
ccStatus = CCCrypt(kCCDecrypt,
kCCAlgorithmRC4,
0,
vkey,
kCCKeySizeDES,
nil,
vplainText,
plainTextBufferSize,
(void *)bufferPtr,
bufferPtrSize,
&movedBytes);
if (ccStatus == kCCSuccess) NSLog(@"SUCCESS");
/*else*/ 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];
NSLog(@"%@", result);
return result;
}