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