2012-01-09 96 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; 
}