1

次のクラスを使用して、文字列を暗号化および復号化します。2つの同一の文字列を作成した後、文字列の1つを暗号化してから、復号化します。ただし、復号化された文字列は、(変換後のテキスト形式では同じように見えますが)その双子とは等しくなりません。また、暗号化された文字列とそのツインを取得し、bin2hexを使用して16進数に変換した後、前に暗号化された文字列の末尾にゼロが追加されていることだけが似ていることがわかりました。

誰かが私が間違ったことを指摘できますか?前もって感謝します。

クラス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 );
}

}//クラスの終わり

4

2 に答える 2

3

暗号化アルゴリズムは通常、固定された「ブロックサイズ」で機能するために、ある程度の長さ(8バイト、16バイトなど)の倍数の入力を必要とします。入力文字列は、一致するように0が埋め込まれている可能性があります。選択したアルゴリズムに基づいて必要なパディングを追跡することで元に戻すことができ(各アルゴリズムには独自のブロックサイズとパディング方法があります)、復号化後に元に戻すことができます。

于 2010-11-13T00:01:01.953 に答える
1

おそらく、スペースが埋め込まれた16の長さの文字列があります。bin2hex()の前にtrim()を試して、先頭と末尾のスペースを削除してください。

于 2010-11-13T00:19:45.773 に答える