PHP 如果加密和解密字符串后无法正常工作
PHP IF not working after Encrypt and Decrypt a String
我想加密我所有的会话 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
' 是真的,但代码说它是假的!
我不知道有什么问题!很简单但是...
具有块模式(例如 ECB)的块密码(例如 Blowfish)仅适用于块大小倍数的明文。 Blowfish 的块大小是 64 位,但字符串 "ok" 小于块大小,因此 mcrypt 自动将明文填充为 0x00 字节到块大小的下一个倍数。
您需要在解密后删除该填充:
$decrypted_string = rtrim(mcrypt_decrypt(...), "[=10=]");
请注意,如果它恰好以 0x00 字节结束,这也会从合法明文中删除 0x00 字节。如果你想防止这种情况,你需要使用适当的填充来加密和解密,例如 PKCS#7 padding.
Trim 空格的解密数据。
在 if 条件中使用之前使用 trim() 函数。
$login_ok = trim(decrypted data);
If( $login_ok )
{
your function
}
在 http://php.net/manual/en/function.mcrypt-decrypt.php 您可以阅读:
The data that will be decrypted with the given cipher and mode. If the
size of the data is not n * blocksize, the data will be padded with
'[=12=]'.
因此,在将返回的数据与其他字符串进行比较之前,您必须 trim 它,如下例所示:
$seller_user_id = decrypt( $_SESSION["seller_id"] , ENCRYPTION_KEY);
$seller_user_name = $_SESSION["seller_name"] ;
$login_ok = rtrim(decrypt( $_SESSION["login_ok"] , ENCRYPTION_KEY), "[=10=]");
echo "login_ok is : " . $login_ok . "<br>";
if ($login_ok == 'ok') {
echo "Logged in succesfully!!";
} else {
echo "Login Fail - " .$login_ok ;
}
这个例子trim 字符串末尾的NULL (\0) 和EOTs (\4) with rtrim( ... , "[=11=]");
我想加密我所有的会话 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
' 是真的,但代码说它是假的!
我不知道有什么问题!很简单但是...
具有块模式(例如 ECB)的块密码(例如 Blowfish)仅适用于块大小倍数的明文。 Blowfish 的块大小是 64 位,但字符串 "ok" 小于块大小,因此 mcrypt 自动将明文填充为 0x00 字节到块大小的下一个倍数。
您需要在解密后删除该填充:
$decrypted_string = rtrim(mcrypt_decrypt(...), "[=10=]");
请注意,如果它恰好以 0x00 字节结束,这也会从合法明文中删除 0x00 字节。如果你想防止这种情况,你需要使用适当的填充来加密和解密,例如 PKCS#7 padding.
Trim 空格的解密数据。 在 if 条件中使用之前使用 trim() 函数。
$login_ok = trim(decrypted data);
If( $login_ok )
{
your function
}
在 http://php.net/manual/en/function.mcrypt-decrypt.php 您可以阅读:
The data that will be decrypted with the given cipher and mode. If the size of the data is not n * blocksize, the data will be padded with '[=12=]'.
因此,在将返回的数据与其他字符串进行比较之前,您必须 trim 它,如下例所示:
$seller_user_id = decrypt( $_SESSION["seller_id"] , ENCRYPTION_KEY);
$seller_user_name = $_SESSION["seller_name"] ;
$login_ok = rtrim(decrypt( $_SESSION["login_ok"] , ENCRYPTION_KEY), "[=10=]");
echo "login_ok is : " . $login_ok . "<br>";
if ($login_ok == 'ok') {
echo "Logged in succesfully!!";
} else {
echo "Login Fail - " .$login_ok ;
}
这个例子trim 字符串末尾的NULL (\0) 和EOTs (\4) with rtrim( ... , "[=11=]");