13

私はこのクラスで少し奇妙なものを持っています:

<?php
namespace lib;

/**
 * Short description of Crypt
 *
 * @author xxxx
 * @package
 */
class Encryption
{
    /**
     * Short description of _ch
     * handle to the mcrypt resource
     *
     * @access private
     * @var $_ch
     */
    private $_ch;

    /**
     * Short description of __construct
     *
     * @access public
     * @author xxxx
     * @param
     * @return void
     */
    public function __construct( $keyData = NULL, $algorithm = \MCRYPT_RIJNDAEL_256, $mode = MCRYPT_MODE_ECB, $encLibPath = '', $modeDir = '' )
    {
        $this->_ch = mcrypt_module_open( $algorithm, $encLibPath, $mode, $modeDir );

        $vector  = mcrypt_create_iv ( mcrypt_enc_get_iv_size( $this->_ch ), \MCRYPT_DEV_URANDOM );
        $keySize = mcrypt_enc_get_key_size( $this->_ch );

        $key = substr( hash( 'SHA512', $keyData . $keySize ), 0, $keySize );

        $x = mcrypt_generic_init( $this->_ch, $key, $vector );
    }

    /**
     * Short description of encrypt
     *
     * @access public
     * @author xxxx
     * @param String $str
     * @return String $res
     */
    public function encrypt( $str )
    {
        if( !is_string( $str ) )
        {
            throw new \InvalidArgumentException( 'Attemptig to encrypt data that is not a string' );
            return false;
        }
        $res = mcrypt_generic( $this->_ch, $str );

        mcrypt_generic_deinit( $this->_ch );
        mcrypt_module_close( $this->_ch );

        #var_dump($str,$res);
        return $res;
    }

    /**
     * Short description of decrypt
     *
     * @access public
     * @author xxxx
     * @param String $str
     * @return String $res
     */
    public function decrypt( $str )
    {
        if( !is_string( $str ) )
        {
            throw new \InvalidArgumentException( 'Attemptig to decrypt data that is not a string' );
            return false;
        }

82      $res = mdecrypt_generic( $this->_ch, $str );

84      mcrypt_generic_deinit( $this->_ch );
85      mcrypt_module_close( $this->_ch );

        #var_dump($str,$res);
        return trim( $res);
    }
}

これを次のように呼び出す場合:

<?php
$encryption    = new \lib\Encryption( 'somekey' );

echo $encryption->decrypt( $safeInfo );

絞め殺しの収量:

警告: mdecrypt_generic(): 90 は E:\htdocs\site\application\lib\encryption.cls.php 行 82 の有効な MCrypt リソースではありません

警告: mcrypt_generic_deinit(): 90 は E:\htdocs\site\application\lib\encryption.cls.php の 84 行目の有効な MCrypt リソースではありません

警告: mcrypt_module_close(): 90 は E:\htdocs\site\application\lib\encryption.cls.php 行 85 の有効な MCrypt リソースではありません

(これらの行は暗号化クラスに表示されます。)

予期される復号化された文字列 (正常に復号化された場合)。

警告が発生した理由と、結果に影響がないように見える理由を指摘してくれる人に感謝します。

PS 暗号化クラスの有効性に関するコメントは大歓迎です。

4

3 に答える 3

5

よく見える

<?php
$encryption = new \lib\Encryption( 'somekey' );
echo $encryption->decrypt(pack("H*", "4a4a564f26618d47536ff35b8a0af3212814a5f0ba635d2cf6f8cd31589042e2"));

_chmcrypt_module_close( $this->_ch );方法で失われたためencrypt()

おそらく、毎回暗号化または復号化するときに__constructハンドル(のような)を作成するだけで、引数のみを変更して保存できます。_ch

私はMcryptが苦手なので、私よりも悪い方法かもしれませんが、「有効なMCryptリソース」の問題の理由は本当にmcrypt_module_close

于 2012-05-17T10:13:30.347 に答える
3

にプレフィックスを付けていないため、名前空間の問題のようMCRYPT_MODE_ECBです__construct()

于 2012-05-20T13:08:52.330 に答える
2

これは確認すべきことですが、再現できないため、答えかどうかはわかりません。

SHA512 (長さ 512 のキーを作成) がありますが、アルゴリズムは長さ 256 のキーを想定しています。SHA256 を使用しても違いはありますか? 通常、キーの不一致はガベージを生成するはずですが、この場合、「副作用を伴って」動作している可能性があります。

于 2012-05-19T12:35:13.317 に答える