MarkJane
4/18/2017 - 2:28 AM

PHP的加解密 包括RSA,RES/AES 以及自定义的加解密方式

PHP的加解密 包括RSA,RES/AES 以及自定义的加解密方式

<?php 
defined('IN_TS') or die('Access Denied.');
//加密解密函数
class  crypt{ 

	protected $key = "";    //公钥 

	private function keyED($txt,$encrypt_key) { 
		$encrypt_key = md5($encrypt_key); 
		$ctr=0; 
		$tmp = ""; 
		for ($i=0;$i<strlen($txt);$i++) { 
			if ($ctr==strlen($encrypt_key)){ 
				$ctr=0; 
			} 
			$tmp.= substr($txt,$i,1) ^ substr($encrypt_key,$ctr,1); 
			$ctr++; 
		} 
		return $tmp; 
	} 

	public function encrypt($txt,$key="") { 
		if(empty($key)){ 
			$key=$this->key; 
		} 
		srand((double)microtime()*1000000); 
		$encrypt_key = md5(rand(0,32000)); 
		$ctr=0; 
		$tmp = ""; 
		for ($i=0;$i<strlen($txt);$i++) { 
			if ($ctr==strlen($encrypt_key)){ 
				$ctr=0; 
			} 
			$tmp.= substr($encrypt_key,$ctr,1) . 
			(substr($txt,$i,1) ^ substr($encrypt_key,$ctr,1)); 
			$ctr++; 
		} 
		return $this->SetToHexString($this->keyED($tmp,$key)); 
	} 

	public function decrypt($txt,$key="") { 
		if(empty($key)){ 
			$key=$this->key; 
		} 

		$txt = $this->UnsetFromHexString($txt);
		
		$txt = $this->keyED($txt,$key); 
		$tmp = ""; 
		for ($i=0;$i<strlen($txt);$i++) { 
			$md5 = substr($txt,$i,1); 
			$i++; 
			$tmp.= (substr($txt,$i,1) ^ $md5); 
		} 
		return $tmp; 
	} 

	public function setKey($key) { 
		if(empty($key)){ 
			return null; 
		} 
		$this->key=$key; 
	} 

	public function getKey() { 
		return $this->key; 
	} 
	
	
	
	//////////////////////////此处一下转16进制
	public function SingleDecToHex($dec)
	{
		$tmp="";
		$dec=$dec%16;
		if($dec<10)
			return $tmp.$dec;
		$arr=array("a","b","c","d","e","f");
		return $tmp.$arr[$dec-10];
	}
	public function SingleHexToDec($hex)
	{
		$v=ord($hex);
		if(47<$v&&$v<58)
			return $v-48;
		if(96<$v&&$v<103)
			return $v-87;
	}
	public function SetToHexString($str)
	{
		if(!$str)return false;
		$tmp="";
		for($i=0;$i<strlen($str);$i++)
		{
			$ord=ord($str[$i]);
			$tmp.=$this->SingleDecToHex(($ord-$ord%16)/16);
			$tmp.=$this->SingleDecToHex($ord%16);
		}
		return $tmp;
	}
	public function UnsetFromHexString($str)
	{
		if(!$str)return false;
		$tmp="";
		for($i=0;$i<strlen($str);$i+=2)
		{
			$tmp.=chr($this->SingleHexToDec(substr($str,$i,1))*16+$this->SingleHexToDec(substr($str,$i+1,1)));
		}
		return $tmp;
	} 
	
/*
echo SetToHexString("hello,大家好123");
echo "<hr>";
echo UnsetFromHexString(SetToHexString("hello,大家好123"));
*/
	

} 
/*
$crypt= new crypt(); 
$enc_text = $crypt->encrypt('123456','wwwthinksaascn2012'); 
$dec_text = $crypt->decrypt($enc_text,'wwwthinksaascn2012'); 
*/
<?php
/**
* 字符串加密、解密函数
*
*
* @param	string	$txt		字符串
* @param	string	$operation	ENCODE为加密,DECODE为解密,可选参数,默认为ENCODE,
* @param	string	$key		密钥:数字、字母、下划线
* @param	string	$expiry		过期时间
* @return	string
*/
function sys_auth($string, $operation = 'ENCODE', $key = '', $expiry = 0) {
	$ckey_length = 4;
	$key = md5($key != '' ? $key : pc_base::load_config('system', 'auth_key'));
	$keya = md5(substr($key, 0, 16));
	$keyb = md5(substr($key, 16, 16));
	$keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';

	$cryptkey = $keya.md5($keya.$keyc);
	$key_length = strlen($cryptkey);

	$string = $operation == 'DECODE' ? base64_decode(strtr(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 {
		return $keyc.rtrim(strtr(base64_encode($result), '+/', '-_'), '=');
	}
}