当前位置:网站首页>PHP 基础篇 - PHP 中 DES 加解密详解
PHP 基础篇 - PHP 中 DES 加解密详解
2022-07-05 01:25:00 【狂野小青年】
一、简介
DES 是对称性加密里面常见一种,全称为 Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法。密钥长度是64位(bit),超过位数密钥被忽略。所谓对称性加密即加密和解密密钥相同,对称性加密一般会按照固定长度,把待加密字符串分成块,不足一整块或者刚好最后有特殊填充字符。
跨语言做 DES 加密解密经常会出现问题,往往是填充方式不对、编码不一致或者加密解密模式没有对应上造成。
- 填充模式:pkcs5、pkcs7、iso10126、ansix923、zero。
- 加密模式:DES-ECB、DES-CBC、DES-CTR、DES-OFB、DES-CFB。
- 输出类型:无编码,base64编码,hex编码。
作为一个软件开发者,可以通过工具测试 DES 加密解密,这里推荐一个在线工具:http://tool.chacuo.net/cryptdes
二、实现
PHP 提供了 Mcrypt 系列函数来实现 DES 的加解密,但该扩展中的函数陆续被废弃,自 PHP 7.2.0 起,会移到 PECL。
所以本代码用了更通用的 OPENSSL 方式实现 DES 的加解密,具体的实现和使用代码如下:
<?php
/**
* Created by PhpStorm.
* Title:DES加解密类
* User: Wanzhou Chen
* Date: 2022/04/24
* Time: 22:00
*/
namespace crypt;
class DES
{
const OUTPUT_NULL = '';
const OUTPUT_BASE64 = 'base64';
const OUTPUT_HEX = 'hex';
/**
* @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;
/**
* 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 = self::OUTPUT_NULL, $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->padding($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 $str
* @param $blockSize
* @return string
* @internal param $blocksize
*/
private function padding($str, $blockSize)
{
$pad = $blockSize - (strlen($str) % $blockSize);
return $str . str_repeat(chr($pad), $pad);
}
/**
* 解密
*
* @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->unPadding($sign);
$sign = rtrim($sign);
return $sign;
}
/**
* 去填充
*
* @param $str
* @return string
*/
private function unPadding($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);三、相关链接
1.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
边栏推荐
- 潘多拉 IOT 开发板学习(RT-Thread)—— 实验4 蜂鸣器+马达实验【按键外部中断】(学习笔记)
- There is a new Post-00 exam king in the testing department. I really can't do it in my old age. I have
- Global and Chinese market of nutrient analyzer 2022-2028: Research Report on technology, participants, trends, market size and share
- [CTF] AWDP summary (WEB)
- [microprocessor] VHDL development of microprocessor based on FPGA
- 微信小程序:微群人脉微信小程序源码下载全新社群系统优化版支持代理会员系统功能超高收益
- [untitled]
- Wechat applet: exclusive applet version of the whole network, independent wechat community contacts
- Daily question brushing record (13)
- 142. Circular linked list II
猜你喜欢

Take you ten days to easily complete the go micro service series (IX. link tracking)

【海浪建模3】三维随机真实海浪建模以及海浪发电机建模matlab仿真

Applet live + e-commerce, if you want to be a new retail e-commerce, use it!

Senior Test / development programmers write no bugs? Qualifications (shackles) don't be afraid of mistakes
![抓包整理外篇——————状态栏[ 四]](/img/88/8267ab92177788ac17ab665a90b781.png)
抓包整理外篇——————状态栏[ 四]

There is a new Post-00 exam king in the testing department. I really can't do it in my old age. I have

How to use words to describe breaking change in Spartacus UI of SAP e-commerce cloud

Detailed explanation of multi-mode input event distribution mechanism

微信小程序:星宿UI V1.5 wordpress系统资讯资源博客下载小程序微信QQ双端源码支持wordpress二级分类 加载动画优化

After reading the average code written by Microsoft God, I realized that I was still too young
随机推荐
Check if this is null - checking if this is null
Arbitrum:二维费用
What you learned in the eleventh week
Robley's global and Chinese markets 2022-2028: technology, participants, trends, market size and share Research Report
[FPGA tutorial case 10] design and implementation of complex multiplier based on Verilog
[untitled]
Great God developed the new H5 version of arXiv, saying goodbye to formula typography errors in one step, and mobile phones can also easily read literature
Hand drawn video website
Global and Chinese markets for stratospheric UAV payloads 2022-2028: Research Report on technology, participants, trends, market size and share
Database performance optimization tool
Database postragesq peer authentication
Async/await you can use it, but do you know how to deal with errors?
Expose testing outsourcing companies. You may have heard such a voice about outsourcing
19. Delete the penultimate node of the linked list
Yyds dry goods inventory kubernetes management business configuration methods? (08)
Basic operation of database and table ----- phased test II
小程序容器技术与物联网 IoT 可以碰撞出什么样的火花
BGP comprehensive experiment
Behind the cluster listing, to what extent is the Chinese restaurant chain "rolled"?
【大型电商项目开发】性能压测-性能监控-堆内存与垃圾回收-39