当前位置:网站首页>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
边栏推荐
- Introduction to the gtid mode of MySQL master-slave replication
- Main window in QT application
- Wechat applet: independent background with distribution function, Yuelao office blind box for making friends
- Database postragesql lock management
- 各大主流编程语言性能PK,结果出乎意料
- Global and Chinese markets for stratospheric UAV payloads 2022-2028: Research Report on technology, participants, trends, market size and share
- 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
- [FPGA tutorial case 9] design and implementation of clock manager based on vivado core
- When the industrial Internet era is truly developed and improved, it will witness the birth of giants in every scene
- 【大型电商项目开发】性能压测-优化-中间件对性能的影响-40
猜你喜欢
Blue Bridge Cup Square filling (DFS backtracking)
[development of large e-commerce projects] performance pressure test - Performance Monitoring - heap memory and garbage collection -39
26.2 billion! These universities in Guangdong Province have received heavy support
Express routing, express middleware, using express write interface
What happened to those who focused on automated testing?
To sort out messy header files, I use include what you use
Basic operation of database and table ----- the concept of index
Arbitrum:二维费用
资深测试/开发程序员写下无bug?资历(枷锁)不要惧怕错误......
Postman automatically fills headers
随机推荐
Basic operations of database and table ----- delete index
[FPGA tutorial case 9] design and implementation of clock manager based on vivado core
ROS command line tool
Delaying wages to force people to leave, and the layoffs of small Internet companies are a little too much!
Introduction to the gtid mode of MySQL master-slave replication
增量备份 ?db full
College degree, what about 33 year old Baoma? I still sell and test, and my monthly income is 13K+
多模输入事件分发机制详解
【LeetCode】88. Merge two ordered arrays
无心剑英译席慕容《无怨的青春》
node工程中package.json文件作用是什么?里面的^尖括号和~波浪号是什么意思?
[microprocessor] VHDL development of microprocessor based on FPGA
【海浪建模1】海浪建模的理论分析和matlab仿真
[pure tone hearing test] pure tone hearing test system based on MATLAB
PHP wechat official account development
Inventory of more than 17 typical security incidents in January 2022
PHP 约瑟夫环问题
Senior Test / development programmers write no bugs? Qualifications (shackles) don't be afraid of mistakes
Wechat applet: exclusive applet version of the whole network, independent wechat community contacts
[wave modeling 3] three dimensional random real wave modeling and wave generator modeling matlab simulation