2012-01-09 97 views
1

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

回答

1

我看到一对夫妇在DES代码(kCCKeySizeDES参考, kCCBlockSize3DES)。这看起来不正确 - 至少,kCCKeySizeDES应该可能替换为keyLength

如果这样不能解决问题,我会接下来看看可能出现的文本编码问题。 SQLite中的数据可能是UTF8编码的二进制数据,在这种情况下,您可能需要通过从UTF8转换为ISO8859-1来“解码”它。

+0

我改变了密钥大小是keyLength,但我不认为它甚至使用kCBlockSize3DES因为RC4不使用块。我不认为这两者都能解释为什么我每次都得到不同的答案(编码也不会影响这个答案)。还有其他建议吗?你有一套可以尝试的代码吗? – 2012-01-11 20:59:15

2

使用此功能进行加密和解密。 (只需再次使用相同的密钥编码的字符串来解码它)。

-(NSString*) rc4Key:(NSString*) key str:(NSString*) str 
{  
    int j = 0; 
    unichar res[str.length]; 
    const unichar* buffer = res; 
    unsigned char s[256]; 
    for (int i = 0; i < 256; i++) 
    { 
     s[i] = i; 
    } 
    for (int i = 0; i < 256; i++) 
    { 
     j = (j + s[i] + [key characterAtIndex:(i % key.length)]) % 256; 

     swap(s[i], s[j]); 
    } 

    int i = j = 0; 

    for (int y = 0; y < str.length; y++) 
    { 
     i = (i + 1) % 256; 
     j = (j + s[i]) % 256; 
     swap(s[i], s[j]); 

     unsigned char f = [str characterAtIndex:y]^s[ (s[i] + s[j]) % 256]; 
     res[y] = f; 
    } 
    return [NSString stringWithCharacters:buffer length:str.length]; 
} 
1

RC4实现从.NET编译:

+(NSString*)RC4:(NSString *)data key:(NSString *)key 
{ 
    id x; 
    int y = 0; 
    int i = 0; 
    int j = 0; 
    NSMutableArray *box = [[NSMutableArray alloc] initWithCapacity:256]; 
    NSString *result = @""; 

    for (i = 0; i < 256; i++) { 
     [box addObject:[NSNumber numberWithInt:i]]; 
    } 

    for (i = 0; i < 256; i++) { 
     j = ((int)[key characterAtIndex:(i % key.length)] + [[box objectAtIndex:i] intValue] + j) % 256; 
     x = [box objectAtIndex:i]; 
     [box setObject:[box objectAtIndex:j] atIndexedSubscript:i]; 
     [box setObject:x atIndexedSubscript:j]; 
    } 

    for (i = 0; i < data.length; i++) { 
     y = i % 256; 
     j = ([[box objectAtIndex:y] intValue] + j) % 256; 
     x = [box objectAtIndex:y]; 
     [box setObject:[box objectAtIndex:j] atIndexedSubscript:y]; 
     [box setObject:x atIndexedSubscript:j]; 

     NSString *c = [NSString stringWithFormat:@"%c", ([data characterAtIndex:i]^ (char)[[box objectAtIndex:([[box objectAtIndex:y] intValue] + [[box objectAtIndex:j] intValue]) % 256] intValue])]; 

     result = [result stringByAppendingString:c]; 

    } 

    return result; 
}