123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- <?php
- /**
- * Created by PhpStorm.
- * User: kangjianjun
- * Date: 2017/3/1
- * Time: 16:40
- */
- namespace yii\helpers;
- use yii\base\Exception;
- use yii\web\HttpException;
- class Crypto {
- public static function safe_base64decode($string){
- $data = str_replace(array('-','_'),array('+','/'),$string);
- $mod4 = strlen($data) % 4;
- if ($mod4) {
- $data .= substr('====', $mod4);
- }
- return base64_decode($data);
- }
- public static function safe_base64encode($string){
- $data = base64_encode($string);
- $data = str_replace(array('+','/','='),array('-','_',''),$data);
- return $data;
- }
- public static function encrypt($data,$key){
- try{
- $key = md5($key);
- $x = 0;
- $len = strlen($data);
- $l = strlen($key);
- $char = '';
- for ($i = 0; $i < $len; $i++)
- {
- if ($x == $l)
- {
- $x = 0;
- }
- $char .= $key{$x};
- $x++;
- }
- $str = '';
- $str_base = '';
- for ($i = 0; $i < $len; $i++)
- {
- $str .= chr(ord($data{$i}) + (ord($char{$i})) % 256);
- $str_base = $str_base .'+'.base64_encode(chr(ord($data{$i}) + (ord($char{$i})) % 256));
- }
- return base64_encode($str);
- }catch(Exception $e){
- return $e;
- }
- }
- public static function decrypt($data,$key){
- $key = md5($key);
- $x = 0;
- $char = '';
- $data = base64_decode($data);
- $len = strlen($data);
- $l = strlen($key);
- for ($i = 0; $i < $len; $i++)
- {
- if ($x == $l)
- {
- $x = 0;
- }
- $char .= substr($key, $x, 1);
- $x++;
- }
- $str = '';
- for ($i = 0; $i < $len; $i++)
- {
- if (ord(substr($data, $i, 1)) < ord(substr($char, $i, 1)))
- {
- $str .= chr((ord(substr($data, $i, 1)) + 256) - ord(substr($char, $i, 1)));
- }
- else
- {
- $str .= chr(ord(substr($data, $i, 1)) - ord(substr($char, $i, 1)));
- }
- }
- return $str;
- }
- /**
- * 3des
- */
- // public static function safe_encrypt($input,$key,$iv = ''){
- // $size = mcrypt_get_block_size(MCRYPT_3DES,MCRYPT_MODE_CBC);
- // $input = self::pkcs5_pad($input, $size);
- // $key = str_pad($key,24,'0');
- // $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');
- // if( $iv == '' )
- // {
- // $iv = @mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
- // }
- //
- // @mcrypt_generic_init($td, $key, $iv);
- // $data = mcrypt_generic($td, $input);
- // mcrypt_generic_deinit($td);
- // mcrypt_module_close($td);
- // $data = base64_encode($data);
- // return $data;
- // }
- // public static function safe_decrypt($encrypted,$key,$iv = ''){
- // $encrypted = base64_decode($encrypted);
- // $key = str_pad($key,24,'0');
- // $td = mcrypt_module_open(MCRYPT_3DES,'',MCRYPT_MODE_CBC,'');
- // if( $iv == '' )
- // {
- // $iv = @mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
- // }
- // $ks = mcrypt_enc_get_key_size($td);
- // @mcrypt_generic_init($td, $key, $iv);
- // $decrypted = mdecrypt_generic($td, $encrypted);
- // mcrypt_generic_deinit($td);
- // mcrypt_module_close($td);
- // $y=self::pkcs5_unpad($decrypted);
- // return $y;
- // }
- //
- // private static function pkcs5_pad ($text, $blocksize) {
- // $pad = $blocksize - (strlen($text) % $blocksize);
- // return $text . str_repeat(chr($pad), $pad);
- // }
- // private static function pkcs5_unpad($text){
- // $pad = ord($text{strlen($text)-1});
- // if ($pad > strlen($text)) {
- // return false;
- // }
- // if (strspn($text, chr($pad), strlen($text) - $pad) != $pad){
- // return false;
- // }
- // return substr($text, 0, -1 * $pad);
- // }
- // private static function PaddingPKCS7($data) {
- // $block_size = mcrypt_get_block_size(MCRYPT_3DES, MCRYPT_MODE_CBC);
- // $padding_char = $block_size - (strlen($data) % $block_size);
- // $data .= str_repeat(chr($padding_char),$padding_char);
- // return $data;
- // }
- /**
- * AES
- */
- private static function addPkcs7Padding($string, $blocksize = 32) {
- $len = strlen($string); //取得字符串长度
- $pad = $blocksize - ($len % $blocksize); //取得补码的长度
- $string .= str_repeat(chr($pad), $pad); //用ASCII码为补码长度的字符, 补足最后一段
- return $string;
- }
- public static function aes256cbcEncrypt($str,$key, $iv ) {
- return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key,self::addPkcs7Padding($str) , MCRYPT_MODE_CBC, $iv));
- }
- private static function stripPkcs7Padding($string){
- $slast = ord(substr($string, -1));
- $slastc = chr($slast);
- $pcheck = substr($string, -$slast);
- if(preg_match("/$slastc{".$slast."}/", $string)){
- $string = substr($string, 0, strlen($string)-$slast);
- return $string;
- } else {
- return false;
- }
- }
- public static function aes256cbcDecrypt($encryptedText, $key, $iv) {
- $encryptedText =base64_decode($encryptedText);
- return self::stripPkcs7Padding(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $encryptedText, MCRYPT_MODE_CBC, $iv));
- }
- public static function aes128cbcDecrypt($encryptedText, $key, $iv) {
- $encryptedText =base64_decode($encryptedText);
- return self::stripPkcs7Padding(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $encryptedText, MCRYPT_MODE_CBC, $iv));
- }
- private static function hexToStr($hex)//十六进制转字符串
- {
- $string="";
- for($i=0;$i<strlen($hex)-1;$i+=2)
- $string.=chr(hexdec($hex[$i].$hex[$i+1]));
- return $string;
- }
- private static function strToHex($string)//字符串转十六进制
- {
- $hex="";
- $tmp="";
- for($i=0;$i<strlen($string);$i++)
- {
- $tmp = dechex(ord($string[$i]));
- $hex.= strlen($tmp) == 1 ? "0".$tmp : $tmp;
- }
- $hex=strtoupper($hex);
- return $hex;
- }
- public static function aes128cbcHexDecrypt($encryptedText, $key,$iv) {
- $str = self::hexToStr($encryptedText);
- return self::stripPkcs7Padding(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $str, MCRYPT_MODE_CBC, $iv));
- }
- public static function aes128cbcEncrypt($str, $key,$iv) { // $this->addPkcs7Padding($str,16)
- $base = (mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key,self::addPkcs7Padding($str,16) , MCRYPT_MODE_CBC, $iv));
- return self::strToHex($base);
- }
- }
|