2008年2月13日 星期三

AzDG可逆加密演算法 for PHP

AzDG For PHP網路上就找的到
但下面的版本作了一些調整
加入字元編碼轉換、演算法優化、使用PHP5語法
使用方法


$a = new AzDG();; $q = $a->Crypt('許功蓋中文測試','0123456789','big5'); echo $a->decrypt($q,'0123456789' );
class AzDG {

    private $strPrivateKey = '0123456789';
    private $strDefaultCharset = 'big5';
    private $strTargetCharset = '';
    private $strSourceText = '';
    private $intSourceLength = 0;

    function __construct() {

    }

    private function private_key_crypt($arg_strSourceText) {
        $strEncryptKey = md5($this - > strPrivateKey);
        $intCRCLength = 0;
        $strReturn = "";
        $intSourceLength = strlen($arg_strSourceText);

        for ($i = 0; $i < $intSourceLength; ++$i) {
            if ($intCRCLength > 31) {
                $intCRCLength = 0;
            }
            $strReturn. = ($arg_strSourceText[$i] ^ $strEncryptKey[$intCRCLength++]);
        }

        return $strReturn;
    }

    public function crypt($arg_strSourceText, $arg_strPrivateKey = null, $arg_strCharset = null) {
        $this - > strSourceText = $arg_strSourceText;
        $this - > intSourceLength = strlen($this - > strSourceText);

        if (!is_null($arg_strPrivateKey)) {
            $this - > strPrivateKey = $arg_strPrivateKey;
        }

        if (!is_null($arg_strCharset) AND!empty($arg_strCharset)) {
            $this - > strTargetCharset = $arg_strCharset;
            if (!$this - > convert_encoding()) {
                die('編碼轉換失敗');
            }
        }

        $strCRCKey = md5(microtime());
        $intCRCLength = 0;
        $strTmp = "";

        for ($i = 0; $i < $this - > intSourceLength; ++$i) {
            if ($intCRCLength > 31) {
                $intCRCLength = 0;
            }
            $strTmp. = $strCRCKey[$intCRCLength].($this - > strSourceText[$i] ^ $strCRCKey[$intCRCLength++]);
        }
        return base64_encode($this - > private_key_crypt($strTmp));
    }

    public function decrypt($arg_strSourceText, $arg_strPrivateKey = null, $arg_strCharset = null) {
        if (!is_null($arg_strPrivateKey)) {
            $this - > strPrivateKey = $arg_strPrivateKey;
        }

        if (!is_null($arg_strCharset) AND!empty($arg_strCharset)) {
            $this - > strTargetCharset = $arg_strCharset;
            if (!$this - > convert_encoding()) {
                die('編碼轉換失敗');
            }
        }

        $this - > strSourceText = $this - > private_key_crypt(base64_decode($arg_strSourceText));
        $this - > intSourceLength = strlen($this - > strSourceText);
        $strReturn = '';

        for ($i = 0; $i < $this - > intSourceLength; ++$i) {
            $strReturn. = ($this - > strSourceText[$i++] ^ $this - > strSourceText[$i]);
        }
        return $strReturn;
    }

    private function convert_encoding() {
        //預設轉碼失敗
        $blnIconvPassed = false;
        if (function_exists('iconv') AND $strEncodedData = iconv($this - > strDefaultCharset, $this - > strTargetCharset.
            '//TRANSLIT', $this - > strSourceText)) {
            $blnIconvPassed = true;
            $this - > strSourceText = $strEncodedData;
        }
        //如果 iconv 轉換失敗,再嚐試用mb_convert_encoding編碼
        else if (!$blnIconvPassed AND function_exists('mb_convert_encoding') AND $strEncodedData = @mb_convert_encoding($this - > strSourceText, $this - > strTargetCharset, $this - > strDefaultCharset)) {
            $blnIconvPassed = true;
            $this - > strSourceText = $strEncodedData;
        }
        return $blnIconvPassed;
    }
}

1 則留言:

匿名 提到...

nice!