当前位置:网站首页>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
边栏推荐
- SAP ui5 application development tutorial 106 - how to improve the readability of SAP ui5 application routing URL trial version
- 抓包整理外篇——————状态栏[ 四]
- [FPGA tutorial case 9] design and implementation of clock manager based on vivado core
- [Chongqing Guangdong education] National Open University spring 2019 1042 international economic law reference questions
- SAP UI5 应用的主-从-从(Master-Detail-Detail)布局模式的实现步骤
- Behind the cluster listing, to what extent is the Chinese restaurant chain "rolled"?
- How to safely eat apples on the edge of a cliff? Deepmind & openai gives the answer of 3D security reinforcement learning
- What happened to those who focused on automated testing?
- Redis master-slave replication cluster and recovery ideas for abnormal data loss # yyds dry goods inventory #
- Wechat applet: Xingxiu UI v1.5 WordPress system information resources blog download applet wechat QQ dual end source code support WordPress secondary classification loading animation optimization
猜你喜欢

Actual combat simulation │ JWT login authentication

College degree, what about 33 year old Baoma? I still sell and test, and my monthly income is 13K+

微信小程序:最新wordpress黑金壁纸微信小程序 二开修复版源码下载支持流量主收益
![[pure tone hearing test] pure tone hearing test system based on MATLAB](/img/1c/62ed6b3eb27a4dff976c4a2700a850.png)
[pure tone hearing test] pure tone hearing test system based on MATLAB

What you learned in the eleventh week

Expansion operator: the family is so separated

Wechat applet: new independent backstage Yuelao office one yuan dating blind box

Roads and routes -- dfs+topsort+dijkstra+ mapping
![[wave modeling 1] theoretical analysis and MATLAB simulation of wave modeling](/img/c4/46663f64b97e7b25d7222de7025f59.png)
[wave modeling 1] theoretical analysis and MATLAB simulation of wave modeling

Delaying wages to force people to leave, and the layoffs of small Internet companies are a little too much!
随机推荐
Database postragesq BSD authentication
Analysis and comparison of leetcode weekly race + acwing weekly race (t4/t3)
Talking about JVM 4: class loading mechanism
[wave modeling 2] three dimensional wave modeling and wave generator modeling matlab simulation
Yyds dry goods inventory [Gan Di's one week summary: the most complete and detailed in the whole network]; detailed explanation of MySQL index data structure and index optimization; remember collectio
微信小程序;胡言乱语生成器
Expansion operator: the family is so separated
DOM basic syntax
Global and Chinese market of nutrient analyzer 2022-2028: Research Report on technology, participants, trends, market size and share
视频网站手绘
Global and Chinese markets of emergency rescue vessels (errv) 2022-2028: Research Report on technology, participants, trends, market size and share
[development of large e-commerce projects] performance pressure test - Optimization - impact of middleware on performance -40
[FPGA tutorial case 10] design and implementation of complex multiplier based on Verilog
無心劍英譯席慕容《無怨的青春》
MySQL REGEXP:正则表达式查询
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
Maximum number of "balloons"
Intel sapphire rapids SP Zhiqiang es processor cache memory split exposure
抓包整理外篇——————状态栏[ 四]
[FPGA tutorial case 9] design and implementation of clock manager based on vivado core