为发数据传输的相对安全,在实际制作中,php对称加密解密相对简单有效而又很常用的选择。
对称加密函数一
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
<?php class Simple{ static function encrypt($key,$data){ $td = mcrypt_module_open("des", "", "ecb", "");//使用MCRYPT_DES算法,ecb模式 $size = mcrypt_enc_get_iv_size($td); //设置初始向量的大小 $iv = mcrypt_create_iv($size,MCRYPT_RAND); //创建初始向量 $key_size = mcrypt_enc_get_key_size($td); //返回所支持的最大的密钥长度(以字节计算) $salt = ''; $subkey = substr(md5(md5($key).$salt), 0,$key_size);//对key复杂处理,并设置长度 mcrypt_generic_init($td, $subkey, $iv); $endata = mcrypt_generic($td, $data); mcrypt_generic_deinit($td); mcrypt_module_close($td); return $endata; } static function decrypt($key,$endata){ $td = mcrypt_module_open("des", "", "ecb", "");//使用MCRYPT_DES算法,ecb模式 $size = mcrypt_enc_get_iv_size($td); //设置初始向量的大小 $iv = mcrypt_create_iv($size,MCRYPT_RAND); //创建初始向量 $key_size = mcrypt_enc_get_key_size($td); //返回所支持的最大的密钥长度(以字节计算) $salt = ''; $subkey = substr(md5(md5($key).$salt), 0,$key_size);//对key复杂处理,并设置长度 mcrypt_generic_init($td, $subkey, $iv); $data = rtrim(mdecrypt_generic($td, $endata)).'\n'; mcrypt_generic_deinit($td); mcrypt_module_close($td); // $data 的后面总是跟着一个 \n return substr($data, -2) == '\n' ? substr($data, 0, -2) : $data; } } $key = "mrdede.com"; $data = "lslfjlsdkf,哈哈--"; $endata = Simple::encrypt($key,$data); $data1 = Simple::decrypt($key,$endata); echo $endata; //直接输出,在网页上是乱码,用base64_encode处理,就变成由字符、数组、加号、斜杠等共64种字符串 echo "\n<br>\n"; echo base64_encode($endata); echo "\n<br>\n"; echo $data1; exit; |
对称加密封装函数二
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
/* * 类中,功能部分功能没有提炼,还需进一步修改 */ class Mymcrypt { // 盐值 [字符串] public $key = "mrdede.com"; function __construct($salt=''){ $this->salt = $salt; // [string] 盐值 可以为空 } // 加密 public function do_mencrypt($input) { // $key = substr(md5($this->key), 0, 24); // $td = mcrypt_module_open('des', '', 'ecb', ''); // $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, ''); $td = mcrypt_module_open(MCRYPT_RIJNDAEL_256, '', MCRYPT_MODE_ECB, ''); $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND); //没有做key size设定 $key_size = mcrypt_enc_get_key_size($td); //返回所支持的最大的密钥长度(以字节计算) // echo "==== $key_size ==="; // 32 $subkey = substr(md5(md5($this->key).$this->salt), 0,$key_size);//对key复杂处理,并设置长度 mcrypt_generic_init($td, $subkey, $iv); $encrypted_data = mcrypt_generic($td, $input); mcrypt_generic_deinit($td); mcrypt_module_close($td); // return trim(chop($this->base64url_encode($encrypted_data))); return $encrypted_data; } // 解密 //$input - stuff to decrypt public function do_mdecrypt($input) { // $key = substr(md5($this->key), 0, 24); // $td = mcrypt_module_open('des', '', 'ecb', ''); // $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, ''); $td = mcrypt_module_open(MCRYPT_RIJNDAEL_256, '', MCRYPT_MODE_ECB, ''); $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND); //没有做key size设定 $key_size = mcrypt_enc_get_key_size($td); //返回支持的最大的密钥长度(以字节计)也可自己设定比如24 $subkey = substr(md5(md5($this->key).$this->salt), 0,$key_size);////对key复杂处理,并设置长度 mcrypt_generic_init($td, $subkey, $iv); $decrypted_data = mdecrypt_generic($td, $input); mcrypt_generic_deinit($td); mcrypt_module_close($td); // return trim(chop($decrypted_data)); return $decrypted_data; } // base64在url传递过程中需要注意的 // 把base64加密后在url传输,会把“+“,”/”分别替换为”-”,”_”,以及会把末尾的等号“=”去掉。 // 另外base64加密后的长度必然是4的倍数,所以可以根据这个还原“=”号 function base64url_encode($data) { return rtrim(strtr(base64_encode($data), '+/', '-_'), '='); // return $data; //不处理会乱码 // return base64_encode($data); } function base64url_decode($data) { return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT)); } } // 用法 $myMcrypt = new Mymcrypt(); $data = 'PD867H4V9J6B'; echo "测试的数据:$data<br>"; $value = $myMcrypt->do_mencrypt($data); // 加密 // $value = $myMcrypt->base64url_encode($value); // 编码 可以使用特殊处理过的base64_encode echo "加密后未编码的:$value<br>"; // 加密后未编码的 $value = base64_encode($value); // 编码 方便在网页显示 $value = trim($value); // 有时后面会带很多预定于字符串 echo "$value <br> 长度:".strlen($value)."<br>"; // $value = $myMcrypt->base64url_decode($value); // 解码 可以使用特殊处理过的base64_decode $value = base64_decode($value); // 解码 echo "解码后未解密的:$value<br>"; // 解码后未解密的 $value = $myMcrypt->do_mdecrypt($value); // 解密 $value = trim($value); echo "$value <br>长度:".strlen($value)."<br>"; |
php中所有加密算法和模型
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
//rijndael-128,rijndael-192,rijndael-256就是AES加密,3种分别是使用不同的数据块和密钥长度进行加密。 Array ( [0] => cast-128 [1] => gost [2] => rijndael-128 [3] => twofish [4] => arcfour [5] => cast-256 [6] => loki97 [7] => rijndael-192 [8] => saferplus [9] => wake [10] => blowfish-compat [11] => des [12] => rijndael-256 [13] => serpent [14] => xtea [15] => blowfish [16] => enigma [17] => rc2 [18] => tripledes ) Array ( [0] => cbc [1] => cfb [2] => ctr [3] => ecb [4] => ncfb [5] => nofb [6] => ofb [7] => stream ) |
RSA非对称加密之PHP生成pem公钥私钥对及使用的两个实例