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

时间:2013-09-26 15:03:27

标签: ios objective-c blowfish

我收到服务器的加密数据(BLOWFISH ALGORITHM),我必须在IOS中使用blowfish算法解密它。

您可以从这里下载我的代码: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
  4. 在第三个链接中,我得到了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Ò¢º¹iF

    这是我的代码:

    //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

1 个答案:

答案 0 :(得分: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的实施者一些信誉;-) 我的NSLog也用于研究目的,它突出了解密的工作原理。