2013-09-24 1 views
1

나는 내 코드에서 Blowfish 알고리즘을 사용하여 암호화와 암호 해독을해야합니다. 암호 해독 방법 blowfishDecrypt을 호출 한 후 NSData의 값을 얻지 만 NSString으로 변환하면 항상 null이됩니다.복어 알고리즘 객관적인 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

: I는 로그 출력에서이 결과를 볼 수

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); 

을 안녕하세요, 내 대답 (시도하고 작동;) 업데이트했습니다 – nzs

답변

2

힌트 # 1 // 일반적인 대답은

NSString이 목적을위한 초기화를 제공합니다. 볼 수 있습니다 more info using the docs here.

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

ARC를 사용한다고 가정하십시오. 이 특정 질문

에 대한

힌트 # 2 // 대답은 내가 코드를 시도하고 위는 NSString 변환이 null를 돌려 확인합니다. 왜 작동하지 않는거야? dycryptData는 진수로 표현 된 바이트 스트림이므로 I 시도는 다음과 원하는 결과 수신 :

dSync_hex = 0eec37b62b76c2dfcdf723560f033ed8d6bd37dd5223bf665c318ebe07f3cf71

+0

나는 이미 이것을 시도합니다 – QueueOverFlow

+0

Pls는 구체적으로 blowfish.c 코드 (www.cs.cmu.edu/~)를 사용하여 코드로 테스트 한 내 힌트 # 2를 확인합니다. 디 st/DeCSS/Baccash/blowfish.c) 그리고보고 싶은 것을 반환합니다. – nzs

+0

이 질문을 확인하십시오. http://stackoverflow.com/questions/19031842/dycrypt-value-from-blowfish-objective-c – QueueOverFlow