2013-01-15 65 views
0

我必须在我的php服务器上生成加密的密钥,并将它发送给ipad应用程序进行解密。PHP加密和objective-c解密

我所做的PHP服务器端:

$iv = mcrypt_create_iv(32); 
    $privatEencryptKey = "1111"; 
    $data = "2222"; 
    $encryptedData = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $privateEncryptKey, base64_encode($data), MCRYPT_MODE_CBC, $iv); 
    $decryptedData = base64_decode(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $privateEncryptkey, $encryptedData, MCRYPT_MODE_CBC, $iv)); 

    echo base64_encode($encryptedData); //output = WT7LorzZ1EQo2BeWxawW3Q== 
    echo $decryptedData; // output = 2222 
    echo base64_encode($iv); // output = fZTj4BxWSdCYQW/scUHvx9QoiTNXmxNrGWb/n7eFkR4= 

和我导入sercurity.framwork的Xcode和我添加第三方支持Base64(编码解码&)我用的是(CommonCryptor.h )也和这里是我的代码:

+ (NSData *)doCipher:(NSData *)dataIn 
       iv:(NSData *)iv 
      key:(NSData *)symmetricKey 
     context:(CCOperation)encryptOrDecrypt{ 
     CCCryptorStatus ccStatus = kCCSuccess; 
     size_t   cryptBytes = 0; // Number of bytes moved to buffer. 
     NSMutableData *dataOut = [NSMutableData dataWithLength:dataIn.length + kCCBlockSizeAES128]; 

     ccStatus = CCCrypt(encryptOrDecrypt, 
        kCCAlgorithmAES128, 
        0, 
        symmetricKey.bytes, 
        kCCKeySizeAES128, 
        iv.bytes, 
        dataIn.bytes, 
        dataIn.length, 
        dataOut.mutableBytes, 
        dataOut.length, 
        &cryptBytes); 

     if (ccStatus != kCCSuccess) { 
       NSLog(@"CCCrypt status: %d", ccStatus); 
     } 

     dataOut.length = cryptBytes; 
     return dataOut; 
    } 

    + (void) testCipher{ 
     NSData *dataIn = [[@"WT7LorzZ1EQo2BeWxawW3Q==" base64DecodedString] dataUsingEncoding:NSUTF8StringEncoding]; 
     NSData *key = [@"1111" dataUsingEncoding:NSUTF8StringEncoding]; 
     NSData *iv = [[@"fZTj4BxWSdCYQW/scUHvx9QoiTNXmxNrGWb/n7eFkR4=" base64DecodedString] dataUsingEncoding:NSUTF8StringEncoding]; 

     NSData *dataOut = [Utils doCipher:dataIn iv:iv key:key context:kCCDecrypt]; 
     NSString* strOut = [[[NSString alloc] initWithData:dataOut 
              encoding:NSUTF8StringEncoding] base64DecodedString]; 
     NSLog(@"%@", strOut); 
    } 

我得到斯特劳特的零..... :(

任何帮助,请......

+0

按此顺序提供:加密Base64数据,解密Base64数据,解密字符串。 – zaph

+0

提供的密钥是32位,但AES128需要128位。 iv是256位,但只需要128位。 – zaph

+0

谢谢Zaph,对不起,但我是密码学领域的新手....如何生成128位密钥和IV(在PHP中用于加密)并传递生成的密钥以重用它们在目标c中解密? ? ....我所做的是回声encoded64 key和iv到我的测试page.php并将这些值复制粘贴到我的目标c类中并解码这些值,并在将它们转换为NSData对象后将它们传递给CCCrypt函数... am我对吗? – Saeed

回答

1
  1. 您应该使用AES-128的16字节密钥和IV。 Mcrypt_encrypt否则用零填充。
  2. 由于mcrypt_encrypt填充数据为零,所以很可能应该手动将PKCS#5填充添加到输入中,这是不常见的做法。