当前位置:首页 > PHP教程 > php应用 > 列表

php中加密解密DES的正确使用姿势

发布:smiling 来源: PHP粉丝网  添加日期:2022-05-23 09:26:55 浏览: 评论:0 

前言 :在平时的开发中,我们经常会对关键字符进行加密,可能为了安全 也可能为了规范,今天就将就DES加密正确使用。

任务流程图

php中加密解密DES的正确使用姿势

片段1

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

  1. class DES 
  2.  
  3. { 
  4.  
  5.     var $key; 
  6.  
  7.     var $iv; //偏移量 
  8.  
  9.    
  10.  
  11.     function DES( $key, $iv=0 ) { 
  12.  
  13.         //key长度8例如:1234abcd 
  14.  
  15.         $this->key = $key; 
  16.  
  17.         if( $iv == 0 ) { 
  18.  
  19.             $this->iv = $key; 
  20.  
  21.         } else { 
  22.  
  23.             $this->iv = $iv; //mcrypt_create_iv ( mcrypt_get_block_size (MCRYPT_DES, MCRYPT_MODE_CBC), MCRYPT_DEV_RANDOM ); 
  24.  
  25.         } 
  26.  
  27.     } 
  28.  
  29.    
  30.  
  31.     function encrypt($str) { 
  32.  
  33.         //加密,返回大写十六进制字符串 
  34.  
  35.         $size = mcrypt_get_block_size ( MCRYPT_DES, MCRYPT_MODE_CBC ); 
  36.  
  37.         $str = $this->pkcs5Pad ( $str, $size ); 
  38.  
  39.         return strtoupper( bin2hex( mcrypt_cbc(MCRYPT_DES, $this->key, $str, MCRYPT_ENCRYPT, $this->iv ) ) ); 
  40.  
  41.     } 
  42.  
  43.    
  44.  
  45.     function decrypt($str) { 
  46.  
  47.         //解密 
  48.  
  49.         $strBin = $this->hex2bin( strtolower( $str ) ); 
  50.  
  51.         $str = mcrypt_cbc( MCRYPT_DES, $this->key, $strBin, MCRYPT_DECRYPT, $this->iv ); 
  52.  
  53.         $str = $this->pkcs5Unpad( $str ); 
  54.  
  55.         return $str; 
  56.  
  57.     } 
  58.  
  59.    
  60.  
  61.     function hex2bin($hexData) { 
  62.  
  63.         $binData = ""; 
  64.  
  65.         for($i = 0; $i < strlen ( $hexData ); $i += 2) { 
  66.  
  67.             $binData .= chr ( hexdec ( substr ( $hexData, $i, 2 ) ) ); 
  68.  
  69.         } 
  70.  
  71.         return $binData; 
  72.  
  73.     } 
  74.  
  75.    
  76.  
  77.     function pkcs5Pad($text, $blocksize) { 
  78.  
  79.         $pad = $blocksize - (strlen ( $text ) % $blocksize); 
  80.  
  81.         return $text . str_repeat ( chr ( $pad ), $pad ); 
  82.  
  83.     } 
  84.  
  85.    
  86.  
  87.     function pkcs5Unpad($text) { 
  88.  
  89.         $pad = ord ( $text {strlen ( $text ) - 1} ); 
  90.  
  91.         if ($pad > strlen ( $text )) 
  92.  
  93.             return false; 
  94.  
  95.         if (strspn ( $text, chr ( $pad ), strlen ( $text ) - $pad ) != $pad) 
  96.  
  97.             return false; 
  98.  
  99.         return substr ( $text, 0, - 1 * $pad ); 
  100.  
  101.     } 
  102.  
  103. } 

测试代码:

  1. <?php 
  2.  
  3. header("Content-type: text/html; charset=utf-8"); 
  4.  
  5. error_reporting(0); 
  6.  
  7. require "DES5.php"; 
  8.  
  9. // 秘钥 
  10.  
  11. $key = 'MOxinrui'; 
  12.  
  13. $crypt = new DES5($key); 
  14.  
  15. $str = 'podsmia'; 
  16.  
  17. echo "原字符是".$str.'<br>'; 
  18.  
  19. $encrypt_str = $crypt->encrypt($str); 
  20.  
  21. echo "加密后的字符是".$encrypt_str.'<br>'; 
  22.  
  23. $decrypt_str= $crypt->decrypt($encrypt_str); 
  24.  
  25. echo "解密后的字符是".$decrypt_str.'<br>'; 

效果

原字符是podsmia

加密后的字符是9490E64136137FD8

解密后的字符是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_pro\WWW\des\DES5.php on line 2

原字符是podsmia

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

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

片段2

  1. <?php 
  2.  
  3. class DES7 
  4.  
  5. { 
  6.  
  7.     //要改的加密 
  8.  
  9.     public function desEncrypt($str,$key) { 
  10.  
  11.         $iv = $key; 
  12.  
  13.         $data = openssl_encrypt($str,"DES-CBC",$key,OPENSSL_RAW_DATA,$iv); 
  14.  
  15.         $data = strtolower(bin2hex($data)); 
  16.  
  17.         return $data; 
  18.  
  19.     } 
  20.  
  21.    
  22.  
  23.     //要改的解密 
  24.  
  25.     public function desDecrypt($str,$key) { 
  26.  
  27.         $iv = $key; 
  28.  
  29.         return openssl_decrypt (hex2bin($str), 'DES-CBC', $key, OPENSSL_RAW_DATA,$iv); 
  30.  
  31.     } 
  32.  
  33. } 

测试代码

  1. <?php 
  2.  
  3. header("Content-type: text/html; charset=utf-8"); 
  4.  
  5. //error_reporting(0); 
  6.  
  7. // 秘钥 
  8.  
  9. require "DES7.php"; 
  10.  
  11. $key = 'MOxinrui'; 
  12.  
  13. $crypt = new DES7($key); 
  14.  
  15. $str = '问哪个'; 
  16.  
  17. echo "原字符是".$str.'<br>'; 
  18.  
  19. $encrypt_str = $crypt->desEncrypt($str,$key); 
  20.  
  21. echo "加密后的字符是".$encrypt_str.'<br>'; 
  22.  
  23. $decrypt_str= $crypt->desDecrypt($encrypt_str,$key); 
  24.  
  25. echo "解密后的字符是".$decrypt_str.'<br>'; 

效果

原字符是问哪个

加密后的字符是074b8beee21eefca7ec3a60cb8edda18

解密后的字符是问哪个

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

Tags: php加密解密 DES

分享到: