2011-10-01 36 views
3

首先,我需要说我已经检查了所有相关的stackoverflow问题。还检查了该答案中的链接,但没有得到任何可用的解决方案。所以请不要以为我在这里直接问你这个问题。如何解密目标C/ios中的PHP脚本

这是我的PHP脚本,我与这个脚本无关(因为我不能改变脚本)。

function encrypt($message,$secretKey) { 
return base64_encode(
    mcrypt_encrypt(
     MCRYPT_RIJNDAEL_256, 
     $secretKey, 
     $message, 
     MCRYPT_MODE_ECB 
    ) 
); 
} 

我无法在目标c中解密它。我使用了一些类别,如Strong Encryption for Cocoa/Cocoa Touch等,我也跟着这个问题How do I do base64 encoding on iphone-sdk?

请帮我。我需要它非常紧迫。提前致谢。

这里是我用于解密的目标C代码(在可可-AES类别的NSData + AES.h找到)

- (NSData *)AESDecryptWithPassphrase:(NSString *)pass 
{ 
    NSMutableData *ret = [NSMutableData dataWithCapacity:[self length]]; 
    unsigned long rk[RKLENGTH(KEYBITS)]; 
    unsigned char key[KEYLENGTH(KEYBITS)]; 
    const char *password = [pass UTF8String]; 
    for (int i = 0; i < sizeof(key); i++) 
     key[i] = password != 0 ? *password++ : 0; 

    int nrounds = rijndaelSetupDecrypt(rk, key, KEYBITS); 
    unsigned char *srcBytes = (unsigned char *)[self bytes]; 
    int index = 0; 
    while (index < [self length]) 
    { 
     unsigned char plaintext[16]; 
     unsigned char ciphertext[16]; 
     int j; 
     for (j = 0; j < sizeof(ciphertext); j++) 
     { 
      if (index >= [self length]) 
       break; 

      ciphertext[j] = srcBytes[index++]; 
     } 
     rijndaelDecrypt(rk, nrounds, ciphertext, plaintext); 
     [ret appendBytes:plaintext length:sizeof(plaintext)]; 
     NSString* s = [[NSString alloc] initWithBytes:plaintext length:sizeof(plaintext) encoding:NSASCIIStringEncoding]; 
     NSLog(@"%@",s); 
    } 
    return ret; 
} 

另外我试图此解码器

- (NSData*) aesDecryptWithKey:(NSString *)key initialVector:(NSString*)iv 
{ 
    int keyLength = [key length]; 
    if(keyLength != kCCKeySizeAES128) 
    { 
     DebugLog(@"key length is not 128/192/256-bits long"); 

     ///return nil; 
    } 

    char keyBytes[keyLength+1]; 
    bzero(keyBytes, sizeof(keyBytes)); 
    [key getCString:keyBytes maxLength:sizeof(keyBytes) encoding:NSUTF8StringEncoding]; 

    size_t numBytesDecrypted = 0; 
    size_t decryptedLength = [self length] + kCCBlockSizeAES128; 
    char* decryptedBytes = malloc(decryptedLength); 

    CCCryptorStatus result = CCCrypt(kCCDecrypt, 
            kCCAlgorithmAES128 , 
            (iv == nil ? kCCOptionECBMode | kCCOptionPKCS7Padding : kCCOptionPKCS7Padding), 
            keyBytes, 
            keyLength, 
            iv, 
            [self bytes], 
            [self length], 
            decryptedBytes, 
            decryptedLength, 
            &numBytesDecrypted); 

    if(result == kCCSuccess){ 
     NSData* d=[NSData dataWithBytesNoCopy:decryptedBytes length:numBytesDecrypted]; 
     NSLog(@"%@",[NSString stringWithUTF8String:[d bytes]]); 
     return d; 
    } 
    free(decryptedBytes); 
    return nil; 
} 
+0

你有什么试过?如果你可以展示你的Objective C代码,那么人们可能会帮助你。 –

+0

我已经添加了用于解密的代码 – Lee

+1

这只是切线相关的,尤其是因为您说您无法更改PHP脚本,但是您应该注意[ECB模式不安全](http:// stackoverflow。COM /问题/ 1220751 /如何对选择-AN-AES加密模式,CBC-ECB-CTR-OCB-CFB)。 –

回答

8

从外表它的PHP功能有两件事。

  1. 使用MCRYPT_RIJNDAEL_256
  2. 的base64编码的mcrypt(1)

这将通过简单的原因使用Base64不起作用的输出。我要从名称MCRYPT_RIJNDAEL_256只是AES 256来猜测。

希望有帮助。

编辑:

您在上面添加的代码看起来没问题。你只需要base64先解码数据。

PHP脚本做到这一点:

  1. AES加密
  2. 的base64编码

所以,你要做到这一点在你的可可应用程序:

  1. 的base64解码
  2. aes解密

如果你遇到了麻烦,你可能想玩弄一下,看看你是否可以让可可做与php脚本一样的事情:加密和base64编码数据。如果你的加密函数的输出与php加密函数的输出相同,那么你就可以解密它。

+0

那么,我现在该做什么?我不是PHP专家! – Lee

+0

@lee编辑我的回答 –

+0

感谢您的回答,我会尝试 – Lee