Maison >développement back-end >tutoriel php >Exemple de tutoriel du cryptage aes (encapsulation) d'ecshop

Exemple de tutoriel du cryptage aes (encapsulation) d'ecshop

零下一度
零下一度original
2017-06-28 10:38:511681parcourir

D'une entreprise qui fait du shopex et de l'ecstore à une entreprise qui fait de l'ecshop en b2b... Il est temps de le mettre en pratique. Ne parlons pas d'autre chose. Comprenons d'abord ce qu'est le cryptage AES de PHP ?

aes (Advanced Encryption Standard), la longueur de bloc d'AES est fixée à 128 bits, et la longueur de clé peut être de 128, 192 ou 256 bits ; c'est une méthode de cryptage réversible, différente de md5.

AES est divisé en plusieurs modes, tels que ECB, CBC, CFB, etc. Sauf pour ECB qui n'est pas très sûr car il n'utilise pas IV, la différence entre les autres modes n'est pas trop évidente. les différences sont entre IV et La méthode de calcul du texte chiffré par KEY est légèrement différente.

Quel est le rôle de l'IV ?

IV est appelé le vecteur initial. Les chaînes cryptées des différents IV sont différentes. Le cryptage et le déchiffrement nécessitent le même IV. Puisque le IV ressemble à la clé, il y a un IV supplémentaire pour le but. à chaque bloc, la clé reste inchangée, mais seul le IV du premier bloc est fourni par l'utilisateur, et les IV des autres blocs sont générés automatiquement.
La longueur de IV est de 16 octets. S'il est supérieur ou inférieur, les bibliothèques qui pourraient être implémentées le compléteront ou le tronqueront. Mais comme la longueur du bloc est de 16 octets, on peut généralement considérer que le IV requis est de 16 octets.

Maintenant que vous avez une certaine compréhension de l’aes, commençons à coder.

<?phpclass cryptaes{protected $cipher = MCRYPT_RIJNDAEL_128;protected $mode = MCRYPT_MODE_ECB;protected $pad_method = &#39;&#39;;protected $secret_key = &#39;&#39;;protected $iv = &#39;&#39;; public function set_cipher($cipher)
    {$this->cipher = $cipher;
    } public function set_mode($mode)
    {$this->mode = $mode;
    } public function set_iv($iv)
    {$this->iv = $iv;
    } public function set_key($key)
    {$this->secret_key = $key;
    } public function require_pkcs5()
    {$this->pad_method = 'pkcs5';
    } protected function pad_or_unpad($str, $ext)
    {if ( is_null($this->pad_method) )
        {return $str;
        }else{$func_name = __CLASS__ . '::' . $this->pad_method . '_' . $ext . 'pad';if ( is_callable($func_name) )
            {$size = mcrypt_get_block_size($this->cipher, $this->mode);return call_user_func($func_name, $str, $size);
            }
        }return $str;
    } protected function pad($str)
    {return $this->pad_or_unpad($str, '');
    } protected function unpad($str)
    {return $this->pad_or_unpad($str, 'un');
    }     //加密类public function encrypt($str)
    {print_r($str);$str = $this->pad($str);$td = mcrypt_module_open($this->cipher, '', $this->mode, ''); if ( empty($this->iv) )
        {$iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
        }else{$iv = $this->iv;
        }
 
        mcrypt_generic_init($td, $this->secret_key, $iv);$cyper_text = mcrypt_generic($td, $str);$rt=base64_encode($cyper_text);//$rt = bin2hex($cyper_text);mcrypt_generic_deinit($td);
        mcrypt_module_close($td); return $rt;
    }     //解密类public function decrypt($str){$td = mcrypt_module_open($this->cipher, '', $this->mode, ''); if ( empty($this->iv) )
        {$iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
        }else{$iv = $this->iv;
        }
 
        mcrypt_generic_init($td, $this->secret_key, $iv);//$decrypted_text = mdecrypt_generic($td, self::hex2bin($str));$decrypted_text = mdecrypt_generic($td, base64_decode($str));$rt = $decrypted_text;
        mcrypt_generic_deinit($td);
        mcrypt_module_close($td); return $this->unpad($rt);
    } public static function hex2bin($hexdata) {$bindata = '';$length = strlen($hexdata);for ($i=0; $i < $length; $i += 2)
        {$bindata .= chr(hexdec(substr($hexdata, $i, 2)));
        }return $bindata;
    } public static function pkcs5_pad($text, $blocksize)
    {$pad = $blocksize - (strlen($text) % $blocksize);return $text . str_repeat(chr($pad), $pad);
    } public 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);
    }
}?>

La classe d'empaquetage de chiffrement et de décryptage aes est encapsulée si nécessaire :

require_once(ROOT_PATH . 'includes/lib_smt_cryptaes.php'); //ecshop引入文件方式$aes_obj     = new cryptaes();$iv         = '12345678baiducom';$privateKey = '12345678baiducom';$data['a'] =  ‘周二’;$data['b'] =  ‘周三’;$data['c'] =  ‘周四’;$da = json_encode($data);$aes_obj->set_key($privateKey);$aes_obj->require_pkcs5();$aes_obj->set_iv($iv);$il = $aes_obj->encrypt($da);//写入cookiesetcookie('il', $il,time()+360000); //加密结果$il

Je veux la transmettre. voici un tableau. Il convient de noter que aes ne peut chiffrer que des chaînes. Doit être converti en chaîne.

         = ['il'(ROOT_PATH . 'includes/lib_smt_cryptaes.php'     =      = '12345678baiducom';         = '12345678baiducom'->set_key(->->set_iv( = ->decrypt( = json_decode(,);    
       print_r($j_token);//解密结果

Ceci termine le cryptage et la transmission des aes.

Nous invitons tout le monde à poser des questions, à communiquer et à grandir ensemble.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn