我是新来的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