php版 tea 加密

<?php
/**
 * php 版的tea 加密算法,提供附件上传和下载的加密,解密功能
 * 包括  encrypt 加密  decrypt 解密    setkey 设置密钥
 * 在解密的时候需要 设置加密是补齐的位移量,避免出现多余乱码
   加密轮数 推荐8的倍数,为16或者32,php为弱语言类型,必须限定它的整型范围,字节序采用Little Endian 低位字节序
 */
/*
$key = '%9^q69LE$Omg:ion';

$t = new tea();
$jmstr = $t->readstr();

$jiami = $t->encrypt($jmstr, $key);

//$yc = strlen($date); 原长度
//$bj = 8-$yc%8;
//$t->setSign($bj);

$jimi = $t->decrypt($jiami, $key);
$zh = strlen($jimi);
$bj = $t->getSign();

//$t->writestr(substr($jimi,$bj,$zh));

*/

class tea {
    private $a, $b, $c, $d;
    private $n_iter,$sign;
    public function __construct() {
        $this->setIter ( 16 );
    }
    private function setIter($n_iter) {
        $this->n_iter = $n_iter;
    }
    private function getIter() {
        return $this->n_iter;
    }
    public function setSign($sign)
    {
    	return $this->sign=$sign;
    }
    public function getSign()
    {
    	return $this->sign;
    }
    public function encrypt($data, $key) {
        $sign = 8-strlen($data)%8;//此值为需要补齐的8的倍数值  重点
       
    	$n = $this->_resize ( $data, 8 );
        
        $data_long [0] = $sign; //加密的第一位,此值为需要补齐的8的倍数值
       // $this->setSign($sign);
         // 重点 格式化数据 按照 Little—Endian 顺序
        $n_data_long = $this->_str2long ( 1, $data, $data_long ); 

        // 格式化 key 到128位16个字节 一个字节8位
        $this->_resize ( $key, 16, true );
 
        if ('' == $key)
            $key = '0000000000000000';
           
        // convert key to long
        $n_key_long = $this->_str2long ( 0, $key, $key_long );// 重点
      
        // encrypt the long data with the key
        $enc_data = '';
        $w = array (0, 0 );
        $j = 0;
        $k = array (0, 0, 0, 0 );
        
        for($i = 0; $i < $n_data_long; $i=$i+2) { //n_data_long 为一个整型的 数据数组长度值 这个数组是存放着 转换之后的 数据值
            // get next key part of 128 bits
            if ($j + 4 <= $n_key_long) {
                $k [0] = $key_long [$j];
                $k [1] = $key_long [$j + 1];
                $k [2] = $key_long [$j + 2];
                $k [3] = $key_long [$j + 3];
            }

            $this->_encipherLong ( $data_long [$i], $data_long [$i+1], $w, $k );
           
            // append the enciphered longs to the result
            $enc_data .= $this->_long2str ( $w [0] );
            $enc_data .= $this->_long2str ( $w [1] );
        }
       
        return $enc_data;
    }
    public function decrypt($enc_data, $key) {
        // convert data to long
        $n_enc_data_long = $this->_str2long ( 0, $enc_data, $enc_data_long );
       
        // resize key to a multiple of 128 bits (16 bytes)
        $this->_resize ( $key, 16, true );
        if ('' == $key)
            $key = '0000000000000000';
           
        // convert key to long
        $n_key_long = $this->_str2long ( 0, $key, $key_long );
        
        // decrypt the long data with the key
        $data = '';
        $w = array (0, 0 );
        $j = 0;
        $len = 0;
        $k = array (0, 0, 0, 0 );
        $pos = 0;
       
        for($i = 0; $i < $n_enc_data_long; $i += 2) {
            // get next key part of 128 bits
            if ($j + 4 <= $n_key_long) {
                $k [0] = $key_long [$j];
                $k [1] = $key_long [$j + 1];
                $k [2] = $key_long [$j + 2];
                $k [3] = $key_long [$j + 3];
            }          
            $this->_decipherLong ( $enc_data_long [$i], $enc_data_long [$i + 1], $w, $k );
           if($i==0)
            {
              $this->setSign($w [0]);//截取补出来的空位
            }
          	$data .= $this->_long2str ( $w [0] );
          	$data .= $this->_long2str ( $w [1] );

        } 
            
        return $data;
    }
    private function _encipherLong($y, $z, &$w, &$k) {
        $sum = ( integer ) 0;
        $delta = 0x9e3779b9;
        
        $n = ( integer ) $this->n_iter;
        $bjz_int = PHP_INT_MAX; //整型的边界值
        while ( $n -- > 0 ) {
        	$sum += $delta;
        	
        	$y += (($z << 4) + $k[0]) ^ ($z + $sum) ^ (($z >> 5) + $k[1]);
        	
            if($y <= -$bjz_int)// 调整位移值的关键值
            {
            	$y=$y+4294967296;
            }
            else if($y >= $bjz_int)
            {
            	$y=$y-4294967296;
            } 
                      
		    $z += (($y << 4) + $k[2]) ^ ($y + $sum) ^ (($y >> 5) + $k[3]);
		    
		    // 调整位移值的关键值
            if($z <= -$bjz_int)
		    {
		    	$z=$z+4294967296;
		    }
		    else if($z >= $bjz_int)
		    {
		    	$z=$z-4294967296;
		    }
        }

        $w [0] = $y;
        $w [1] = $z;
    }
    private function _decipherLong($y, $z, &$w, &$k) {
        // sum = delta<<5, in general sum = delta * n
        $n = ( integer ) $this->n_iter;
         
        $delta = 0x9E3779B9;
        if($n==16)
        {
           $sum = 0xE3779B90;
        }
        else if($n==32)
        {
        	$sum = 0xC6EF3720;
        }
        else 
        {
        	$sum = $delta * $n;
        }
         $bjz_int = PHP_INT_MAX; //整型的边界值
        while ( $n -- > 0 ) {
             $wy=$y+$sum;// 位移调整量

           if($wy>=$bjz_int)
        	{
        		$wy = $wy-4294967296;
        	}
        	else if($wy<=-$bjz_int)
        	{
        		$wy = $wy+4294967296;
        	}
        	$z -= (($y << 4) + $k[2]) ^ ($wy) ^ (($y >> 5) + $k[3]);
        	
		    // 调整位移值的关键值
            if($z<=-$bjz_int)
		    {
		    	$z = $z+4294967296;
		    }
		    else if($z>=$bjz_int)
		    {
		    	$z = $z-4294967296;
		    }
		    
             $wz = $z+$sum;// 位移调整量
             if($wz>=$bjz_int)
        	   {
        		 $wz = $wz-4294967296;
        	   }
        	   else if($wz<=-$bjz_int)
        	   {
        		 $wz = $wz+4294967296;
        	   }
		    $y -= (($z << 4) + $k[0]) ^ ($wz) ^ (($z >> 5) + $k[1]);
		    
		    // 调整位移值的关键值
		   if($y<=-$bjz_int)
		    {
		    	$y = $y+4294967296;
		    }
		    else if($y>=$bjz_int)
		    {
		    	$y = $y-4294967296;
		    }	    

		    $sum -= $delta;
            if($sum>=$bjz_int)//调整sum步数
		    {
		    	$sum = $sum-4294967296;
		    }
		    else if ($sum<=-$bjz_int)
		    {
		    	$sum = $sum+4294967296;
		    }
            }
            
        $w [0] = $y;
        $w [1] = $z;

    }
    private function _resize(&$data, $size, $nonull = false) {
        $dach='';// 重点
    	$n = strlen ( $data );  
    	if($data=='%9^q69LE$Omg:ion')//修改密钥
    //	if($data=='lzm0FfyAtjAOc6:y')//修改密钥
    	{
    		$nmod = $n % $size;
    	}
    	else {
    		$nmod = 8-$n%$size-4;
    	}   

         if($nmod>0)//大于0 就补齐空位
         {
         	for($i=0;$i<$nmod;$i++)
            	{
            	  $dach .= chr(0);//为了测试写为固定值
            	}
          	$data = $dach.$data; //补齐空位 方便移位
         }
        return $n;
    }
   
