2013-09-24 31 views
1

我必須在我的代碼中使用Blowfish算法進行加密和解密。在調用解密方法blowfishDecrypt後,我得到的值爲NSData,但它給我總是null當我將它轉換爲NSString河豚算法目標c

我使用下面的代碼:

-(void)methodCalled 
{ 
    [email protected]"c7c937169084b20c3ff882dcda193a59"; 
    NSData* data = [syncTime dataUsingEncoding:NSUTF8StringEncoding]; 
    NSData* data2 = [@"R=U!LH$O2B#" dataUsingEncoding:NSUTF8StringEncoding]; 
    NSData* dycryptData=[self blowfishDecrypt:data usingKey:data2]; 

    // prints <0eec37b6 2b76c2df cdf72356 0f033ed8 d6bd37dd 5223bf66 5c318ebe 07f3cf71> 
    NSLog(@"%@",dycryptData); 

    NSString *dSync=[[NSString alloc] initWithBytes:[dycryptData bytes] 
            length:[dycryptData length] 
            encoding:NSUTF8StringEncoding]; 

    // prints (null) 
    NSLog(@"Sync timeis %@",dSync); 
} 



-(NSData *)blowfishDecrypt:(NSData *)messageData 
        usingKey:(NSData *)secretKeyData { 

    NSMutableData *decryptedData = [messageData mutableCopy]; 
    BLOWFISH_CTX ctx; 
    Blowfish_Init (&ctx, (unsigned char*)[secretKeyData bytes], [secretKeyData length]); 

    NSRange aLeftRange, aRightRange; 
    NSData *aLeftBox, *aRightBox; 
    unsigned long dl = 0, dr = 0; 

    for (int i = 0; i< [decryptedData length]; i += 8) { // Divide data into octets... 
     // …and then into quartets 
     aLeftRange = NSMakeRange(i, 4); 
     aRightRange = NSMakeRange(i + 4, 4); 

     aLeftBox = [decryptedData subdataWithRange:aLeftRange]; 
     aRightBox = [decryptedData subdataWithRange:aRightRange]; 

     // Convert bytes into unsigned long 
     [aLeftBox getBytes:&dl length:sizeof(unsigned long)]; 
     [aRightBox getBytes:&dr length:sizeof(unsigned long)]; 

     // Decipher 
     Blowfish_Decrypt(&ctx, &dl, &dr); 

     // Put bytes back 
     [decryptedData replaceBytesInRange:aLeftRange withBytes:&dl]; 
     [decryptedData replaceBytesInRange:aRightRange withBytes:&dr]; 
    } 

    return decryptedData; 
} 

河豚庫代碼可以發現如。 here

+0

嗨,我已經更新了我的答案(已嘗試並且正常工作) – nzs

回答

2

提示#1 // 一般的答案

NSString爲此提供了一個初始化。你可以看到more info using the docs here.

NSString * dSync = [[NSString alloc] initWithData: dycryptData 
             encoding:NSUTF8StringEncoding]; 

假設你使用ARC。

提示#2 // 這一特定問題

答案我想你的代碼,並確認上述的NSString轉換返回null。那麼爲什麼它不工作? dycryptData是表示爲十六進制字節的流,所以我嘗試以下和接收所期望的結果:

int dycryptData_len = [dycryptData length]; 
NSMutableString *dSync_hex = [NSMutableString stringWithCapacity:dycryptData_len*2]; 
const unsigned char *dycryptData_bytes = [dycryptData bytes]; 
for (int i = 0; i < dycryptData_len; ++i) { 
    [dSync_hex appendFormat:@"%02x", dycryptData_bytes[i]]; 
} 

NSLog(@"dSync_hex=%@",dSync_hex); 

我可以看到這個結果在日誌輸出:

dSync_hex = 0eec37b62b76c2dfcdf723560f033ed8d6bd37dd5223bf665c318ebe07f3cf71

+0

我已經試過這個 – QueueOverFlow

+0

請檢查我的提示#2,該代碼使用blowfish.c代碼(您可以從www.cs.cmu.edu/~ d st/DeCSS/Baccash/blowfish.c)並返回您想要查看的內容。 – nzs

+0

請檢查我的這個問題。 http://stackoverflow.com/questions/19031842/dycrypt-value-from-blowfish-objective-c – QueueOverFlow