PHP加密3DES報(bào)錯(cuò) Call to undefined function: mcrypt_module_open() 如何解決

字號(hào):


    先不管3DES加密的方法對不對,方法都是網(wǎng)上的,在運(yùn)行的時(shí)候報(bào)了個(gè)錯(cuò),找來找去終于自己摸出了方法。
    <?php
    /**
    * 
    * PHP版3DES加解密類
    *
    * 可與java的3DES(DESede)加密方式兼容
    *
    * @Author: Luo Hui (farmer.luo at gmail.com)
    *
    * @version: V0.1 2008.12.04
    *
    */
    class Crypt3Des
    { 
    public $key = "01234567890123456789012345678912";
    public $iv = "23456789"; //like java: private static byte[] myIV = { 50, 51, 52, 53, 54, 55, 56, 57 };
    //加密
    public function encrypt($input)
    {
    $input = $this->padding( $input );
    $key = base64_decode($this->key);
    $td = mcrypt_module_open( MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');
    //使用MCRYPT_3DES算法,cbc模式
    mcrypt_generic_init($td, $key, $this->iv);
    //初始處理
    $data = mcrypt_generic($td, $input);
    //加密
    mcrypt_generic_deinit($td);
    //結(jié)束
    mcrypt_module_close($td);
    $data = $this->removeBR(base64_encode($data));
    return $data;
    }
    //解密
    public function decrypt($encrypted)
    {
    $encrypted = base64_decode($encrypted);
    $key = base64_decode($this->key);
    $td = mcrypt_module_open( MCRYPT_3DES,'',MCRYPT_MODE_CBC,'');
    //使用MCRYPT_3DES算法,cbc模式
    mcrypt_generic_init($td, $key, $this->iv);
    //初始處理
    $decrypted = mdecrypt_generic($td, $encrypted);
    //解密
    mcrypt_generic_deinit($td);
    //結(jié)束
    mcrypt_module_close($td);
    $decrypted = $this->removePadding($decrypted);
    return $decrypted;
    }
    //填充密碼,填充至8的倍數(shù)
    public function padding( $str )
    {
    $len = 8 - strlen( $str ) % 8;
    for ( $i = 0; $i < $len; $i++ )
    {
    $str .= chr( 0 );
    }
    return $str ;
    }
    //刪除填充符
    public function removePadding( $str )
    {
    $len = strlen( $str );
    $newstr = "";
    $str = str_split($str);
    for ($i = 0; $i < $len; $i++ )
    {
    if ($str[$i] != chr( 0 ))
    {
    $newstr .= $str[$i];
    }
    }
    return $newstr;
    }
    //刪除回車和換行
    public function removeBR( $str ) 
    {
    $len = strlen( $str );
    $newstr = "";
    $str = str_split($str);
    for ($i = 0; $i < $len; $i++ )
    {
    if ($str[$i] != '\n' and $str[$i] != '\r')
    {
    $newstr .= $str[$i];
    }
    }
    return $newstr;
    }
    }
    //test
    $input = "1qaz2ws";
    echo "plainText:" . $input."<br/>";
    $crypt = new Crypt3Des();
    echo "Encode:".$crypt->encrypt($input)."<br/>";
    echo "Decode:".$crypt->decrypt($crypt->encrypt($input));
    ?>
    代碼可以不看,就看里面的一句:$td = mcrypt_module_open( MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');報(bào)錯(cuò)的就是他。
    我搜尋了一大堆解決方法,正確的方法應(yīng)該是(僅用于windows系統(tǒng)哦):
    當(dāng)運(yùn)行php的服務(wù)器端缺少libmcrypt.dll時(shí)使用函數(shù)mcrypt_module_open進(jìn)行解密會(huì)出現(xiàn)此錯(cuò)誤。 
    在服務(wù)器上做如下設(shè)置可解決。
    到網(wǎng)上下載一個(gè)php的mcrypt模塊安裝包,只需要libmcrypt.dll文件即可(一般官網(wǎng)上下載的,php目錄下已經(jīng)有的)
    1.將libmcrypt.dll復(fù)制到system32目錄或php安裝目錄下的extensions目錄下 
    2.將libmcrypt.dll復(fù)制到apache安裝目錄的bin目錄下 
    3.到windows目錄下找到php.ini文件,打開它
    4.找到; Directory in which the loadable extensions (modules) reside. 
    extension_dir = "./" 如:extension_dir = "D:\php5\ext"
    這兩行,要使extension_dir指向的目錄下能找到libmcrypt.dll,或系統(tǒng)path下有l(wèi)ibmcrypt.dll 
    5.找到;Windows Extensions 項(xiàng)下面的;extension=php_mcrypt.dll這一行和;extension=php_iconv.dll(我的沒有,省略了)這兩行,去掉前面的分號(hào)
    ps:剛開始看網(wǎng)上的解決方法,有的說修改php安裝目錄下的php.ini,但是修改后是沒用的。一定要修改windows目錄下的php.ini!