wangyongdong
9/16/2019 - 6:37 AM

php几种加密解密方法

<?php

class EncryptFacade extends BaseFacade
{
    /**
     * @param string $input 加密字符串
     * @param string $key   key
     * @return string
     */
    public static function encrypt($input, $key = '')
    {
        $size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
        $pad = $size - (strlen($input) % $size);
        $input = $input . str_repeat(chr($pad), $pad);
        $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, '');
        $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
        mcrypt_generic_init($td, $key, $iv);
        $data = mcrypt_generic($td, $input);
        mcrypt_generic_deinit($td);
        mcrypt_module_close($td);
        $data = base64_encode(urlencode($data));
        return $data;
    }

    /**
     * @param string $sStr  解密字符串
     * @param string $key   key
     * @return bool|string
     */
    public static function decrypt($sStr, $key = '')
    {
        $decrypted = mcrypt_decrypt(
            MCRYPT_RIJNDAEL_128,
            $key,
            urldecode(base64_decode($sStr)),
            MCRYPT_MODE_ECB
        );
        $dec_s = strlen($decrypted);
        $padding = ord($decrypted[$dec_s - 1]);
        $decrypted = substr($decrypted, 0, -$padding);
        return $decrypted;
    }

    /**
     * aes加密
     * @param string $input 加密字符串
     * @return string
     */
    public static function newAesEncrypt($input)
    {
        $key = self::random(16, '1234567890abcdefghijklmnopqrstuvwxyz');//随机生成16位key

        $size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);//128位时为16
        $pad = $size - (strlen($input) % $size);//取得补码的长度
        $input = $input . str_repeat(chr($pad), $pad); //用ASCII码为补码长度的字符, 补足最后一段

        $data = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $input, MCRYPT_MODE_ECB);
        $data = base64_encode($data);
        //key拼在字符串前
        $data = $key . $data;
        return $data;
    }

    /**
     * aes 解密
     * @param string $sStr 解密字符串
     * @return string
     */
    public static function newAseDecrypt($sStr)
    {
        //取出前16位为key
        $sKey = substr($sStr, 0, 16);
        $sStr = substr($sStr, 16);

        $decrypted = mcrypt_decrypt(
            MCRYPT_RIJNDAEL_128,
            $sKey,
            base64_decode($sStr),
            MCRYPT_MODE_ECB
        );
        $dec_s = strlen($decrypted);
        $padding = ord($decrypted[$dec_s - 1]);
        $decrypted = substr($decrypted, 0, -$padding);
        return $decrypted;
    }

    //   加密解密
    public static function random($length, $chars = '1234567890')
    {
        $hash = '';
        $max = strlen($chars) - 1;
        for ($i = 0; $i < $length; $i++) {
            $hash .= $chars[mt_rand(0, $max)];
        }
        return $hash;
    }
}

$signature = AESMcrypt::encrypt('text');
$check = AESMcrypt::encrypt($signature);
echo $check;
<?php
/**
 * 加密函数
 */
header("Content-Type:text/html;charset=utf-8");

