常用对称加密算法(DES/AES)类(PHP)

简介: 看注释,啥也不说了,欢迎各种跨平台测试!   /**   * 常用对称加密算法类   * 支持密钥:64/128/256 bit(字节长度8/16/32)   * 支持算法:DES/AES(根据密钥长度自动匹配使用:DES:64bit AES:128/256bit)   * 支持模式:...

看注释,啥也不说了,欢迎各种跨平台测试!

 

  1. /** 
  2.  * 常用对称加密算法类 
  3.  * 支持密钥:64/128/256 bit(字节长度8/16/32) 
  4.  * 支持算法:DES/AES(根据密钥长度自动匹配使用:DES:64bit AES:128/256bit) 
  5.  * 支持模式:CBC/ECB/OFB/CFB 
  6.  * 密文编码:base64字符串/十六进制字符串/二进制字符串流 
  7.  * 填充方式: PKCS5Padding(DES) 
  8.  * 
  9.  * @author: linvo 
  10.  * @version: 1.0.0 
  11.  * @date: 2013/1/10 
  12.  */  
  13. class Xcrypt{  
  14.   
  15.     private $mcrypt;  
  16.     private $key;  
  17.     private $mode;  
  18.     private $iv;  
  19.     private $blocksize;  
  20.   
  21.     /** 
  22.      * 构造函数 
  23.      * 
  24.      * @param string 密钥 
  25.      * @param string 模式 
  26.      * @param string 向量("off":不使用 / "auto":自动 / 其他:指定值,长度同密钥) 
  27.      */  
  28.     public function __construct($key, $mode = 'cbc', $iv = "off"){  
  29.         switch (strlen($key)){  
  30.         case 8:  
  31.             $this->mcrypt = MCRYPT_DES;  
  32.             break;  
  33.         case 16:  
  34.             $this->mcrypt = MCRYPT_RIJNDAEL_128;  
  35.             break;  
  36.         case 32:  
  37.             $this->mcrypt = MCRYPT_RIJNDAEL_256;  
  38.             break;  
  39.         default:  
  40.             die("Key size must be 8/16/32");  
  41.         }  
  42.   
  43.         $this->key = $key;  
  44.   
  45.         switch (strtolower($mode)){  
  46.         case 'ofb':  
  47.             $this->mode = MCRYPT_MODE_OFB;  
  48.             if ($iv == 'off') die('OFB must give a IV'); //OFB必须有向量  
  49.             break;  
  50.         case 'cfb':  
  51.             $this->mode = MCRYPT_MODE_CFB;  
  52.             if ($iv == 'off') die('CFB must give a IV'); //CFB必须有向量  
  53.             break;  
  54.         case 'ecb':  
  55.             $this->mode = MCRYPT_MODE_ECB;  
  56.             $iv = 'off'; //ECB不需要向量  
  57.             break;  
  58.         case 'cbc':  
  59.         default:  
  60.             $this->mode = MCRYPT_MODE_CBC;  
  61.         }  
  62.   
  63.         switch (strtolower($iv)){  
  64.         case "off":  
  65.             $this->iv = null;  
  66.             break;  
  67.         case "auto":  
  68.             $source = PHP_OS=='WINNT' ? MCRYPT_RAND : MCRYPT_DEV_RANDOM;  
  69.             $this->iv = mcrypt_create_iv(mcrypt_get_block_size($this->mcrypt, $this->mode), $source);  
  70.             break;  
  71.         default:  
  72.             $this->iv = $iv;  
  73.         }  
  74.   
  75.      
  76.     }  
  77.   
  78.   
  79.     /** 
  80.      * 获取向量值 
  81.      * @param string 向量值编码(base64/hex/bin) 
  82.      * @return string 向量值 
  83.      */  
  84.     public function getIV($code = 'base64'){  
  85.         switch ($code){  
  86.         case 'base64':  
  87.             $ret = base64_encode($this->iv);  
  88.             break;  
  89.         case 'hex':  
  90.             $ret = bin2hex($this->iv);  
  91.             break;  
  92.         case 'bin':  
  93.         default:  
  94.             $ret = $this->iv;  
  95.         }  
  96.         return $ret;  
  97.     }  
  98.   
  99.   
  100.     /** 
  101.      * 加密 
  102.      * @param string 明文 
  103.      * @param string 密文编码(base64/hex/bin) 
  104.      * @return string 密文 
  105.      */  
  106.     public function encrypt($str, $code = 'base64'){  
  107.         if ($this->mcrypt == MCRYPT_DES) $str = $this->_pkcs5Pad($str);  
  108.   
  109.         if (isset($this->iv)) {  
  110.             $result = mcrypt_encrypt($this->mcrypt, $this->key, $str, $this->mode, $this->iv);    
  111.         } else {  
  112.             @$result = mcrypt_encrypt($this->mcrypt, $this->key, $str, $this->mode);    
  113.         }  
  114.   
  115.         switch ($code){  
  116.         case 'base64':  
  117.             $ret = base64_encode($result);  
  118.             break;  
  119.         case 'hex':  
  120.             $ret = bin2hex($result);  
  121.             break;  
  122.         case 'bin':  
  123.         default:  
  124.             $ret = $result;  
  125.         }  
  126.    
  127.         return $ret;  
  128.    
  129.     }  
  130.   
  131.     /** 
  132.      * 解密  
  133.      * @param string 密文 
  134.      * @param string 密文编码(base64/hex/bin) 
  135.      * @return string 明文 
  136.      */  
  137.     public function decrypt($str, $code = "base64"){      
  138.         $ret = false;  
  139.   
  140.         switch ($code){  
  141.         case 'base64':  
  142.             $str = base64_decode($str);  
  143.             break;  
  144.         case 'hex':  
  145.             $str = $this->_hex2bin($str);  
  146.             break;  
  147.         case 'bin':  
  148.         default:  
  149.         }  
  150.   
  151.         if ($str !== false){  
  152.             if (isset($this->iv)) {  
  153.                 $ret = mcrypt_decrypt($this->mcrypt, $this->key, $str, $this->mode, $this->iv);    
  154.             } else {  
  155.                 @$ret = mcrypt_decrypt($this->mcrypt, $this->key, $str, $this->mode);    
  156.             }  
  157.             if ($this->mcrypt == MCRYPT_DES) $ret = $this->_pkcs5Unpad($ret);  
  158.             $ret = trim($ret);  
  159.         }  
  160.   
  161.         return $ret;   
  162.     }   
  163.   
  164.   
  165.   
  166.     private function _pkcs5Pad($text){  
  167.         $this->blocksize = mcrypt_get_block_size($this->mcrypt, $this->mode);    
  168.         $pad = $this->blocksize - (strlen($text) % $this->blocksize);  
  169.         return $text . str_repeat(chr($pad), $pad);  
  170.     }  
  171.   
  172.     private function _pkcs5Unpad($text){  
  173.         $pad = ord($text{strlen($text) - 1});  
  174.         if ($pad > strlen($text)) return false;  
  175.         if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false;  
  176.         $ret = substr($text, 0, -1 * $pad);  
  177.         return $ret;  
  178.     }  
  179.   
  180.     private function _hex2bin($hex = false){  
  181.         $ret = $hex !== false && preg_match('/^[0-9a-fA-F]+$/i', $hex) ? pack("H*", $hex) : false;      
  182.         return $ret;  
  183.     }  
  184.   
  185.   
  186.   
  187. }  


