iOS / PHP kCCDecodeError

Non riesco, per la vita di me, a capire perché, quando crittografo qualcosa in PHP, non posso decodificarlo nella mia app iOS, ma PHP può decrittografare le stringhe crittografate di iOS e decrittografare / cifrare tra di loro.

PHP -> Obj-C FAILS.

Sì, ho guardato attraverso la networking e l'unica soluzione che ho trovato è stata l'utilizzo di CBC in PHP che sto già facendo.

Sto usando la libreria FBEncryptor per iOS e queste sono le funzioni di crittografia / decrittografia in PHP:

 function encrypt($decrypted) { $iv = ''; for($i=0;$i<16;$i++){ $iv .= "\0";} $ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $passKey, $decrypted, MCRYPT_MODE_CBC, $iv); $ciphertext = base64_encode($ciphertext); return $ciphertext; } function decrypt($encrypted) { $iv = ''; for($i=0;$i<16;$i++){ $iv .= "\0";} $ciphertext = base64_decode($encrypted); $plaintext = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $passKey, $ciphertext, MCRYPT_MODE_CBC, $iv); return $plaintext; } 

Dalla pagina Github di FBEncryptor (enfasi mia):

L'algorithm di crittografia supportto è solo AES 256 bit .

Ma nello snippet di codice sopra, stai facendo:

 mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $ciphertext, MCRYPT_MODE_CBC, $iv); 

cioè decifrare con AES 128 bit come codice.

Dovrai correggere il tuo codice di conseguenza. Altri errori comuni includono l'utilizzo di modalità di riempimento e cifratura a blocchi non corrispondenti.

Sono riuscito a risolvere il problema. È stato uno stupido errore da parte mia con la variabile chiave pass. Ecco la mia implementazione finale comunque per chiunque altro incontri questo problema:

 function encrypt($decrypted) { $thePassKey = "12345678901234567890123456789012"; # Add PKCS7 padding. $str = $decrypted; $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); if (($pad = $block - (strlen($str) % $block)) < $block) { $str .= str_repeat(chr($pad), $pad); } $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); $iv = ''; for($i=0;$i<$iv_size;$i++){ $iv .= "\0";} return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $thePassKey, $str, MCRYPT_MODE_CBC, $iv)); } function decrypt($encrypted) { $thePassKey = "12345678901234567890123456789012"; $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); $iv = ''; for($i=0;$i<$iv_size;$i++){ $iv .= "\0";} $str = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $thePassKey, base64_decode($encrypted), MCRYPT_MODE_CBC, $iv); # Strip PKCS7 padding. $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); $pad = ord($str[($len = strlen($str)) - 1]); if ($pad && $pad < $block && preg_match( '/' . chr($pad) . '{' . $pad . '}$/', $str)) { return substr($str, 0, strlen($str) - $pad); } return $str; }