    private function _str2long($start, &$data, &$data_long) {
        
    	$n = strlen ( $data );
        
        $tmp = unpack ( 'V*', $data );//无符号长整形 高位在前 低位在后
        
        $j = $start;
       
        foreach ( $tmp as $value )
        {
           $data_long [$j ++] = $value;
        }
        
        return $j;
    }
    private function _long2str($l) {
        return pack ( 'V', $l );
    }

  //记录日志的函数
  function writelog($str)
  {
    $showtime = date("Y-m-d H:i:s");
	$file = "/home/nemo/data/jmlog/jmlog.log";
	$file_pointer = fopen($file,"a");
	fwrite($file_pointer,$showtime." #5880 Message: ");
	fwrite($file_pointer,$str."\r\n");
	fclose($file_pointer);
	
  	
  }
  //读文件
   function readstr() {
	$fpath = "/home/nemo/apache/htdocs/tea/sysbian.txt";
	$ftext = file_get_contents($fpath);
	return $ftext;
   }
// 写文件
   function writestr($str) {
	$fpath = "/home/nemo/apache2/htdocs/tea/sysbian.txt";
	$fp = fopen ( $fpath, 'a' );
	fwrite ( $fp, $str );
	fclose ( $fp );
  }
  //提供函数的计算时间
    function get_microtime(){  
       list($usec, $sec) = explode(' ', microtime());  
       return ((float)$usec + (float)$sec);  
}
}
	

