Maison > Article > développement back-end > Comment implémenter le cryptage et le décryptage en php
En PHP, vous pouvez utiliser la série de fonctions Mcrypt pour implémenter le cryptage et le déchiffrement DES, mais les fonctions de cette extension ont été progressivement abandonnées, nous pouvons donc utiliser la méthode générale OPENSSL pour implémenter le cryptage et le déchiffrement DES.
Recommandé : "Tutoriel vidéo PHP"
Explication détaillée du cryptage et du décryptage DES en PHP
1. Introduction
DES est un type courant de cryptage symétrique. Le nom complet est Data Encryption Standard, qui est une norme de cryptage de données. bloquer chiffré à l’aide d’un algorithme de clé. La longueur de la clé est de 64 bits (bit) et la clé dépassant le nombre de bits est ignorée. Le cryptage dit symétrique signifie que les clés de cryptage et de déchiffrement sont identiques. Le cryptage symétrique divise généralement la chaîne à crypter en blocs selon une longueur fixe, qui est inférieure à un bloc entier ou il y a un caractère de remplissage spécial au niveau du bloc. fin.
Des problèmes surviennent souvent lors du cryptage et du déchiffrement DES dans plusieurs langues, souvent causés par des méthodes de remplissage incorrectes, un encodage incohérent ou des modes de cryptage et de déchiffrement incompatibles. Les modes de remplissage courants sont : pkcs5, pkcs7, iso10126, ansix923, zéro. Les modes de cryptage incluent : DES-ECB, DES-CBC, DES-CTR, DES-OFB et DES-CFB.
En tant que développeur de logiciels, vous pouvez tester le cryptage et le décryptage DES grâce à des outils Voici un outil en ligne recommandé : http://tool.chacuo.net/cryptdes
2. Implémentation
PHP fournit la série de fonctions Mcrypt pour implémenter le cryptage et le déchiffrement DES, mais les fonctions de cette extension ont été progressivement abandonnées et seront déplacées vers PECL à partir de PHP 7.2.0.
Ce code utilise donc la méthode OPENSSL plus générale pour implémenter le cryptage et le déchiffrement DES. Le code d'implémentation et d'utilisation spécifique est le suivant :
<?php /** * openssl 实现的 DES 加密类,支持各种 PHP 版本 */ class DES { /** * @var string $method 加解密方法,可通过 openssl_get_cipher_methods() 获得 */ protected $method; /** * @var string $key 加解密的密钥 */ protected $key; /** * @var string $output 输出格式 无、base64、hex */ protected $output; /** * @var string $iv 加解密的向量 */ protected $iv; /** * @var string $options */ protected $options; // output 的类型 const OUTPUT_NULL = ''; const OUTPUT_BASE64 = 'base64'; const OUTPUT_HEX = 'hex'; /** * DES constructor. * @param string $key * @param string $method * ECB DES-ECB、DES-EDE3 (为 ECB 模式时,$iv 为空即可) * CBC DES-CBC、DES-EDE3-CBC、DESX-CBC * CFB DES-CFB8、DES-EDE3-CFB8 * CTR * OFB * * @param string $output * base64、hex * * @param string $iv * @param int $options */ public function __construct($key, $method = 'DES-ECB', $output = '', $iv = '', $options = OPENSSL_RAW_DATA | OPENSSL_NO_PADDING) { $this->key = $key; $this->method = $method; $this->output = $output; $this->iv = $iv; $this->options = $options; } /** * 加密 * * @param $str * @return string */ public function encrypt($str) { $str = $this->pkcsPadding($str, 8); $sign = openssl_encrypt($str, $this->method, $this->key, $this->options, $this->iv); if ($this->output == self::OUTPUT_BASE64) { $sign = base64_encode($sign); } else if ($this->output == self::OUTPUT_HEX) { $sign = bin2hex($sign); } return $sign; } /** * 解密 * * @param $encrypted * @return string */ public function decrypt($encrypted) { if ($this->output == self::OUTPUT_BASE64) { $encrypted = base64_decode($encrypted); } else if ($this->output == self::OUTPUT_HEX) { $encrypted = hex2bin($encrypted); } $sign = @openssl_decrypt($encrypted, $this->method, $this->key, $this->options, $this->iv); $sign = $this->unPkcsPadding($sign); $sign = rtrim($sign); return $sign; } /** * 填充 * * @param $str * @param $blocksize * @return string */ private function pkcsPadding($str, $blocksize) { $pad = $blocksize - (strlen($str) % $blocksize); return $str . str_repeat(chr($pad), $pad); } /** * 去填充 * * @param $str * @return string */ private function unPkcsPadding($str) { $pad = ord($str{strlen($str) - 1}); if ($pad > strlen($str)) { return false; } return substr($str, 0, -1 * $pad); } } $key = 'key123456'; $iv = 'iv123456'; // DES CBC 加解密 $des = new DES($key, 'DES-CBC', DES::OUTPUT_BASE64, $iv); echo $base64Sign = $des->encrypt('Hello DES CBC'); echo "\n"; echo $des->decrypt($base64Sign); echo "\n"; // DES ECB 加解密 $des = new DES($key, 'DES-ECB', DES::OUTPUT_HEX); echo $base64Sign = $des->encrypt('Hello DES ECB'); echo "\n"; echo $des->decrypt($base64Sign);
Liens connexes
<.> Outil de cryptage et décryptage DES : http://tool.chacuo.net/cryptdesDocument officiel Mcrypt : http://php.net/manual/zh/book.mcrypt.phpOPENSSL Documentation officielle des fonctions de chiffrement et de décryptage : openssl_encrypt : http://php.net/manual/zh/function.openssl-encrypt.phpopenssl_decrypt : http:// php.net/manual /zh/function.openssl-decrypt.php
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!