在php中可以通过mcrypt系列函数来实现des的加解密,但该扩展中的函数陆续被废弃,所以我们可以使用通用的openssl方式来实现des的加解密。
推荐:《php视频教程》
php 中 des 加解密详解
一、简介
des 是对称性加密里面常见一种,全称为 data encryption standard,即数据加密标准,是一种使用密钥加密的块算法。密钥长度是64位(bit),超过位数密钥被忽略。所谓对称性加密即加密和解密密钥相同,对称性加密一般会按照固定长度,把待加密字符串分成块,不足一整块或者刚好最后有特殊填充字符。
跨语言做 des 加密解密经常会出现问题,往往是填充方式不对、编码不一致或者加密解密模式没有对应上造成。常见的填充模式有: pkcs5、pkcs7、iso10126、ansix923、zero。加密模式有:des-ecb、des-cbc、des-ctr、des-ofb、des-cfb。
作为一个软件开发者,可以通过工具测试 des 加密解密,这里推荐一个在线工具:http://tool.chacuo.net/cryptdes
二、实现
php 提供了 mcrypt 系列函数来实现 des 的加解密,但该扩展中的函数陆续被废弃,自 php 7.2.0 起,会移到 pecl。
所以本代码用了更通用的 openssl 方式实现 des 的加解密,具体的实现和使用代码如下:
<?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);
三、相关链接
des 加解密工具:http://tool.chacuo.net/cryptdes
mcrypt 官方文档:http://php.net/manual/zh/book.mcrypt.php
openssl 加解密函数官方文档:
openssl_encrypt:http://php.net/manual/zh/function.openssl-encrypt.php
openssl_decrypt:http://php.net/manual/zh/function.openssl-decrypt.php
以上就是php如何实现des加解密的详细内容。