// authcode 加密解密
// 非常给力的authcode加密函数,Discuz!经典代码(带详解)
// 函数authcode($string, $operation, $key, $expiry)中的
// $string:字符串,明文或密文;
// $operation:DECODE表示解密,其它表示加密;
// $key:密匙;
// $expiry:密文有效期。
define('UC_KEY', 's20aE2FbZatdF1ZdY3TcWaha4dceu0jfxaB9DaW000B6r9Ndi961F0x3a2N4gdg0');
function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0)
{
    $ckey_length = 4;    // 随机密钥长度 取值 0-32; // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙
    // 加入随机密钥,可以令密文无任何规律,即便是原文和密钥完全相同,加密结果也会每次不同,增大破解难度。
    // 取值越大,密文变动规律越大,密文变化 = 16 的 $ckey_length 次方
    // 当此值为 0 时,则不产生随机密钥

    // 密匙
    $key = md5($key ? $key : UC_KEY);

    // 密匙a会参与加解密
    $keya = md5(substr($key, 0, 16));
    // 密匙b会用来做数据完整性验证
    $keyb = md5(substr($key, 16, 16));
    // 密匙c用于变化生成的密文
    $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length) : substr(md5(microtime()), -$ckey_length)) : '';

    // 参与运算的密匙
    $cryptkey = $keya.md5($keya.$keyc);
    $key_length = strlen($cryptkey);

    // 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),
    // 解密时会通过这个密匙验证数据完整性
    // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确
    $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry+time() : 0).substr(md5($string.$keyb), 0, 16).$string;
    $string_length = strlen($string);

    $result = '';
    $box = range(0, 255);

    // 产生密匙簿
    $rndkey = array();
    for ($i = 0; $i <= 255; $i++) {
        $rndkey[$i] = ord($cryptkey[$i%$key_length]);
    }
    // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度
    for ($j = $i = 0; $i < 256; $i++) {
        $j = ($j+$box[$i]+$rndkey[$i])%256;
        $tmp = $box[$i];
        $box[$i] = $box[$j];
        $box[$j] = $tmp;
    }
    // 核心加解密部分
    for ($a = $j = $i = 0; $i < $string_length; $i++) {
        $a = ($a+1)%256;
        $j = ($j+$box[$a])%256;
        $tmp = $box[$a];
        $box[$a] = $box[$j];
        $box[$j] = $tmp;
        // 从密匙簿得出密匙进行异或,再转成字符
        $result .= chr(ord($string[$i]) ^ ($box[($box[$a]+$box[$j])%256]));
    }

    if ($operation == 'DECODE') {
        // 验证数据有效性,请看未加密明文的格式
        if ((substr($result, 0, 10) == 0 || substr($result, 0, 10)-time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
            return substr($result, 26);
        }
        else {
            return '';
        }
    }
    else {
        // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因
        // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码
        return $keyc.str_replace('=', '', base64_encode($result));
    }
}

// 加密
$str = 555025 . '-wangyd';
$sid = authcode($str, 'ENCODE');
echo $sid . '<br/>';

// 解密
$str = authcode($sid, 'DECODE'); //解密cookie
echo $str . '<hr/>';
<?php
//函数encrypt($string,$operation,$key)中$string:需要加密解密的字符串;$operation:判断是加密还是解密,E表示加密,D表示解密;$key:密匙。
function encrypt($string, $operation, $key = '')
{
    $key = md5($key);
    $key_length = strlen($key);
    $string = $operation == 'D' ? base64_decode($string) : substr(md5($string.$key), 0, 8).$string;
    $string_length = strlen($string);
    $rndkey = $box = array();
    $result = '';
    for ($i = 0; $i <= 255; $i++) {
        $rndkey[$i] = ord($key[$i%$key_length]);
        $box[$i] = $i;
    }
    for ($j = $i = 0; $i < 256; $i++) {
        $j = ($j+$box[$i]+$rndkey[$i])%256;
        $tmp = $box[$i];
        $box[$i] = $box[$j];
        $box[$j] = $tmp;
    }
    for ($a = $j = $i = 0; $i < $string_length; $i++) {
        $a = ($a+1)%256;
        $j = ($j+$box[$a])%256;
        $tmp = $box[$a];
        $box[$a] = $box[$j];
        $box[$j] = $tmp;
        $result .= chr(ord($string[$i]) ^ ($box[($box[$a]+$box[$j])%256]));
    }
    if ($operation == 'D') {
        if (substr($result, 0, 8) == substr(md5(substr($result, 8).$key), 0, 8)) {
            return substr($result, 8);
        }
        else {
            return '';
        }
    }
    else {
        return str_replace('=', '', base64_encode($result));
    }
}

