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

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

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

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

任务流程图

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

片段1

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

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

测试代码:

  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.     public function desEncrypt($str,$key) { 
  9.  
  10.         $iv = $key
  11.  
  12.         $data = openssl_encrypt($str,"DES-CBC",$key,OPENSSL_RAW_DATA,$iv); 
  13.  
  14.         $data = strtolower(bin2hex($data)); 
  15.  
  16.         return $data
  17.  
  18.     } 
  19.  
  20.    
  21.  
  22.     //要改的解密 
  23.  
  24.     public function desDecrypt($str,$key) { 
  25.  
  26.         $iv = $key
  27.  
  28.         return openssl_decrypt (hex2bin($str), 'DES-CBC'$key, OPENSSL_RAW_DATA,$iv); 
  29.  
  30.     } 
  31.  

测试代码

  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

分享到: