视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
php中加密解密DES的正确使用姿势
2020-11-03 18:21:10 责编:小采
文档


任务流程图

片段1

说干就干,我开始编写des加密类 代码如下

class DES
{
 var $key;
 var $iv; //偏移量
 
 function DES( $key, $iv=0 ) {
 //key长度8例如:1234abcd
 $this->key = $key;
 if( $iv == 0 ) {
 $this->iv = $key;
 } else {
 $this->iv = $iv; //mcrypt_create_iv ( mcrypt_get_block_size (MCRYPT_DES, MCRYPT_MODE_CBC), MCRYPT_DEV_RANDOM );
 }
 }
 
 function encrypt($str) {
 //加密,返回大写十六进制字符串
 $size = mcrypt_get_block_size ( MCRYPT_DES, MCRYPT_MODE_CBC );
 $str = $this->pkcs5Pad ( $str, $size );
 return strtoupper( bin2hex( mcrypt_cbc(MCRYPT_DES, $this->key, $str, MCRYPT_ENCRYPT, $this->iv ) ) );
 }
 
 function decrypt($str) {
 //解密
 $strBin = $this->hex2bin( strtolower( $str ) );
 $str = mcrypt_cbc( MCRYPT_DES, $this->key, $strBin, MCRYPT_DECRYPT, $this->iv );
 $str = $this->pkcs5Unpad( $str );
 return $str;
 }
 
 function hex2bin($hexData) {
 $binData = "";
 for($i = 0; $i < strlen ( $hexData ); $i += 2) {
 $binData .= chr ( hexdec ( substr ( $hexData, $i, 2 ) ) );
 }
 return $binData;
 }
 
 function pkcs5Pad($text, $blocksize) {
 $pad = $blocksize - (strlen ( $text ) % $blocksize);
 return $text . str_repeat ( chr ( $pad ), $pad );
 }
 
 function pkcs5Unpad($text) {
 $pad = ord ( $text {strlen ( $text ) - 1} );
 if ($pad > strlen ( $text ))
 return false;
 if (strspn ( $text, chr ( $pad ), strlen ( $text ) - $pad ) != $pad)
 return false;
 return substr ( $text, 0, - 1 * $pad );
 }
}

测试代码

<?php
header("Content-type: text/html; charset=utf-8");
error_reporting(0);
require "DES5.php";
// 秘钥
$key = 'MOxinrui';
$crypt = new DES5($key);
$str = 'podsmia';
echo "原字符是".$str.'<br>';
$encrypt_str = $crypt->encrypt($str);
echo "加密后的字符是".$encrypt_str.'<br>';
$decrypt_str= $crypt->decrypt($encrypt_str);
echo "解密后的字符是".$decrypt_str.'<br>';

效果

原字符是podsmia
加密后的字符是9490E136137FD8
解密后的字符是podsmia

过了几天,我闲着没事,继续运行一下代码

Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; DES5 has a deprecated constructor in D:phpstudy_proWWWdesDES5.php on line 2

原字符是podsmia

Fatal error: Uncaught Error: Call to undefined function mcrypt_get_block_size() in D:phpstudy_proWWWdesDES5.php:19 Stack trace: #0 D:phpstudy_proWWWdes1.php(10): DES5->encrypt('podsmia') #1 {main} thrown in D:phpstudy_proWWWdesDES5.php on line 19

给我报了 fatalerror 这不科学啊,我什么都没动啊。怎么回事呢。后面经过一番研究。发现是php版本的问题。我之前运行成功,那是因为我用的 是php5.5,但是这次报错我用的是php7.2.。那么我需要找替代方案。接下来看我操作

片段2

<?php
class DES7
{
 //要改的加密
 public function desEncrypt($str,$key) {
 $iv = $key;
 $data = openssl_encrypt($str,"DES-CBC",$key,OPENSSL_RAW_DATA,$iv);
 $data = strtolower(bin2hex($data));
 return $data;
 }
 
 //要改的解密
 public function desDecrypt($str,$key) {
 $iv = $key;
 return openssl_decrypt (hex2bin($str), 'DES-CBC', $key, OPENSSL_RAW_DATA,$iv);
 }
}

测试代码

<?php
header("Content-type: text/html; charset=utf-8");
//error_reporting(0);
// 秘钥
require "DES7.php";
$key = 'MOxinrui';
$crypt = new DES7($key);
$str = '问哪个';
echo "原字符是".$str.'<br>';
$encrypt_str = $crypt->desEncrypt($str,$key);
echo "加密后的字符是".$encrypt_str.'<br>';
$decrypt_str= $crypt->desDecrypt($encrypt_str,$key);
echo "解密后的字符是".$decrypt_str.'<br>';

效果

原字符是问哪个
加密后的字符是074b8beee21eefca7ec3a60cb8edda18
解密后的字符是问哪个

问题完美解决。大家以后遇到这种问题,直接照搬我的代码即可,方便省事。

更多PHP相关知识,请访问PHP教程!

下载本文
显示全文
专题