2013-09-26 79 views
3

我接收服務器的加密數據(BLOWFISH ALGORITHM),我必須在IOS中使用blowfish算法來解密它。解密來自目標C代碼中的河豚的值

你可以從這裏donwload我的代碼:https://www.dropbox.com/s/nswsm7des7isgd5/BlowfishTest-4.zip

我2天努力完成這個任務,我嘗試很多的鏈接,找到一些有用的:

  1. Blowfish Source code
  2. How to implement Blowfish algorithm in iOS
  3. http://www.codeding.com/articles/blowfish-encryption-algorithm-for-iphone

在第三個鏈接中,我得到了ECB(我必須使用ECB進行解密)。但是這個代碼在解密之後也沒有給出正確的輸出。

我使用測試一個在線工具,這表明正確的輸出:http://www.tools4noobs.com/online_tools/decrypt/

Key = 20zE1E47BE57$51 
Input value is = aed5c110d793f850521a4dd3a56a70d9 
Algorithm = BLOWFISH 
Mode = ECB 
Decode the input using= Hexa 

output = aYzY1380188405 (this is correct output which i want) 

和我得到:¹àÀhÒ¢º¹iÂF

這裏是我的代碼:

//Mode selected by default in nib: 「ECB」 
NSString *modeString = [encryptionModeControl titleForSegmentAtIndex:encryptionModeControl.selectedSegmentIndex]; 
BlowfishAlgorithm *blowFish = [BlowfishAlgorithm new]; 
[blowFish setMode:[BlowfishAlgorithm buildModeEnum:modeString]]; 
[blowFish setKey:key]; 
[blowFish setInitVector:initVector]; 
[blowFish setupKey]; 

NSString *cipherText = cipherTextView.text; 
NSString *plainText = [blowFish decrypt:cipherText]; 

NSLog(@"cipher-text: %@", cipherText); 
NSLog(@"plain-text: %@", plainText); 

注意:服務器端數據在ECB模式下使用BLOWFISH進行加密,並轉換爲十六進制符號。 enter image description here

+0

請顯示一些代碼。不正確地處理編碼和填充是最常見的錯誤。 –

+0

@MarcusAdams你可以從這裏下載我的代碼:https://www.dropbox.com/s/nswsm7des7isgd5/BlowfishTest-4。zip – QueueOverFlow

+0

您有使用第三方的Blowfish實現而不是Apple的CommonCrypto API的原因嗎? –

回答

5

1)資料來源大衛·馬度爾河豚套路:ftp://quatramaran.ens.fr/pub/madore/misc/blowfish.c

請注意,在這種源的.h部分應該從.c文件分開。

2)使用潘多拉API,我們必須使用它的wiki頁面在這裏給出的密碼: http://pan-do-ra-api.wikia.com/wiki/Json/5/partners

目前解密的密碼是:20zE1E47BE57$51

3)使用此代碼段(站在優秀的程序員「肩膀) - 原潘多拉API的實現是在這裏:https://github.com/alexcrichton/hermes

在AppDelegate.h(爲簡單起見)

#define PARTNER_DECRYPT "20zE1E47BE57$51" 
... 
-(NSData*) PandoraDecrypt:(NSString*) string; 

在AppDelegate.m

static char h2i[256] = { 
    ['0'] = 0, ['1'] = 1, ['2'] = 2, ['3'] = 3, ['4'] = 4, ['5'] = 5, ['6'] = 6, 
    ['7'] = 7, ['8'] = 8, ['9'] = 9, ['a'] = 10, ['b'] = 11, ['c'] = 12, 
    ['d'] = 13, ['e'] = 14, ['f'] = 15 
}; 

static void appendByte(unsigned char byte, void *_data) { 
    NSMutableData *data = (__bridge NSMutableData*) _data; 
    NSLog(@"pre: %@", data); 
    [data appendBytes:&byte length:1]; 
    NSLog(@"post: %@", data); 
} 

-(NSData*) PandoraDecrypt:(NSString*) string { 
    struct blf_ecb_ctx ctx; 
    NSMutableData *mut = [[NSMutableData alloc] init]; 

    Blowfish_ecb_start(&ctx, FALSE, (unsigned char*) PARTNER_DECRYPT, 
         sizeof(PARTNER_DECRYPT) - 1, appendByte, 
         (__bridge void*) mut); 

    const char *bytes = [string cStringUsingEncoding:NSASCIIStringEncoding]; 
    int len = [string lengthOfBytesUsingEncoding:NSASCIIStringEncoding]; 
    int i; 
    for (i = 0; i < len; i += 2) { 
     NSLog(@"%c, %c, %d, %d", bytes[i], bytes[i+1], h2i[(int) bytes[i]] * 16, h2i[(int) bytes[i + 1]]); 
     Blowfish_ecb_feed(&ctx, h2i[(int) bytes[i]] * 16 + h2i[(int) bytes[i + 1]]); 
    } 
    Blowfish_ecb_stop(&ctx); 

    return mut; 
} 

而且你可以使用此類似:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    NSLog(@"%@", [NSString stringWithCString:[ 
        [self PandoraDecrypt:@"aed5c110d793f850521a4dd3a56a70d9"] bytes] 
          encoding:NSASCIIStringEncoding]); 
    return YES; 
} 

所以它主要是從我身邊的一個研究,請給予信貸河豚API和潘多拉的實施者api ;-) 另外我的NSLogs是爲了研究目的,它突出瞭解密是如何工作的。

+0

感謝你的代碼幫助我很多。只是一個小問題。我在最後得到「aYzY1380188405〜Ixÿ」幾個特殊字符。我們可以從最後刪除這些特殊字符嗎?輸出應該是「aYzY1380188405」。 – QueueOverFlow

+0

由於來自第二個8字符塊的解密,我必須更深入地研究blowfish代碼。 – nzs

+0

好吧,我也在研究它 – QueueOverFlow