在Objective-C代码中解密来自河豚的值

我收到服务器的encryption数据(BLOWFISH ALGORITHM),我必须在IOS中使用blowfishalgorithm来解密它。

你可以从这里下载我的代码: https ://www.dropbox.com/s/nswsm7des7isgd5/BlowfishTest-4.zip

我从这个任务挣扎了2天,我尝试了很多链接,发现一些有用的:

  1. Blowfish源代码
  2. 如何在iOS中实现Blowfishalgorithm
  3. http://www.codeding.com/articles/blowfish-encryption-algorithm-for-iphone

在第三个环节,我得到了ECB(我必须使用ECB进行解密)。 但是这个代码在解密之后也没有给出正确的输出。

我正在使用在线工具进行testing,并显示正确的输出: 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Ò¢º¹ÂÂ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进行encryption,并转换为hex符号。 在这里输入图像说明

1)来自David Madore的Blowfish例程: ftp : //quatramaran.ens.fr/pub/madore/misc/blowfish.c

请注意,在这个源文件中.h部分应该与.c文件分开。

2)要使用Pandora 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; } 

所以主要是从我这边来的一个研究,请给Blowfish API和pandora api的实现者一分信誉;而且我的NSLogs也是为了研究目的,它强调了解密是如何工作的。