$str = 'abc';
$key = 'www.helloweba.com';
$token = encrypt($str, 'E', $key);
echo '加密前:' . $str . '<br/>';
echo '加密后:'.encrypt($str, 'E', $key) . '<br/>';
echo '解密:'.encrypt($token, 'D', $key) . '<br/>';
<?php
// 加密函数
function lock_url($txt, $key = 'www.wangyd.com')
{
    $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+";
    $nh = rand(0, 64);
    $ch = $chars[$nh];
    $mdKey = md5($key.$ch);
    $mdKey = substr($mdKey, $nh%8, $nh%8+7);
    $txt = base64_encode($txt);
    $tmp = '';
    $i = 0;
    $j = 0;
    $k = 0;
    for ($i = 0; $i < strlen($txt); $i++) {
        $k = $k == strlen($mdKey) ? 0 : $k;
        $j = ($nh+strpos($chars, $txt[$i])+ord($mdKey[$k++]))%64;
        $tmp .= $chars[$j];
    }
    return urlencode($ch.$tmp);
}

// 解密函数
function unlock_url($txt, $key = 'www.wangyd.com')
{
    $txt = urldecode($txt);
    $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+";
    $ch = $txt[0];
    $nh = strpos($chars, $ch);
    $mdKey = md5($key.$ch);
    $mdKey = substr($mdKey, $nh%8, $nh%8+7);
    $txt = substr($txt, 1);
    $tmp = '';
    $i = 0;
    $j = 0;
    $k = 0;
    for ($i = 0; $i < strlen($txt); $i++) {
        $k = $k == strlen($mdKey) ? 0 : $k;
        $j = strpos($chars, $txt[$i])-$nh-ord($mdKey[$k++]);
        while ($j < 0)
            $j += 64;
        $tmp .= $chars[$j];
    }
    return base64_decode($tmp);
}
// 加密
$str = lock_url('Hello 北京');
echo $str.'<br/>';
// 解密
$txt = unlock_url($str);
echo $txt.'<br/>';
<?php

function passport_encrypt($txt, $key = 'www.zhuoyuexiazai.com')
{
    srand((double)microtime()*1000000);
    $encrypt_key = md5(rand(0, 32000));
    $ctr = 0;
    $tmp = '';
    for ($i = 0; $i < strlen($txt); $i++) {
        $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
        $tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
    }
    return urlencode(base64_encode(passport_key($tmp, $key)));
}

function passport_decrypt($txt, $key = 'www.zhuoyuexiazai.com')
{
    $txt = passport_key(base64_decode(urldecode($txt)), $key);
    $tmp = '';
    for ($i = 0; $i < strlen($txt); $i++) {
        $md5 = $txt[$i];
        $tmp .= $txt[++$i] ^ $md5;
    }
    return $tmp;
}

function passport_key($txt, $encrypt_key)
{
    $encrypt_key = md5($encrypt_key);
    $ctr = 0;
    $tmp = '';
    for ($i = 0; $i < strlen($txt); $i++) {
        $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
        $tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
    }
    return $tmp;
}


$txt = "1";
$key = "testkey";
$encrypt = passport_encrypt($txt, $key);
$decrypt = passport_decrypt($encrypt, $key);

echo $encrypt."<br>";
echo $decrypt."<br>";
<?php
/**
 * @param $aParams 请求参数数组
 * @return string 加密签名
 */
function sign($aParams) {
    $sign_key = "As&#7643kdj^53?_7rfG@kgfj";
    $queryString = "";
    unset($aParams['sign']);

    // 对加密数组进行字典排序,将Key和Value拼接
    if (is_array($aParams) && !empty($aParams) && ksort($aParams)) {
        foreach ($aParams as $key => $value) {
            if (strlen($value) != 0) {
                $queryString .= $key . "=" . $value;
            }
        }
    }
    // 通过md5加密并转化为大写
    $string = strtoupper(md5($queryString));

    // 拼接key 并md5加密
    return md5(md5($string) . 'key=' . md5($sign_key));
}
$aParams = $_REQUEST;
echo sign($aParams);