0

我一生都无法弄清楚为什么当我在 PHP 中加密某些内容时,我无法在我的 iOS 应用程序中对其进行解密,但 PHP 可以解密 iOS 加密字符串并在自身之间解密/加密。

PHP -> Obj-C 失败。

是的,我浏览了整个网络,我发现的唯一解决方案是使用我已经在做的CBCPHP

我正在使用FBEncryptoriOS 库,这些是 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;
}
4

2 回答 2

0

我设法解决了这个问题。对我来说,密码变量是一个愚蠢的错误。无论如何,对于遇到此问题的其他任何人,这是我的最终实现:

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;
}
于 2012-09-07T08:56:32.510 回答
0

FBEncryptor Github 页面(重点是我的):

支持的加密算法仅为 AES 256 位

但是在上面的代码片段中,您正在执行以下操作:

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

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

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

于 2012-09-06T13:07:09.040 回答