Crypto.php 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: kangjianjun
  5. * Date: 2017/3/1
  6. * Time: 16:40
  7. */
  8. namespace yii\helpers;
  9. use yii\base\Exception;
  10. use yii\web\HttpException;
  11. class Crypto {
  12. public static function safe_base64decode($string){
  13. $data = str_replace(array('-','_'),array('+','/'),$string);
  14. $mod4 = strlen($data) % 4;
  15. if ($mod4) {
  16. $data .= substr('====', $mod4);
  17. }
  18. return base64_decode($data);
  19. }
  20. public static function safe_base64encode($string){
  21. $data = base64_encode($string);
  22. $data = str_replace(array('+','/','='),array('-','_',''),$data);
  23. return $data;
  24. }
  25. public static function encrypt($data,$key){
  26. try{
  27. $key = md5($key);
  28. $x = 0;
  29. $len = strlen($data);
  30. $l = strlen($key);
  31. $char = '';
  32. for ($i = 0; $i < $len; $i++)
  33. {
  34. if ($x == $l)
  35. {
  36. $x = 0;
  37. }
  38. $char .= $key{$x};
  39. $x++;
  40. }
  41. $str = '';
  42. $str_base = '';
  43. for ($i = 0; $i < $len; $i++)
  44. {
  45. $str .= chr(ord($data{$i}) + (ord($char{$i})) % 256);
  46. $str_base = $str_base .'+'.base64_encode(chr(ord($data{$i}) + (ord($char{$i})) % 256));
  47. }
  48. return base64_encode($str);
  49. }catch(Exception $e){
  50. return $e;
  51. }
  52. }
  53. public static function decrypt($data,$key){
  54. $key = md5($key);
  55. $x = 0;
  56. $char = '';
  57. $data = base64_decode($data);
  58. $len = strlen($data);
  59. $l = strlen($key);
  60. for ($i = 0; $i < $len; $i++)
  61. {
  62. if ($x == $l)
  63. {
  64. $x = 0;
  65. }
  66. $char .= substr($key, $x, 1);
  67. $x++;
  68. }
  69. $str = '';
  70. for ($i = 0; $i < $len; $i++)
  71. {
  72. if (ord(substr($data, $i, 1)) < ord(substr($char, $i, 1)))
  73. {
  74. $str .= chr((ord(substr($data, $i, 1)) + 256) - ord(substr($char, $i, 1)));
  75. }
  76. else
  77. {
  78. $str .= chr(ord(substr($data, $i, 1)) - ord(substr($char, $i, 1)));
  79. }
  80. }
  81. return $str;
  82. }
  83. /**
  84. * 3des
  85. */
  86. // public static function safe_encrypt($input,$key,$iv = ''){
  87. // $size = mcrypt_get_block_size(MCRYPT_3DES,MCRYPT_MODE_CBC);
  88. // $input = self::pkcs5_pad($input, $size);
  89. // $key = str_pad($key,24,'0');
  90. // $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');
  91. // if( $iv == '' )
  92. // {
  93. // $iv = @mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
  94. // }
  95. //
  96. // @mcrypt_generic_init($td, $key, $iv);
  97. // $data = mcrypt_generic($td, $input);
  98. // mcrypt_generic_deinit($td);
  99. // mcrypt_module_close($td);
  100. // $data = base64_encode($data);
  101. // return $data;
  102. // }
  103. // public static function safe_decrypt($encrypted,$key,$iv = ''){
  104. // $encrypted = base64_decode($encrypted);
  105. // $key = str_pad($key,24,'0');
  106. // $td = mcrypt_module_open(MCRYPT_3DES,'',MCRYPT_MODE_CBC,'');
  107. // if( $iv == '' )
  108. // {
  109. // $iv = @mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
  110. // }
  111. // $ks = mcrypt_enc_get_key_size($td);
  112. // @mcrypt_generic_init($td, $key, $iv);
  113. // $decrypted = mdecrypt_generic($td, $encrypted);
  114. // mcrypt_generic_deinit($td);
  115. // mcrypt_module_close($td);
  116. // $y=self::pkcs5_unpad($decrypted);
  117. // return $y;
  118. // }
  119. //
  120. // private static function pkcs5_pad ($text, $blocksize) {
  121. // $pad = $blocksize - (strlen($text) % $blocksize);
  122. // return $text . str_repeat(chr($pad), $pad);
  123. // }
  124. // private static function pkcs5_unpad($text){
  125. // $pad = ord($text{strlen($text)-1});
  126. // if ($pad > strlen($text)) {
  127. // return false;
  128. // }
  129. // if (strspn($text, chr($pad), strlen($text) - $pad) != $pad){
  130. // return false;
  131. // }
  132. // return substr($text, 0, -1 * $pad);
  133. // }
  134. // private static function PaddingPKCS7($data) {
  135. // $block_size = mcrypt_get_block_size(MCRYPT_3DES, MCRYPT_MODE_CBC);
  136. // $padding_char = $block_size - (strlen($data) % $block_size);
  137. // $data .= str_repeat(chr($padding_char),$padding_char);
  138. // return $data;
  139. // }
  140. /**
  141. * AES
  142. */
  143. private static function addPkcs7Padding($string, $blocksize = 32) {
  144. $len = strlen($string); //取得字符串长度
  145. $pad = $blocksize - ($len % $blocksize); //取得补码的长度
  146. $string .= str_repeat(chr($pad), $pad); //用ASCII码为补码长度的字符, 补足最后一段
  147. return $string;
  148. }
  149. public static function aes256cbcEncrypt($str,$key, $iv ) {
  150. return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key,self::addPkcs7Padding($str) , MCRYPT_MODE_CBC, $iv));
  151. }
  152. private static function stripPkcs7Padding($string){
  153. $slast = ord(substr($string, -1));
  154. $slastc = chr($slast);
  155. $pcheck = substr($string, -$slast);
  156. if(preg_match("/$slastc{".$slast."}/", $string)){
  157. $string = substr($string, 0, strlen($string)-$slast);
  158. return $string;
  159. } else {
  160. return false;
  161. }
  162. }
  163. public static function aes256cbcDecrypt($encryptedText, $key, $iv) {
  164. $encryptedText =base64_decode($encryptedText);
  165. return self::stripPkcs7Padding(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $encryptedText, MCRYPT_MODE_CBC, $iv));
  166. }
  167. public static function aes128cbcDecrypt($encryptedText, $key, $iv) {
  168. $encryptedText =base64_decode($encryptedText);
  169. return self::stripPkcs7Padding(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $encryptedText, MCRYPT_MODE_CBC, $iv));
  170. }
  171. private static function hexToStr($hex)//十六进制转字符串
  172. {
  173. $string="";
  174. for($i=0;$i<strlen($hex)-1;$i+=2)
  175. $string.=chr(hexdec($hex[$i].$hex[$i+1]));
  176. return $string;
  177. }
  178. private static function strToHex($string)//字符串转十六进制
  179. {
  180. $hex="";
  181. $tmp="";
  182. for($i=0;$i<strlen($string);$i++)
  183. {
  184. $tmp = dechex(ord($string[$i]));
  185. $hex.= strlen($tmp) == 1 ? "0".$tmp : $tmp;
  186. }
  187. $hex=strtoupper($hex);
  188. return $hex;
  189. }
  190. public static function aes128cbcHexDecrypt($encryptedText, $key,$iv) {
  191. $str = self::hexToStr($encryptedText);
  192. return self::stripPkcs7Padding(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $str, MCRYPT_MODE_CBC, $iv));
  193. }
  194. public static function aes128cbcEncrypt($str, $key,$iv) { // $this->addPkcs7Padding($str,16)
  195. $base = (mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key,self::addPkcs7Padding($str,16) , MCRYPT_MODE_CBC, $iv));
  196. return self::strToHex($base);
  197. }
  198. }