PHP如果不加密和解密字符串后工作


PHP IF not working after Encrypt and Decrypt a String

我想加密我所有的session php数据当我想使用这些信息时,解密它们我使用这些函数:

define("ENCRYPTION_KEY", "!@#$%^Soheil&*");
/**
 * Returns an encrypted & utf8-encoded
 */
function encrypt($pure_string, $encryption_key) {
    $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $encrypted_string = mcrypt_encrypt(MCRYPT_BLOWFISH, $encryption_key, utf8_encode($pure_string), MCRYPT_MODE_ECB, $iv);
    return $encrypted_string;
}
/**
 * Returns decrypted original string
 */
function decrypt($encrypted_string, $encryption_key) {
    $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $decrypted_string = mcrypt_decrypt(MCRYPT_BLOWFISH, $encryption_key, $encrypted_string, MCRYPT_MODE_ECB, $iv);
    return $decrypted_string;
}

,当我想设置我的数据时,我使用以下代码:

$_SESSION["admin_username"] = encrypt($username, ENCRYPTION_KEY);
$_SESSION["seller_id"] = encrypt($user_array['id'], ENCRYPTION_KEY);
$_SESSION['seller_name'] = $user_array['name'];
$_SESSION['login_ok'] = encrypt('ok', ENCRYPTION_KEY);

现在当我想显示解密日期它工作良好,但当我想在IF语句中使用它时,它不起作用:

$seller_user_id =  decrypt( $_SESSION["seller_id"] , ENCRYPTION_KEY); 
$seller_user_name =  $_SESSION["seller_name"] ;  
$login_ok = decrypt( $_SESSION["login_ok"] , ENCRYPTION_KEY); 
echo "login_ok is : " .$login_ok  ;
if ( $login_ok  == 'ok'  )
{
}
else
{
    echo "Login Fail";
    echo "<br> " .$login_ok ;
}

,输出是:

login_ok is: ok Login Fail ok

如您所见,$login_ok == 'ok '为真,但代码说它为假!我不知道有什么问题!

您可以在http://php.net/manual/en/function.mcrypt-decrypt.php上阅读:

将使用给定密码和模式解密的数据。如果数据的大小不是n *块大小,数据将被填充' ' 0。

因此,在将返回的数据与其他字符串进行比较之前,您必须修剪它,如下面的示例所示:

$seller_user_id =  decrypt( $_SESSION["seller_id"] , ENCRYPTION_KEY); 
$seller_user_name =  $_SESSION["seller_name"] ;  
$login_ok = rtrim(decrypt( $_SESSION["login_ok"] , ENCRYPTION_KEY), "'0'4"); 
echo "login_ok is : " . $login_ok . "<br>";
if ($login_ok  == 'ok') {
    echo "Logged in succesfully!!"; 
} else {
    echo "Login Fail - " .$login_ok ;
}

这个例子用rtrim( ... , "'0'4");

来裁剪字符串末尾的NULL('0)和eot ('4)

具有块模式(如ECB)的块密码(如Blowfish)仅适用于块大小的倍数的明文。Blowfish的块大小为64位,但字符串"ok"小于块大小,因此mcrypt会自动将带有0x00字节的明文填充到块大小的下一个倍数。

你需要在解密后删除填充:

$decrypted_string = rtrim(mcrypt_decrypt(...), "'0");

请注意,如果合法明文恰好以0x00字节结束,这也将从该明文中删除0x00字节。如果你想防止这种情况发生,你需要为加密和解密使用适当的填充,比如pkcs# 7填充。

为空格修剪解密数据。在if条件下使用前请使用trim()函数

$login_ok = trim(decrypted data);
If( $login_ok ) 
{ 
your function 
}