当前位置:网站首页>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
边栏推荐
- 26.2 billion! These universities in Guangdong Province have received heavy support
- [Chongqing Guangdong education] National Open University spring 2019 1042 international economic law reference questions
- Nebula Importer 数据导入实践
- Yyds dry goods inventory kubernetes management business configuration methods? (08)
- Basic operation of database and table ----- phased test II
- 当产业互联网时代真正发展完善之后,将会在每一个场景见证巨头的诞生
- Applet live + e-commerce, if you want to be a new retail e-commerce, use it!
- Maximum number of "balloons"
- LeetCode周赛 + AcWing周赛(T4/T3)分析对比
- 微信小程序:独立后台带分销功能月老办事处交友盲盒
猜你喜欢
Game 280 of leetcode week
There is a new Post-00 exam king in the testing department. I really can't do it in my old age. I have
[development of large e-commerce projects] performance pressure test - Optimization - impact of middleware on performance -40
Roads and routes -- dfs+topsort+dijkstra+ mapping
ROS command line tool
Innovation leads the direction. Huawei Smart Life launches new products in the whole scene
dotnet-exec 0.6.0 released
SAP UI5 应用的主-从-从(Master-Detail-Detail)布局模式的实现步骤
【CTF】AWDP总结(Web)
Main window in QT application
随机推荐
Heartless sword English translation of Xi Murong's youth without complaint
Compare whether two lists are equal
There is a new Post-00 exam king in the testing department. I really can't do it in my old age. I have
Poap: the adoption entrance of NFT?
微信小程序:星宿UI V1.5 wordpress系统资讯资源博客下载小程序微信QQ双端源码支持wordpress二级分类 加载动画优化
Take you ten days to easily complete the go micro service series (IX. link tracking)
Analysis and comparison of leetcode weekly race + acwing weekly race (t4/t3)
C语音常用的位运算技巧
Maximum number of "balloons"
College degree, what about 33 year old Baoma? I still sell and test, and my monthly income is 13K+
Pandora IOT development board learning (RT thread) - Experiment 4 buzzer + motor experiment [key external interrupt] (learning notes)
微信小程序:全新独立后台月老办事处一元交友盲盒
Check if this is null - checking if this is null
Database postragesq role membership
Redis(1)之Redis简介
Talking about JVM 4: class loading mechanism
SAP ui5 application development tutorial 107 - trial version of SAP ui5 overflow toolbar container control introduction
Intel sapphire rapids SP Zhiqiang es processor cache memory split exposure
19. Delete the penultimate node of the linked list
Detailed explanation of multi-mode input event distribution mechanism