给个小demo吧

 

 

    1. <?php  
    2. header('Content-Type:text/html;Charset=utf-8;');  
    3.   
    4. include "xcrypt.php";  
    5.   
    6. echo '<pre>';  
    7. //////////////////////////////////////  
    8. $a = isset($_GET['a']) ? $_GET['a'] : '测试123';  
    9.   
    10. //密钥  
    11. $key = '12345678123456781234567812345678'; //256 bit  
    12. $key = '1234567812345678'; //128 bit  
    13. $key = '12345678'; //64 bit  
    14.   
    15. //设置模式和IV  
    16. $m = new Xcrypt($key, 'cbc', 'auto');  
    17.   
    18. //获取向量值  
    19. echo '向量:';  
    20. var_dump($m->getIV());  
    21.   
    22. //加密  
    23. $b = $m->encrypt($a, 'base64');  
    24. //解密  
    25. $c = $m->decrypt($b, 'base64');  
    26.   
    27. echo '加密后:';  
    28. var_dump($b);  
    29. echo '解密后:';  
    30. var_dump($c);  
    31.   
    32.   
    33. /////////////////////////////////////////  
    34. echo '</pre>';  
如何联系我:【万里虎】www.bravetiger.cn 【QQ】3396726884 (咨询问题100元起,帮助解决问题500元起) 【博客】http://www.cnblogs.com/kenshinobiy/
目录
相关文章
|
7月前
|
存储 算法 安全
控制局域网电脑上网的 PHP 哈希表 IP 黑名单过滤算法
本文设计基于哈希表的IP黑名单过滤算法,利用O(1)快速查找特性,实现局域网电脑上网的高效管控。通过PHP关联数组构建黑名单,支持实时拦截、动态增删与自动过期清理,适用于50-500台终端场景,显著降低网络延迟,提升管控灵活性与响应速度。
300 8
|
10月前
|
机器学习/深度学习 算法 安全
深度长文I 深度合成服务类-算法备案该怎么做?
本文详解“深度合成服务类”算法及其备案要求,涵盖定义、类型、备案流程等内容,助你全面理解合规要点。
|
10月前
|
存储 缓存 安全
php项目源码加密之Zend Guard Loader加密的代码解密可能性很小-优雅草卓伊凡
php项目源码加密之Zend Guard Loader加密的代码解密可能性很小-优雅草卓伊凡
494 2
|
11月前
|
运维 监控 算法
局域网屏幕监控软件 PHP 图像块增量传输算法解析
本文探讨了一种基于PHP语言开发的图像块增量传输算法,适用于局域网屏幕监控场景。通过将屏幕图像分块处理、计算哈希值并对比变化区域,该算法显著降低了网络带宽占用,提升了监控效率。在企业管理和远程教育中,该技术可实现终端设备的实时监控与远程管控,同时支持与生物识别等技术融合,拓展应用范围。实验表明,该算法在常规办公场景下可减少90%以上的数据传输量,展现了良好的实时性和优化效果。
204 3
|
算法 安全 数据安全/隐私保护
基于AES的遥感图像加密算法matlab仿真
本程序基于MATLAB 2022a实现,采用AES算法对遥感图像进行加密与解密。主要步骤包括:将彩色图像灰度化并重置大小为256×256像素,通过AES的字节替换、行移位、列混合及轮密钥加等操作完成加密,随后进行解密并验证图像质量(如PSNR值)。实验结果展示了原图、加密图和解密图,分析了图像直方图、相关性及熵的变化,确保加密安全性与解密后图像质量。该方法适用于保护遥感图像中的敏感信息,在军事、环境监测等领域具有重要应用价值。
550 35
|
存储 监控 算法
公司员工电脑监控软件剖析:PHP 布隆过滤器算法的应用与效能探究
在数字化办公的浪潮下,公司员工电脑监控软件成为企业管理的重要工具,它能够帮助企业了解员工的工作状态、保障数据安全以及提升工作效率。然而,随着监控数据量的不断增长,如何高效地处理和查询这些数据成为了关键问题。布隆过滤器(Bloom Filter)作为一种高效的概率型数据结构,在公司员工电脑监控软件中展现出独特的优势,本文将深入探讨 PHP 语言实现的布隆过滤器算法在该软件中的应用。
206 1
|
11月前
|
算法 安全 数据安全/隐私保护
基于AES的图像加解密算法matlab仿真,带GUI界面
本程序基于AES算法实现图像的加解密功能,并提供MATLAB GUI界面操作,支持加密与解密。运行环境为MATLAB 2022A,测试结果无水印。核心代码通过按钮回调函数完成AES加密与解密流程,包括字节替换、行移位、列混淆及密钥加等步骤。解密过程为加密逆向操作,确保数据安全性与完整性。完整程序结合128位块加密与可选密钥长度,适用于图像信息安全场景。
|
Linux PHP 数据安全/隐私保护
2024授权加密系统PHP网站源码
2024授权加密系统PHP网站源码
639 58
|
存储 监控 算法
单位电脑监控软件中 PHP 哈希表算法的深度剖析与理论探究
数字化办公的时代背景下,单位电脑监控软件已成为企业维护信息安全、提升工作效率的关键工具。此类软件可全面监测员工的电脑操作行为,收集海量数据,故而高效管理和处理这些数据显得尤为重要。数据结构与算法在此过程中发挥着核心作用。本文将聚焦于哈希表这一在单位电脑监控软件中广泛应用的数据结构,并通过 PHP 语言实现相关功能,为优化单位电脑监控软件提供技术支持。
211 3
|
存储 监控 算法
论内网电脑监控软件中 PHP 哈希表算法的深度剖析与探究
当代企业网络管理体系中,内网电脑监控软件占据着关键地位。其功能涵盖对员工电脑操作行为的实时监测,以此维护企业信息安全,同时助力企业优化网络资源配置,提升整体工作效能。在构建内网电脑监控软件的诸多技术中,数据结构与算法构成了核心支撑体系。本文聚焦于哈希表这一重要数据结构,深入剖析其在 PHP 语言环境下,如何为内网电脑监控软件的高效运作提供助力,并通过详实的代码示例予以阐释。
217 3