我是新來的Objective-C,不過我是個有經驗的開發人員(C#),但我不知道這一點:Objective-C的RC4解密
我有一個字符串,它是RC4加密,我需要在iPad(iOS 5.0)上使用Objective-C對其進行解密。我已經在網絡上看到了一個可行的例子,但是沒有找到能夠端到端運行的例子。下面的代碼不僅不會正確地返回解密的字符串,而且每次執行時都會返回不同的內容,這使得我的指針正在某處發佈。
注:我不知道它的問題,但使用http://archive.plugins.jquery.com/project/RC4字符串進行加密,然後文本在一個SQLite數據庫,我現在從Objective-C的(我知道訪問存儲,架構聽起來凌亂,但我不能改變,在這一點)
我使用的是(所採取的代碼RC4 encryption - CommonCrypto (Objective-C) vs 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;
}
我改變了密鑰大小是keyLength,但我不認爲它甚至使用kCBlockSize3DES因爲RC4不使用塊。我不認爲這兩者都能解釋爲什麼我每次都得到不同的答案(編碼也不會影響這個答案)。還有其他建議嗎?你有一套可以嘗試的代碼嗎? – 2012-01-11 20:59:15