2013-01-15 66 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填充添加到輸入中,這是不常見的做法。