3

我正在通过服务器(BLOWFISH ALGORITHM)接收加密数据,我必须在 IOS 中使用河豚算法对其进行解密。

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

我从 2 天开始就为这项任务苦苦挣扎,我尝试了很多链接,但发现很少有用:

  1. 河豚源代码
  2. 如何在 iOS 中实现 Blowfish 算法
  3. http://www.coded.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 加密,并转换为十六进制表示法。 在此处输入图像描述

4

1 回答 1

5

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)使用这个代码片段(站在伟大的程序员的肩膀上)——原始的 Pandora 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 用于研究目的,它突出了解密的工作原理。

于 2013-10-01T10:06:13.183 回答