当前位置:网站首页>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
边栏推荐
- Database postragesq BSD authentication
- Database postragesql lock management
- 【微处理器】基于FPGA的微处理器VHDL开发
- [wave modeling 1] theoretical analysis and MATLAB simulation of wave modeling
- Analysis and comparison of leetcode weekly race + acwing weekly race (t4/t3)
- Wechat applet: wechat applet source code download new community system optimized version support agent member system function super high income
- 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
- 小程序容器技术与物联网 IoT 可以碰撞出什么样的火花
- 微信小程序:微群人脉微信小程序源码下载全新社群系统优化版支持代理会员系统功能超高收益
- Game 280 of leetcode week
猜你喜欢
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
Nebula Importer 数据导入实践
Game 280 of leetcode week
Four pits in reentrantlock!
Roads and routes -- dfs+topsort+dijkstra+ mapping
Yyds dry goods inventory kubernetes management business configuration methods? (08)
Basic operation of database and table ----- the concept of index
Database performance optimization tool
Actual combat simulation │ JWT login authentication
Chia Tai International Futures: what is the master account and how to open it?
随机推荐
JS implementation determines whether the point is within the polygon range
Redis(1)之Redis简介
Basic operations of database and table ----- create index
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
C语音常用的位运算技巧
Take you ten days to easily complete the go micro service series (IX. link tracking)
Query for Boolean field as "not true" (e.g. either false or non-existent)
[wave modeling 3] three dimensional random real wave modeling and wave generator modeling matlab simulation
The performance of major mainstream programming languages is PK, and the results are unexpected
Behind the cluster listing, to what extent is the Chinese restaurant chain "rolled"?
Global and Chinese market of veterinary thermometers 2022-2028: Research Report on technology, participants, trends, market size and share
微信小程序;胡言乱语生成器
To sort out messy header files, I use include what you use
Pycharm professional download and installation tutorial
Arbitrum: two-dimensional cost
Poap: the adoption entrance of NFT?
The server time zone value ‘� й ��� ʱ 'is unrecognized or representatives more than one time zone【
Database performance optimization tool
A simple SSO unified login design