用PHP的方法解DES加密

发布网友 发布时间:2022-04-28 05:14

我来回答

2个回答

懂视网 时间:2022-04-28 09:36

在php中可以通过Mcrypt系列函数来实现des的加解密,但该扩展中的函数陆续被废弃,所以我们可以使用通用的OPENSSL方式来实现DES的加解密。

推荐:《PHP视频教程》

PHP 中 DES 加解密详解

一、简介

DES 是对称性加密里面常见一种,全称为 Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法。密钥长度是位(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 输出格式 无、base、hex
 */
 protected $output;
 /**
 * @var string $iv 加解密的向量
 */
 protected $iv;
 /**
 * @var string $options
 */
 protected $options;
 // output 的类型
 const OUTPUT_NULL = '';
 const OUTPUT_BASE = 'base';
 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
 * base、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_BASE) {
  $sign = base_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_BASE) {
  $encrypted = base_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_BASE, $iv);
echo $baseSign = $des->encrypt('Hello DES CBC');
echo "
";
echo $des->decrypt($baseSign);
echo "
";
// DES ECB 加解密
$des = new DES($key, 'DES-ECB', DES::OUTPUT_HEX);
echo $baseSign = $des->encrypt('Hello DES ECB');
echo "
";
echo $des->decrypt($baseSign);

三、相关链接

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

热心网友 时间:2022-04-28 06:44

<?php
$key ='LY870513';
$ctext = 'j45Rrzxm0jD62U1w798yBg==';
$ptext = mcrypt_decrypt ( MCRYPT_DES, $key , base_decode($ctext), MCRYPT_MODE_CBC, "\x12\x34\x56\120\x90\xab\xcd\xef");
//echo iconv('UTF-8','GBK',$ptext); //GBK环境使用,UTF8环境多余不用
echo $ptext; //UTF8环境用

20219241337

由于不清楚原代码的块链接模式,暂时用的CBC,对于短数据可解出。

追问你好,用这种方法解出的数据和正确答案很接近,但是少了一位。
比如:Z2p0+qeuDe6P5C4OqiFvgw== 对应的答案是779019012754
解出来的是77919012754,第四位应该是个0的,但是没有,其它的结果也是这样。请问这是为什么呢?

已经解决了,谢谢。

追答可能是你原文中就少写了0,编码不会丢0呀..

怎么解决的?

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com