iOS/PHP kCC解码错误


iOS/PHP kCCDecodeError

我一辈子都不知道为什么当我用PHP加密某个东西时,我不能在iOS应用程序中解密它,但PHP可以解密iOS加密的字符串,并在它们之间解密/加密。

PHP->Obj-C失败。

是的,我已经查看了整个网络,我找到的唯一解决方案是在PHP中使用CBC,我已经在做了。

我正在使用iOS版的FBEncryptor库,这些是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;
}

来自FBEncryptor Github页面(emphasis mine):

支持的加密算法是仅限AES 256位

但在上面的代码片段中,您正在执行:

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

即使用AES 128位作为密码进行解密。

您需要相应地更正代码。其他常见错误包括使用不匹配的填充和分组密码操作模式。

我设法解决了这个问题。我在pass-key变量上犯了一个愚蠢的错误。这是我为其他遇到这个问题的人提供的最后一个实现:

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