PHP可逆加密解密

欢迎使用PHP可逆加密解密

开头问候语:PHP 是世界上最好的语言,可能将来会是宇宙中最好的语言,如果你想学习更多PHP知识, 可以博主更多文章,了解更多PHP专业知识。

加密方式一:

可逆加密

话不多说,直接上代码! 代码如下:

//可逆加密
function encrypt($data, $key) { 
     $prep_code = serialize($data); 
     $block = mcrypt_get_block_size('des', 'ecb'); 
     if (($pad = $block - (strlen($prep_code) % $block)) < $block) { 
     $prep_code .= str_repeat(chr($pad), $pad); 
     } 
     $encrypt = mcrypt_encrypt(MCRYPT_DES, $key, $prep_code, MCRYPT_MODE_ECB); 
     return base64_encode($encrypt); 
} 

可逆解密

话不多说,直接上代码!代码如下:

//可逆解密
function decrypt($str, $key) { 
    $str = base64_decode($str); 
    $str = mcrypt_decrypt(MCRYPT_DES, $key, $str, MCRYPT_MODE_ECB); 
    $block = mcrypt_get_block_size('des', 'ecb'); 
    $pad = ord($str[($len = strlen($str)) - 1]); 
    if ($pad && $pad < $block && preg_match('/' . chr($pad) . '{' . $pad . '}$/', $str)) { 
    $str = substr($str, 0, strlen($str) - $pad); 
    } 
    return unserialize($str); 
} 

使用如下

例子:

//加密
public function encryption(){
		$str= 'test';
 		$result = encrypt($str,'2568kihy');
 		dump($result );
}

//解密
public function decode(){
		$str= 'test';
 		$result = decrypt($str,'2568kihy');
 		dump($result );
}

加密方式二:

可逆加密/解密

话不多说,直接上代码!代码如下:

function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {   
    // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙   
    $ckey_length = 4;   
       
    // 密匙   
    $key = md5($key ? $key : $GLOBALS['discuz_auth_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));   
    }   
} 

使用如下

例子:

// 说明:函数authcode($string, $operation, $key, $expiry)中的$string:字符串,明文或密文;$operation:DECODE表示解密,其它表示加密;$key:密匙;$expiry:密文有效期。

// 使用如下
$str = 'abcdef'; 
$key = 'www.helloweba.com'; 
echo authcode($str,'ENCODE',$key,0); //加密 
$str = '56f4yER1DI2WTzWMqsfPpS9hwyoJnFP2MpC8SOhRrxO7BOk'; 
echo authcode($str,'DECODE',$key,0); //解密

加密方式三:

可逆加密/解密

话不多说,直接上代码!代码如下:

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)); 
    } 
}

使用如下

例子:

// 说明:函数encrypt($string,$operation,$key)中$string:需要加密解密的字符串;$operation:判断是加密还是解密,E表示加密,D表示解密;$key:密匙。
// 使用如下
$str = 'abc'; 
$key = 'www.helloweba.com'; 
$token = encrypt($str, 'E', $key); 
echo '加密:'.encrypt($str, 'E', $key); 
echo '解密:'.encrypt($str, 'D', $key);

加密方式四:

加密

话不多说,直接上代码! 代码如下:

  /**
     * 加密
     * @param string $string 	要加密或解密的字符串
     * @param string $operation 加密 ''  解密 DECODE
     * @param string $key		密钥,加密解密时保持一致
     * @param int    $expiry	有效时长,单位:秒
     * @return string
     */
     function encrypt_code($string, $expiry = 0, $key = 'abc12345') {
		$ckey_length = 7;
		$key = md5($key ? $key : UC_KEY); //加密解密时这个是不变的
		$keya = md5(substr($key, 0, 16)); //加密解密时这个是不变的
		$keyb = md5(substr($key, 16, 16)); //加密解密时这个是不变的
		$keyc = $ckey_length ?  substr(md5(microtime()), -$ckey_length) : '';
		$cryptkey = $keya . md5($keya . $keyc); //64
		$key_length = strlen($cryptkey); //64
 
		$string =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++) { //字母表 64位后重复 数列 范围为48~122
			$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++) {
			$result .= chr(ord($string[$i]) ^ ($box[$i]));
		
		}
	     $str =  $keyc . str_replace('=', '', urlsafe_b64encode($result));	
                 //  $str =htmlentities($str, ENT_QUOTES, "UTF-8"); // curl 访问出错
                   return $str ;
	}

解密

