如何在目标C / ios中解密一个PHP脚本

首先我需要说我已经检查了所有相关的stackoverflow问题。 还检查了答案中的链接,但没有得到任何可用的解决scheme。 所以请不要以为我在这里直接问你这个问题。

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

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

我无法在目标c中解密它。 我已经使用了一些类似强encryptioncocoa/cocoa触摸等,我也跟着这个问题如何在iPhone SDK的base64编码?

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

这里是我用于解密的目标C代码(在cocoa-aes Category NSData + AES.h中find)

 - (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; } 

从它的外观来看,这个php函数做了两件事。

  1. 使用MCRYPT_RIJNDAEL_256MCRYPT_RIJNDAEL_256
  2. base64编码(1)的输出

这就是为什么简单地使用base64不起作用。 我会从名称MCRYPT_RIJNDAEL_256只是AES 256来猜测。

希望有所帮助。

编辑:

你上面添加的代码看起来不错。 你只需要base64解码数据。

PHP脚本这样做:

  1. aesencryption
  2. base64编码

所以你想在你的cocoa应用程序中做到这一点:

  1. base64解码
  2. aes解密

如果你遇到麻烦,你可能想玩一下,看看你是否可以得到cocoa与php脚本做同样的事情:encryption和base64编码的数据。 如果你能得到你的encryption函数的输出和phpencryption函数的输出一样,那么你就是一个解密的好地方。