加密和解密字符串

时间:2015-08-30 10:54:25

标签: php encryption comparison padding mcrypt

我想要解密我所有的会话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是:确定登录失败确定

如您所见$login_ok == 'ok&#39>是真的,但代码说它是真的! 我不知道这是什么问题!这很简单但是......

3 个答案:

答案 0 :(得分:2)

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

解密后需要删除该填充:

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

请注意,如果它恰好以0x00字节结尾,这也会从合法纯文本中删除0x00字节。如果要防止这种情况,则需要使用适当的填充进行加密和解密,例如PKCS#7 padding

答案 1 :(得分:2)

修剪白色空格的解密数据。 在使用if条件之前使用trim()函数。

$login_ok = trim(decrypted data);

If( $login_ok ) 

{ 

your function 

}

答案 2 :(得分:2)

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

  

将使用给定的密码和模式解密的数据。如果   数据的大小不是n * blocksize,数据将被填充   &#39; \ 0&#39;

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

$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)