话不多说,直接上代码!代码如下:

 /**
     * 解密
     * @param string $string 	要加密或解密的字符串
     * @param string $operation 加密 ''  解密 DECODE
     * @param string $key		密钥,加密解密时保持一致
     * @param int    $expiry	有效时长,单位:秒
     * @return string
     */
      function encrypt_decode($string, $expiry = 0,$key = 'abc12345') {  
                             //  $string = html_entity_decode($string, ENT_QUOTES, "UTF-8") ; //curl 访问出错
		$ckey_length = 7;
		$key = md5($key ? $key : UC_KEY); //加密解密时这个是不变的
		$keya = md5(substr($key, 0, 16)); //加密解密时这个是不变的
		$keyb = md5(substr($key, 16, 16)); //加密解密时这个是不变的
              
		$keyc = $ckey_length ?  substr($string, 0, $ckey_length)   : '';
 
		$cryptkey = $keya . md5($keya . $keyc); //64
		$key_length = strlen($cryptkey); //64
		$string = urlsafe_b64decode(substr($string, $ckey_length)) ;
                $string_length = strlen($string);
		$result = '';
		$box = range(0, 255);
 
		$rndkey = array();
		for ($i = 0; $i <= 255; $i++) { //字母表 64位后重复 数列 范围为48~122
			$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++) {
			$result .= chr(ord($string[$i]) ^ ($box[$i]));
		}
           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 false;
                }
		
	}

URL加密解密函数:

加密

话不多说,直接上代码! 代码如下:

//加密函数
function lock_url($txt,$key='www.wangqianshun.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.wangqianshun.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);
}

用户密码可逆加密解密函数:

加密

话不多说,直接上代码! 代码如下:

//加密函数
function passport_encrypt($txt, $key = 'www.wangqianshun.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.wangqianshun.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; 
} 

Key

话不多说,直接上代码!代码如下:

// key
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; 
} 

SHA1的可逆加密解密函数:

加密/解密

话不多说,直接上代码! 代码如下:

	//加密/解密函数
    function dencrypt($string, $isEncrypt = true, $key = KEY_SPACE)
    {
        if (!isset($string{0}) || !isset($key{0})) {
            return false;
        }

        $dynKey = $isEncrypt ? hash('sha1', microtime(true)) : substr($string, 0, 40);
        $fixedKey = hash('sha1', $key);

        $dynKeyPart1 = substr($dynKey, 0, 20);
        $dynKeyPart2 = substr($dynKey, 20);
        $fixedKeyPart1 = substr($fixedKey, 0, 20);
        $fixedKeyPart2 = substr($fixedKey, 20);
        $key = hash('sha1', $dynKeyPart1 . $fixedKeyPart1 . $dynKeyPart2 . $fixedKeyPart2);

        $string = $isEncrypt ? $fixedKeyPart1 . $string . $dynKeyPart2 : (isset($string{339}) ? gzuncompress(base64_decode(substr($string, 40))) : base64_decode(substr($string, 40)));

        $n = 0;
        $result = '';
        $len = strlen($string);

        for ($n = 0; $n < $len; $n++) {
            $result .= chr(ord($string{$n}) ^ ord($key{$n % 40}));
        }
        return $isEncrypt ? $dynKey . str_replace('=', '', base64_encode($n > 299 ? gzcompress($result) : $result)) : substr($result, 20, -20);
    }

例子

话不多说,直接上代码!代码如下:

// 例子
$string = "Helloworld";
echo $str1 = dencrypt($string, true, "www.wangqianshun.com");
echo $str2 = dencrypt($str1, false, "www.wangqianshun.com");

DES的加密解密函数:

加密

话不多说,直接上代码! 代码如下:

//加密函数
function do_mencrypt($input, $key){
	$input = base64_encode(trim($input));
	//$key = substr(md5($key), 0, 4);
	$td = mcrypt_module_open('des', '', 'ecb', '');
	$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
	mcrypt_generic_init($td, $key, $iv);
	$encrypted_data = mcrypt_generic($td, $input);
	mcrypt_generic_deinit($td);
	mcrypt_module_close($td);
	return trim(base64_encode($encrypted_data));
}

解密

话不多说,直接上代码!代码如下:

//解密函数
function do_mdecrypt($input1, $key){
	$input1 = base64_decode(trim($input1));
	$td = mcrypt_module_open('des', '', 'ecb', '');
	//$key = substr(md5($key), 0, 4);
	$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
	mcrypt_generic_init($td, $key, $iv);
	$decrypted_data = mdecrypt_generic($td, $input1);
	mcrypt_generic_deinit($td);
	mcrypt_module_close($td);
	return trim(base64_decode($decrypted_data));
}
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值