?>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Tea语言又称(Tealang)是一种新的计算机编程语言,采用强规范设计(规范即语法),拥有简约的强类型系统和单元模块体系,支持类型推断,支持面向对象和函数式编程,语法精炼简洁。其目标是成为一个友好的,支持多端开发的编程语言,并尽量支持常用编程语言生态,让开发者可以继续使用已有工作成果。目前通过编译生成PHP代码运行,可调用PHP库,可用于Web服务器端开发。预计后续将支持部分其它编程语言。 Tea语言非常注重语法的友好性,通过对语法进行优化设计,希望开发者可以更轻松自然的编写代码,可以更专注于创意实现。也尽量保持了常用编程语言的语法风格和习惯,以降低学习成本。 Tea语言项目最早开始于19年2月份,项目初衷主要是用于提升内部开发效率和实现产品功能,最初特性较少,在完善和优化后,于19年12月初首次发布开源。 Tea语言特性: 强规范,规范即语法,简洁清晰 简约的,带类型推断的强类型系统,编译时将进行类型推断与检查 便捷的XView类型,非常适合用于Web视图组件开发 智能的Return Collector特性,可自动按类型捕获数据到数组作为返回值 有限的类型兼容性,数据操作便捷而不失安全性 内置类型被封装成伪对象,支持对象成员风格调用,如:"Some string".length 内置单元模块(Unit)体系,基于单元模块组织程序,和访问控制 无普通全局变量,变量作用域最高为普通函数层级,无需担心全局变量污染问题 字符串处理语法灵活、简单而强大 流程控制语法灵活、简约、统一(所有都支持catch/finally分支,for支持else分支) 运算符规则简单有规律,易于记忆 支持Lambda表达式和普通函数,函数是一等公民 支持类和接口,接口可带默认实现,面向对象特性简单而不失强大 支持普通函数、普通常量、类和接口的访问控制(public/internal) 支持类/接口成员的访问控制(public/internal/protected/private) 通过编译生成目标语言代码的方式运行 Tea语言安装和使用: 安装PHP 7.2+,编译器和编译输出的程序依赖PHP 7.2或以上本运行环境 安装好PHP后,将PHP执行文件所在目录添加到操作系统环境变量 将Tea语言项目克隆到本地(或其它方式下载,但需保证Tea语言项目的目录名称为tea)  # clone with the Git client  git clone https://github.com/tealang/tea.git 将当前目录切换到tea的上级目录中,执行如下命令即可编译示例程序:  # use the normal method  php tea/bin/tea tea/examples 如使用Mac或Linux系统,可使用Shebang方式,如:  # lets the scripts could be execute  chmod +x tea/bin/*  # use the Shebang method  tea/bin/tea tea/docs 在编译目标Unit的dist目录中可看到编译结果 创建或初始化一个新的Unit,如:  php tea/bin/tea --init myproject/hello
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值