加密和解密后字符串不再相等

时间:2010-11-12 23:57:55

标签: php character-encoding encryption mcrypt

我使用以下类来加密和解密字符串。创建两个相同的字符串后,我加密其中一个字符串,然后解密它。但是,解密后的字符串不再等于其双胞胎(即使它们在转换后看起来与文本形式相同)。此外,在使用加密解密的字符串及其双胞胎并将它们转换为十六进制使用bin2hex之后,我发现它们看起来类似于之前加密的字符串在末尾添加了零数。

有人可以指出我做错了什么吗?先感谢您。

课程proCrypt {

public function __set( $name, $value )
{
    switch( $name)
    {
        case 'key':
        case 'ivs':
        case 'iv':
        $this->$name = $value;
        break;

        default:
        throw new Exception( "$name cannot be set" );
    }
}

/**
*
* Gettor - This is called when an non existant variable is called
*
* @access    public
* @param    string    $name
*
*/
public function __get( $name )
{
    switch( $name )
    {
        case 'key':
        return 'abcd';

        case 'ivs':
        return mcrypt_get_iv_size( MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB );

        case 'iv':
        return mcrypt_create_iv( $this->ivs );

        default:
        throw new Exception( "$name cannot be called" );
    }
}

/**
*
* Encrypt a string
*
* @access    public
* @param    string    $text
* @return    string    The encrypted string
*
*/
public function encrypt( $text )
{
    // add end of text delimiter
    $data = mcrypt_encrypt( MCRYPT_RIJNDAEL_128, $this->key, $text, MCRYPT_MODE_ECB, $this->iv );
    return bin2hex($data);
}

/**
*
* Decrypt a string
*
* @access    public
* @param    string    $text
* @return    string    The decrypted string
*
*/
public function decrypt( $text )
{
    $text = pack("H*" , $text);
    return mcrypt_decrypt( MCRYPT_RIJNDAEL_128, $this->key, $text, MCRYPT_MODE_ECB, $this->iv );
}

} //班级的结尾

2 个答案:

答案 0 :(得分:3)

加密算法通常需要输入为某个长度(8字节,16字节等)的倍数才能使用固定的“块大小”。您的输入字符串可能已经过0填充以匹配。您可以通过根据您选择的算法跟踪必要的填充来撤消它(每个算法都有自己的块大小和填充方法),并在解密后撤消它。

答案 1 :(得分:1)

你有一个16长的字符串填充空格,大概是。在bin2hex()之前尝试trim()以摆脱前导和尾随空格。