Я новичок в Objective-C, но я опытный разработчик (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;
}