blowfish.php

来自「架設ROSE私服必備之物 ROSE數據庫」· PHP 代码 · 共 567 行 · 第 1/2 页

PHP
567
字号
            0xACF08162, 0x5A75EBB5, 0x6E163697, 0x88D273CC,            0xDE966292, 0x81B949D0, 0x4C50901B, 0x71C65614,            0xE6C6C7BD, 0x327A140A, 0x45E1D006, 0xC3F27B9A,            0xC9AA53FD, 0x62A80F00, 0xBB25BFE2, 0x35BDD2F6,            0x71126905, 0xB2040222, 0xB6CBCF7C, 0xCD769C2B,            0x53113EC0, 0x1640E3D3, 0x38ABBD60, 0x2547ADF0,            0xBA38209C, 0xF746CE76, 0x77AFA1C5, 0x20756060,            0x85CBFE4E, 0x8AE88DD8, 0x7AAAF9B0, 0x4CF9AA7E,            0x1948C25C, 0x02FB8A8C, 0x01C36AE4, 0xD6EBE1F9,            0x90D4F869, 0xA65CDEA0, 0x3F09252D, 0xC208E69F,            0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6);    /* The number of rounds to do */    var $_rounds = 16;    /* Constructor */    function Cipher_blowfish($params = null)    {    }    /**     * Set the key to be used for en/decryption     *     * @param String $key   The key to use     */    function setKey($key)    {        $key = $this->_formatKey($key);        $keyPos = $keyXor = 0;        $iMax = count($this->p);        $keyLen = count($key);        for ($i = 0; $i < $iMax; $i++) {            for ($t = 0; $t < 4; $t++) {                $keyXor = ($keyXor << 8) | (($key[$keyPos]) & 0x0ff);                if (++$keyPos == $keyLen) {                    $keyPos = 0;                }            }            $this->p[$i] = $this->p[$i] ^ $keyXor;        }        $encZero = array('L' => 0, 'R' => 0);        for ($i = 0; $i + 1 < $iMax; $i += 2) {          $encZero = $this->_encryptBlock($encZero['L'], $encZero['R']);          $this->p[$i] = $encZero['L'];          $this->p[$i + 1] = $encZero['R'];        }        $iMax = count($this->s1);        for ($i = 0; $i < $iMax; $i += 2) {          $encZero = $this->_encryptBlock($encZero['L'], $encZero['R']);          $this->s1[$i] = $encZero['L'];          $this->s1[$i + 1] = $encZero['R'];        }        $iMax = count($this->s2);        for ($i = 0; $i < $iMax; $i += 2) {          $encZero = $this->_encryptBlock($encZero['L'], $encZero['R']);          $this->s2[$i] = $encZero['L'];          $this->s2[$i + 1] = $encZero['R'];        }        $iMax = count($this->s3);        for ($i = 0; $i < $iMax; $i += 2) {          $encZero = $this->_encryptBlock($encZero['L'], $encZero['R']);          $this->s3[$i] = $encZero['L'];          $this->s3[$i + 1] = $encZero['R'];        }        $iMax = count($this->s4);        for ($i = 0; $i < $iMax; $i += 2) {          $encZero = $this->_encryptBlock($encZero['L'], $encZero['R']);          $this->s4[$i] = $encZero['L'];          $this->s4[$i + 1] = $encZero['R'];        }    }    /**     * Return the size of the blocks that this cipher needs     *     * @return Integer  The number of characters per block     */    function getBlockSize()    {        return 8;    }    /**     * Encrypt a block on data.     *     * @param String $block         The data to encrypt     * @param optional String $key  The key to use     *     * @return String the encrypted output     */    function encryptBlock($block, $key = null)    {        if (!is_null($key)) {            $this->setKey($key);        }        list($L, $R) = array_values(unpack('N*', $block));        $parts = $this->_encryptBlock($L, $R);        return pack("NN", $parts['L'], $parts['R']);    }        /**     * Encrypt a block on data.     *     * @param String $L  The data to encrypt.     * @param String $R  The data to encrypt.     *     * @return String  The encrypted output.     */    function _encryptBlock($L, $R)    {        $L ^= $this->p[0];        $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[1];        $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[2];        $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[3];        $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[4];        $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[5];        $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[6];        $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[7];        $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[8];        $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[9];        $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[10];        $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[11];        $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[12];        $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[13];        $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[14];        $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[15];        $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[16];        $R ^= $this->p[17];        return array('L' => $R, 'R' => $L);    }    /**     * Decrypt a block on data.     *     * @param String $block         The data to decrypt     * @param optional String $key  The key to use     *     * @return String the decrypted output     */    function decryptBlock($block, $key = null)    {        if (!is_null($key)) {            $this->setKey($key);        }// change for phpMyAdmin        $L = null;        $R = null;        $retarray = array_values(unpack('N*', $block));        if (isset($retarray[0])) {            $L = $retarray[0];        }        if (isset($retarray[1])) {            $R = $retarray[1];        }// end change for phpMyAdmin        $L ^= $this->p[17];        $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[16];        $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[15];        $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[14];        $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[13];        $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[12];        $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[11];        $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[10];        $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[9];        $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[8];        $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[7];        $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[6];        $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[5];        $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[4];        $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[3];        $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[2];        $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[1];        $decrypted = pack("NN", $R ^ $this->p[0], $L);        return $decrypted;    }    /**     * Converts a text key into an array.     *     * @return array  The key.     */    function _formatKey($key)    {        return array_values(unpack('C*', $key));    }}// higher-level functions:/** * String padding * * @param   string  input string * @param   integer length of the result * @param   string  the filling string * @param   integer padding mode * * @return  string  the padded string * * @access  public */function full_str_pad($input, $pad_length, $pad_string = '', $pad_type = 0) {    $str = '';    $length = $pad_length - strlen($input);    if ($length > 0) { // str_repeat doesn't like negatives        if ($pad_type == STR_PAD_RIGHT) { // STR_PAD_RIGHT == 1            $str = $input.str_repeat($pad_string, $length);        } elseif ($pad_type == STR_PAD_BOTH) { // STR_PAD_BOTH == 2            $str = str_repeat($pad_string, floor($length/2));            $str .= $input;            $str .= str_repeat($pad_string, ceil($length/2));        } else { // defaults to STR_PAD_LEFT == 0            $str = str_repeat($pad_string, $length).$input;        }    } else { // if $length is negative or zero we don't need to do anything        $str = $input;    }    return $str;}/** * Encryption using blowfish algorithm * * @param   string  original data * @param   string  the secret * * @return  string  the encrypted result * * @access  public * * @author  lem9 */function PMA_blowfish_encrypt($data, $secret) {    $pma_cipher = new Horde_Cipher_blowfish;    $encrypt = '';    for ($i=0; $i<strlen($data); $i+=8) {        $block = substr($data, $i, 8);        if (strlen($block) < 8) {            $block = full_str_pad($block, 8, "\0", 1);        }        $encrypt .= $pma_cipher->encryptBlock($block, $secret);    }    return base64_encode($encrypt);}/** * Decryption using blowfish algorithm * * @param   string  encrypted data * @param   string  the secret * * @return  string  original data * * @access  public * * @author  lem9 */function PMA_blowfish_decrypt($encdata, $secret) {    $pma_cipher = new Horde_Cipher_blowfish;    $decrypt = '';    $data = base64_decode($encdata);    for ($i=0; $i<strlen($data); $i+=8) {        $decrypt .= $pma_cipher->decryptBlock(substr($data, $i, 8), $secret);    }    return trim($decrypt);}?>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?