php对称加密算法(DES/AES)类功能实例

前端之家收集整理的这篇文章主要介绍了php对称加密算法(DES/AES)类功能实例前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
PHP对称加密算法(DES/AES)类代码感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧!
  1. /**
  2. * PHP对称加密算法(DES/AES)类代码
  3. *
  4. * @param
  5. * @arrange 512-笔记网: www.www.jb51.cc
  6. **/
  7. /**
  8. * 常用对称加密算法类
  9. * 支持密钥:64/128/256 bit(字节长度8/16/32)
  10. * 支持算法:DES/AES(根据密钥长度自动匹配使用:DES:64bit AES:128/256bit)
  11. * 支持模式:CBC/ECB/OFB/CFB
  12. * 密文编码:base64字符串/十六进制字符串/二进制字符串流
  13. * 填充方式: PKCS5Padding(DES)
  14. */
  15. class Xcrypt{
  16. private $mcrypt;
  17. private $key;
  18. private $mode;
  19. private $iv;
  20. private $blocksize;
  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. $this->key = $key;
  43. switch (strtolower($mode)){
  44. case 'ofb':
  45. $this->mode = MCRYPT_MODE_OFB;
  46. if ($iv == 'off') die('OFB must give a IV'); //OFB必须有向量
  47. break;
  48. case 'cfb':
  49. $this->mode = MCRYPT_MODE_CFB;
  50. if ($iv == 'off') die('CFB must give a IV'); //CFB必须有向量
  51. break;
  52. case 'ecb':
  53. $this->mode = MCRYPT_MODE_ECB;
  54. $iv = 'off'; //ECB不需要向量
  55. break;
  56. case 'cbc':
  57. default:
  58. $this->mode = MCRYPT_MODE_CBC;
  59. }
  60. switch (strtolower($iv)){
  61. case "off":
  62. $this->iv = null;
  63. break;
  64. case "auto":
  65. $source = PHP_OS=='WINNT' ? MCRYPT_RAND : MCRYPT_DEV_RANDOM;
  66. $this->iv = mcrypt_create_iv(mcrypt_get_block_size($this->mcrypt,$this->mode),$source);
  67. break;
  68. default:
  69. $this->iv = $iv;
  70. }
  71. }
  72. /**
  73. * 获取向量值
  74. * @param string 向量值编码(base64/hex/bin)
  75. * @return string 向量值
  76. */
  77. public function getIV($code = 'base64'){
  78. switch ($code){
  79. case 'base64':
  80. $ret = base64_encode($this->iv);
  81. break;
  82. case 'hex':
  83. $ret = bin2hex($this->iv);
  84. break;
  85. case 'bin':
  86. default:
  87. $ret = $this->iv;
  88. }
  89. return $ret;
  90. }
  91. /**
  92. * 加密
  93. * @param string 明文
  94. * @param string 密文编码(base64/hex/bin)
  95. * @return string 密文
  96. */
  97. public function encrypt($str,$code = 'base64'){
  98. if ($this->mcrypt == MCRYPT_DES) $str = $this->_pkcs5Pad($str);
  99. if (isset($this->iv)) {
  100. $result = mcrypt_encrypt($this->mcrypt,$this->key,$str,$this->mode,$this->iv);
  101. } else {
  102. @$result = mcrypt_encrypt($this->mcrypt,$this->mode);
  103. }
  104. switch ($code){
  105. case 'base64':
  106. $ret = base64_encode($result);
  107. break;
  108. case 'hex':
  109. $ret = bin2hex($result);
  110. break;
  111. case 'bin':
  112. default:
  113. $ret = $result;
  114. }
  115. return $ret;
  116. }
  117. /**
  118. * 解密
  119. * @param string 密文
  120. * @param string 密文编码(base64/hex/bin)
  121. * @return string 明文
  122. */
  123. public function decrypt($str,$code = "base64"){
  124. $ret = false;
  125. switch ($code){
  126. case 'base64':
  127. $str = base64_decode($str);
  128. break;
  129. case 'hex':
  130. $str = $this->_hex2bin($str);
  131. break;
  132. case 'bin':
  133. default:
  134. }
  135. if ($str !== false){
  136. if (isset($this->iv)) {
  137. $ret = mcrypt_decrypt($this->mcrypt,$this->iv);
  138. } else {
  139. @$ret = mcrypt_decrypt($this->mcrypt,$this->mode);
  140. }
  141. if ($this->mcrypt == MCRYPT_DES) $ret = $this->_pkcs5Unpad($ret);
  142. }
  143. return $ret;
  144. }
  145. private function _pkcs5Pad($text){
  146. $this->blocksize = mcrypt_get_block_size($this->mcrypt,$this->mode);
  147. $pad = $this->blocksize - (strlen($text) % $this->blocksize);
  148. return $text . str_repeat(chr($pad),$pad);
  149. }
  150. private function _pkcs5Unpad($text){
  151. $pad = ord($text{strlen($text) - 1});
  152. if ($pad > strlen($text)) return false;
  153. if (strspn($text,chr($pad),strlen($text) - $pad) != $pad) return false;
  154. $ret = substr($text,-1 * $pad);
  155. return $ret;
  156. }
  157. private function _hex2bin($hex = false){
  158. $ret = $hex !== false && preg_match('/^[0-9a-fA-F]+$/i',$hex) ? pack("H*",$hex) : false;
  159. return $ret;
  160. }
  161. }
  162. /*** 来自编程之家 jb51.cc(jb51.cc) ***/
给个小demo吧
  1. /**
  2. * PHP对称加密算法(DES/AES)类代码
  3. *
  4. * @param
  5. * @arrange 512-笔记网: www.www.jb51.cc
  6. **/
  7. <?PHP
  8. header('Content-Type:text/html;Charset=utf-8;');
  9. include "xcrypt.PHP";
  10. echo '<pre>';
  11. //////////////////////////////////////
  12. $a = isset($_GET['a']) ? $_GET['a'] : '测试123';
  13. //密钥
  14. $key = '12345678123456781234567812345678'; //256 bit
  15. $key = '1234567812345678'; //128 bit
  16. $key = '12345678'; //64 bit
  17. //设置模式和IV
  18. $m = new Xcrypt($key,'cbc','auto');
  19. //获取向量值
  20. echo '向量:';
  21. var_dump($m->getIV());
  22. //加密
  23. $b = $m->encrypt($a,'base64');
  24. //解密
  25. $c = $m->decrypt($b,'base64');
  26. echo '加密后:';
  27. var_dump($b);
  28. echo '解密后:';
  29. var_dump($c);
  30. /////////////////////////////////////////
  31. echo '</pre>';
  32. /*** 来自编程之家 jb51.cc(jb51.cc) ***/

猜你在找的PHP相关文章