当前位置:网站首页>PHP Basics - detailed explanation of DES encryption and decryption in PHP
PHP Basics - detailed explanation of DES encryption and decryption in PHP
2022-07-05 01:25:00 【Wild young man】
One 、 brief introduction
DES It's a common symmetric encryption , Its full name is Data Encryption Standard, Data encryption standard , Is a block algorithm using key encryption . The key length is 64 position (bit), Over digit key ignored . The so-called symmetric encryption means that the encryption and decryption keys are the same , Symmetric encryption generally follows a fixed length , Divide the string to be encrypted into blocks , Less than a whole block or at the end of which there are special padding characters .
Cross language DES Encryption and decryption often have problems , Often the filling method is wrong 、 The coding is inconsistent or the encryption and decryption mode is not corresponding .
- Fill mode :pkcs5、pkcs7、iso10126、ansix923、zero.
- Encryption mode :DES-ECB、DES-CBC、DES-CTR、DES-OFB、DES-CFB.
- The output type : No code ,base64 code ,hex code .
As a software developer , It can be tested by tools DES Encryption and decryption , Here's an online tool :http://tool.chacuo.net/cryptdes
Two 、 Realization
PHP Provides Mcrypt A series of functions to implement DES Encryption and decryption of , But the functions in this extension have been abandoned in succession , since PHP 7.2.0 rise , Will move to PECL.
So this code uses a more general OPENSSL How to achieve DES Encryption and decryption of , The specific implementation and use code are as follows :
<?php
/**
* Created by PhpStorm.
* Title:DES Encryption and decryption class
* 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 Encryption and decryption methods , It can be done by openssl_get_cipher_methods() get
*/
protected $method;
/**
* @var string $key Encryption and decryption key
*/
protected $key;
/**
* @var string $output Output format nothing 、base64、hex
*/
protected $output;
/**
* @var string $iv Decrypted vector
*/
protected $iv;
/**
* @var string $options
*/
protected $options;
/**
* DES constructor.
* @param string $key
* @param string $method
* ECB: DES-ECB、DES-EDE3 ( by ECB Mode time ,$iv If it is empty, you can )
* 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;
}
/**
* encryption
*
* @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;
}
/**
* fill
*
* @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);
}
/**
* Decrypt
*
* @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;
}
/**
* To fill in
*
* @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);
}
}
Class call
$key = 'key123456';
$iv = 'iv123456';
// DES CBC encryption
$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 encryption
$des = new DES($key, 'DES-ECB', DES::OUTPUT_HEX);
echo $base64Sign = $des->encrypt('Hello DES ECB');
echo "\n";
echo $des->decrypt($base64Sign);3、 ... and 、 Related links
1.DES Encryption and decryption tools : http://tool.chacuo.net/cryptdes
Mcrypt Official documents : http://php.net/manual/zh/book.mcrypt.php
OPENSSL Official document of encryption and decryption function :
openssl_encrypt: http://php.net/manual/zh/function.openssl-encrypt.php
openssl_decrypt: http://php.net/manual/zh/function.openssl-decrypt.php
边栏推荐
- After reading the average code written by Microsoft God, I realized that I was still too young
- Redis(1)之Redis简介
- 107. Some details of SAP ui5 overflow toolbar container control and resize event processing
- Express routing, express middleware, using express write interface
- Global and Chinese market of network connected IC card smart water meters 2022-2028: Research Report on technology, participants, trends, market size and share
- Database postragesq PAM authentication
- SAP ui5 application development tutorial 107 - trial version of SAP ui5 overflow toolbar container control introduction
- How to use words to describe breaking change in Spartacus UI of SAP e-commerce cloud
- Armv8-a programming guide MMU (3)
- DOM basic syntax
猜你喜欢

Actual combat simulation │ JWT login authentication

Senior Test / development programmers write no bugs? Qualifications (shackles) don't be afraid of mistakes

phpstrom设置函数注释说明

Analysis and comparison of leetcode weekly race + acwing weekly race (t4/t3)

Basic operation of database and table ----- phased test II

【海浪建模1】海浪建模的理论分析和matlab仿真

潘多拉 IOT 开发板学习(RT-Thread)—— 实验4 蜂鸣器+马达实验【按键外部中断】(学习笔记)

Nebula importer data import practice

I was beaten by the interviewer because I didn't understand the sorting

How to use words to describe breaking change in Spartacus UI of SAP e-commerce cloud
随机推荐
Arbitrum: two-dimensional cost
Package What is the function of JSON file? What do the inside ^ angle brackets and ~ tilde mean?
What happened to those who focused on automated testing?
What you learned in the eleventh week
Hand drawn video website
Query for Boolean field as "not true" (e.g. either false or non-existent)
Playwright之录制
Basic operation of database and table ----- phased test II
潘多拉 IOT 开发板学习(RT-Thread)—— 实验4 蜂鸣器+马达实验【按键外部中断】(学习笔记)
107. SAP UI5 OverflowToolbar 容器控件以及 resize 事件处理的一些细节介绍
Introduction to the gtid mode of MySQL master-slave replication
What is the current situation and Prospect of the software testing industry in 2022?
Maximum number of "balloons"
How to safely eat apples on the edge of a cliff? Deepmind & openai gives the answer of 3D security reinforcement learning
Innovation leads the direction. Huawei Smart Life launches new products in the whole scene
微信小程序:最新wordpress黑金壁纸微信小程序 二开修复版源码下载支持流量主收益
Daily question brushing record (13)
Poap: the adoption entrance of NFT?
Wechat applet: the latest WordPress black gold wallpaper wechat applet two open repair version source code download support traffic main revenue
Introduction to the gtid mode of MySQL master-slave replication